HDU6059(01字典树求异或最大值)
2017-08-05 09:59
447 查看
题意:求a中三个数ai,aj,ak,ai⊕aj<aj⊕ak(i<j<k)
这里要动态维护字典树,每当输入一个数,就更新一下字典树。最后减去i>j的情况(这里最难懂),搞了好久,算是会了,手撕代码时问题百出,还是没有学到骨子里,留下以后在复习。
参看了两位大佬的博客:
大佬博客
小老博客
这里要动态维护字典树,每当输入一个数,就更新一下字典树。最后减去i>j的情况(这里最难懂),搞了好久,算是会了,手撕代码时问题百出,还是没有学到骨子里,留下以后在复习。
参看了两位大佬的博客:
大佬博客
小老博客
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<iostream> #include<string> #include <set> using namespace std; #define ll long long #define mem(a) memset(a,0,sizeof(a)) const int eps=1e-8; const int maxn=5e7+5;//须填写 const int inf=0x3f3f3f3f; struct node { int nxt[2];//0/1树的连个节点 ll sum[2];//sum表示在这个数的前面有多少个数的前t-1位与这个数的前t-1位是不同的 int v;//v表示此处经过了多少次 void init() { sum[0]=sum[1]=0; nxt[0]=nxt[1]=-1; v=0; } }L[maxn]; int tot; ll ans,cnt[32][2]; void add(int a[],int len) { int now=0; int tmp;//当前为k的0/1值 for(int i=len-1;i>=0;i--) { tmp=a[i]; if(L[now].nxt[tmp]==-1)//如果没有访问过,向下走,然后初始化下边 { L[++tot].init();//初始化 L[now].nxt[tmp]=tot;//记录所有接的的序号 } if(L[now].nxt[tmp^1]!=-1)//如果和k本位不同的数则进行计算 { ans+=(L[L[now].nxt[tmp^1]].v*(L[L[now].nxt[tmp^1]].v-1))/2;//如果i,j本位都与k不同,则任意从中选两个,C(v,2)中选两个 ans+=(L[L[now].nxt[tmp^1]].v*(cnt[i][tmp^1]-L[L[now].nxt[tmp^1]].v)-L[now].sum[tmp^1]);//这里还不是很懂 //求的是如果本位i与j都与k不同的所有情况减去之间标记过j>i的情况,这里好绕 } L[now].sum[tmp]+=cnt[i][tmp]-L[L[now].nxt[tmp]].v;//把此处的k当做i处理,寻找不符合要求的j,并记录留用 cnt[i][tmp]++; now=L[now].nxt[tmp]; L[now].v++; } } int a[500010]; int b[40]; int main() { int kase; scanf("%d",&kase); while(kase--) { mem(a); mem(b); int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); mem(cnt); tot=ans=0; L[0].init();//此处一定要初始化这里 for(int i=1;i<=n;i++) { for(int j=0;j<30;j++)//将a中的每个数分解存入b { b[j]=a[i]>>j&1; } add(b,30); } cout<<ans<<endl; } return 0; }
相关文章推荐
- COJ 1216: 异或最大值(01字典树)
- CSU-1216: 异或最大值-trie-01字典树
- [01字典树]求序列完美度(求区间最大异或值)
- Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset(01字典树求最大异或值)
- HDU 5536 Chip Factory(01字典树找最大异或值)——2015ACM/ICPC亚洲区长春站
- Chip Factory---hdu5536(异或值最大,01字典树)
- 【求两个数异或的最大值】01字典树求解
- 异或最大值(01字典树)
- hdu 4825 Xor Sum(01字典树求最大异或值)
- 使用01字典树解决最大异或问题
- CSUOJ 1216 异或最大值 (01Trie)
- 可持久化01Trie树【p4735(bzoj3261)】最大异或和
- BZOJ 3261: 最大异或和 可持久化字典树
- HDU 5536 Chip Factory (字典树——序列中查找最大异或和)
- HDU4825 Xor Sum 0-1字典树 最大异或和
- NEFU 1270 智力异或(2)|| 2017icpc青岛站 热身赛 C (01字典树)
- CSU 1216: 异或最大值(字典树+贪心)
- 01 字典树模板 求XOR最大值
- CSU 1216 异或最大值【字典树】
- hdu4825-01字典树&&贪心&&经典&&异或最大-Xor Sum