[Codeforces 979 D. Kuro and GCD and XOR and SUM](http://codeforces.com/problemset/problem/979/D)
题目大意:有两种操作:①给一个数v,加入数组a中②给出三个数x,k,s;从当前数组a中找出一个数u满足 u与x的gcd可以被k整除,u不大于s-x,且与x的异或和最大。
思路:之前没有碰到过异或和最值的问题,所以是懵逼的。学习了01字典树后把这题补出来。
碰到操作①就上树,上树过程中注意不断维护每个节点往后路径中的最小值(具体见代码细节);
碰到操作②,如果k==1,那么从树上找数的同时注意限制条件最小值不超过s-x;如果k>1,那么直接枚举找最值。
```C++
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1e5+10;
bool a[maxn];
struct Trie_01
{
static const int N = 32*maxn , M = 2;
int node[N][M],value[N],rt,L;
void init()
{
fill_n(node[N-1],M,0);
fill_n(value,N,INT_MAX);
L = 0;
rt = newnode();
}
int newnode()
{
fill_n(node[L],M,0);
return L++;
}
void add(int x)
{
int p = rt;
value[p]=min(value[p],x);
for (int i=31;i>=0;--i)
{
int idx = (x>>i)&1;
if (!node[p][idx])
{
node[p][idx] = newnode();
}
p = node[p][idx];
value[p]=min(value[p],x);
}
}
int query(int x,int bound)
{
int p = rt;
if (value[p]>bound)
return -1;
for (int i=31;i>=0;--i)
{
int idx = (x>>i)&1;
if (node[p][idx^1]&&value[node[p][idx^1]]>n;
tree.init();
for (i=0;imx)
{
mx=j^x;
ans=j;
}
}
cout

最新文章

  1. http
  2. oracle中时间处理
  3. c#隐藏和重写基类方法的异同
  4. 关于HTML标签(元素)的那些事?
  5. 【WPF】无边框窗体
  6. HTTP Status 404–/webDemo/hello
  7. poj 1753 Flip Game
  8. CSS笔记---文字两边对齐
  9. 支持Python 2.7的pylot
  10. Android开发笔记:安卓程序截屏方法
  11. 【LeetCode】332. Reconstruct Itinerary
  12. Android studio 安装的安装一些问题
  13. bzoj2243[SDOI2011]染色 树链剖分+线段树
  14. 基于IPV6数据包的分析(GNS3)
  15. LLDB 3.9.1 安装方法
  16. Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 1)
  17. Quartz入门例子简介 从入门到菜鸟(一)
  18. Linux之Vim学习
  19. springboot工程pom的两种配置方式
  20. 【面试】iOS 开发面试题(二)

热门文章

  1. redis 学习(20)-- 常见的持久化开发与运维问题
  2. 【web性能优化】当用户输入网址后发生了什么?
  3. js跳转页面与打开新窗口的方法
  4. MYSQL 修改语句(数据)
  5. MySQL 5.7.18 zip版本的安装使用方法
  6. mysql中取出的时间日期多个.0
  7. xtrabackup备份恢复过程
  8. springboot项目logback.xml或者logback-spring.xml中读取不到application.yml或application.properties配置文件中的配置解决办法
  9. iptables实现内外网端口映射及转发上网
  10. 内核模式构造-Semaphore构造(WaitLock)