【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
4103: [Thu Summer Camp 2015]异或运算
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 474 Solved: 258Description
给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij。
Input
第一行包含两个正整数n,m,分别表示两个数列的长度
第二行包含n个非负整数xi第三行包含m个非负整数yj第四行包含一个正整数p,表示询问次数随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含义如题意所述。Output
共p行,每行包含一个非负整数,表示此次询问的答案。
Sample Input
3 3
1 2 4
7 6 5
3
1 2 1 2 2
1 2 1 3 4
2 3 2 3 4Sample Output
6
5
1HINT
对于100%的数据,0<=Xi,Yj<2^31,
1<=u<=d<=n<=1000,1<=l<=r<=m<=300000,1<=k<=(d-u+1)*(r-l+1),1<=p<=500Source
鸣谢佚名上传
【分析】
要膜一膜Po姐:
好了,这个是。。。异或运算。每一位的运算都和下一位无关的。
当n=1,你只要根据m个数建一个可持久化TRIE。然后询问的时候就试着填1看看足不足k什么的。
跟平时不一样的是,现在你是手上拿着个a1之后询问的,你只要每次看一看a1这一位是什么,然后判断填1还是0,如果a1这一位是1就要0、1互换一下嘛。。
然后n不等于1,其实也很小,相当于1000个TRIE?当然是不用建1000个TRIE的【你也建不了吧?
只是你现在手上拿着1000个ai,一起询问什么的。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Maxn 1010 8 #define Maxm 300010 9 #define Maxd 30 10 11 int a[Maxn]; 12 13 int rt[Maxm],tot=0; 14 struct node {int lc,rc,cnt;}tr[Maxm*32]; 15 16 void add(int id,int x) 17 { 18 rt[id]=++tot;int y=rt[id-1]; 19 int nw=rt[id]; 20 for(int i=Maxd;i>=0;i--) 21 { 22 int ind=x>>i;x&=(1<<i)-1; 23 if(!ind) 24 { 25 tr[nw].lc=++tot; 26 tr[tot].cnt=tr[tr[y].lc].cnt+1; 27 tr[nw].rc=tr[y].rc; 28 nw=tr[nw].lc;y=tr[y].lc; 29 } 30 else 31 { 32 tr[nw].rc=++tot; 33 tr[tot].cnt=tr[tr[y].rc].cnt+1; 34 tr[nw].lc=tr[y].lc; 35 nw=tr[nw].rc;y=tr[y].rc; 36 } 37 } 38 } 39 40 int nl[Maxn],nr[Maxn]; 41 int query(int ll,int rr,int l,int r,int k) 42 { 43 int ans=0; 44 // l=rt[l-1];r=rt[r]; 45 for(int i=ll;i<=rr;i++) nl[i]=rt[l-1],nr[i]=rt[r]; 46 for(int i=Maxd;i>=0;i--) 47 { 48 int x=0; 49 for(int j=ll;j<=rr;j++) 50 { 51 int y=a[j]&(1<<i);y>>=i; 52 if(y==0) x+=tr[tr[nr[j]].lc].cnt-tr[tr[nl[j]].lc].cnt; 53 else x+=tr[tr[nr[j]].rc].cnt-tr[tr[nl[j]].rc].cnt; 54 } 55 if(x>=k) 56 { 57 l=tr[l].lc;r=tr[r].lc; 58 for(int j=ll;j<=rr;j++) 59 { 60 int y=a[j]&(1<<i);y>>=i; 61 if(y==0) nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc; 62 else nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc; 63 } 64 } 65 else 66 { 67 k-=x; 68 ans|=1<<i; 69 for(int j=ll;j<=rr;j++) 70 { 71 int y=a[j]&(1<<i);y>>=i; 72 if(y==0) nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc; 73 else nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc; 74 } 75 } 76 } 77 return ans; 78 } 79 80 int main() 81 { 82 int n,m; 83 scanf("%d%d",&n,&m); 84 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 85 for(int j=1;j<=m;j++) 86 { 87 int b; 88 scanf("%d",&b); 89 add(j,b); 90 } 91 int q; 92 scanf("%d",&q); 93 for(int i=1;i<=q;i++) 94 { 95 int ll,rr,l,r,k; 96 scanf("%d%d%d%d%d",&ll,&rr,&l,&r,&k); 97 k=(rr-ll+1)*(r-l+1)-k+1; 98 printf("%d\n",query(ll,rr,l,r,k)); 99 } 100 return 0; 101 }
View Code
最近已经RE至死。。。
数组开少了2。。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Maxn 1010 8 #define Maxm 300010 9 #define Maxd 30 10 11 int a[Maxn]; 12 13 int rt[Maxm],tot=0; 14 struct node {int lc,rc,cnt;}tr[Maxm*32]; 15 16 void add(int id,int x) 17 { 18 rt[id]=++tot;int y=rt[id-1]; 19 int nw=rt[id]; 20 for(int i=Maxd;i>=0;i--) 21 { 22 int ind=x>>i;x&=(1<<i)-1; 23 if(!ind) 24 { 25 tr[nw].lc=++tot; 26 tr[tot].cnt=tr[tr[y].lc].cnt+1; 27 tr[nw].rc=tr[y].rc; 28 nw=tr[nw].lc;y=tr[y].lc; 29 } 30 else 31 { 32 tr[nw].rc=++tot; 33 tr[tot].cnt=tr[tr[y].rc].cnt+1; 34 tr[nw].lc=tr[y].lc; 35 nw=tr[nw].rc;y=tr[y].rc; 36 } 37 } 38 } 39 40 int nl[Maxn],nr[Maxn]; 41 int query(int ll,int rr,int l,int r,int k) 42 { 43 int ans=0; 44 // l=rt[l-1];r=rt[r]; 45 for(int i=ll;i<=rr;i++) nl[i]=rt[l-1],nr[i]=rt[r]; 46 for(int i=Maxd;i>=0;i--) 47 { 48 int x=0; 49 for(int j=ll;j<=rr;j++) 50 { 51 int y=a[j]&(1<<i);y>>=i; 52 if(y==0) x+=tr[tr[nr[j]].lc].cnt-tr[tr[nl[j]].lc].cnt; 53 else x+=tr[tr[nr[j]].rc].cnt-tr[tr[nl[j]].rc].cnt; 54 } 55 if(x>=k) 56 { 57 l=tr[l].lc;r=tr[r].lc; 58 for(int j=ll;j<=rr;j++) 59 { 60 int y=a[j]&(1<<i);y>>=i; 61 if(y==0) nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc; 62 else nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc; 63 } 64 } 65 else 66 { 67 k-=x; 68 ans|=1<<i; 69 for(int j=ll;j<=rr;j++) 70 { 71 int y=a[j]&(1<<i);y>>=i; 72 if(y==0) nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc; 73 else nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc; 74 } 75 } 76 } 77 return ans; 78 } 79 80 int main() 81 { 82 int n,m; 83 scanf("%d%d",&n,&m); 84 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 85 for(int j=1;j<=m;j++) 86 { 87 int b; 88 scanf("%d",&b); 89 add(j,b); 90 } 91 int q; 92 scanf("%d",&q); 93 for(int i=1;i<=q;i++) 94 { 95 int ll,rr,l,r,k; 96 scanf("%d%d%d%d%d",&ll,&rr,&l,&r,&k); 97 k=(rr-ll+1)*(r-l+1)-k+1; 98 printf("%d\n",query(ll,rr,l,r,k)); 99 } 100 return 0; 101 }
View Code
2017-04-08 14:47:45
转载于:https://www.cnblogs.com/Konjakmoyu/p/6681856.html
【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)相关推荐
- 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
我们观察数据:树套树 PASS 主席树 PASS 一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...
- BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...
- BZOJ 3261: 最大异或和 [可持久化Trie]
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1513 Solved: 657 [Submit][Status][Disc ...
- BZOJ.3261.最大异或和(可持久化Trie)
题目链接 这个每次修改后缀好像很难搞,但是因为异或可以抵消,求sum[p~n]的最大值可以转化为求sum[1~n] xor sum[1~p-1]的最大值. \(p-1\in [l-1,r-1]\),用 ...
- 【bzoj3261】最大异或和 可持久化Trie树
题目描述 给定一个非负整数序列 {a},初始长度为 N. 有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- P4592 [TJOI2018]异或 (可持久化Trie)
[题目链接] https://www.luogu.org/problemnew/show/P4592 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\ ...
- P4735 最大异或和 可持久化trie树
可持久化01trie类似主席树思想 但是不支持版本差(也可以加一个siz 做差) 只能再维护一个左端点的最大值即可 #include<bits/stdc++.h> using ...
最新文章
- 谷歌邮箱上不了的情况下怎么登录谷歌邮箱
- No identifier specified for entity
- ETL数据处理后的业务分析(一)
- $_FILE函数总结
- centos下redis安全相关
- Android7.1取消wifi图标叉号
- bzoj 4052: [Cerc2013]Magical GCD
- Windows Server 2012 搭建DHCP及远程路由访问
- Spring5全面详解
- 第三次个人作业—“K米”评测
- vue抽屉_vue 自定义抽屉组件 仿 iview
- WebScoket 实例 简单的网页聊天室
- 关于Github项目DCRNN运行问题小结(1)——tables模块包
- xmmi - 晨星半导体公司MSTAR平台
- 计算机网络 - 网络中的基本概念
- uniapp 多语言版本demo in18
- 祝贺|蚂蚁金服技术人许寄入选2018 MIT TR 35全球榜单
- U盘中的数据被格式化了怎么恢复?原来数据恢复也很简单
- 咸鱼硬件—Micropython快速指南
- 快手2020校园招聘秋招笔试--工程A试卷
热门文章
- UVALive 4329 Ping pong
- VC++即时通讯+视频会议源码
- Persistence4j 1.1发布,Java ORM框架
- 新星云集!CVPR 论文分享会圆桌论坛:计算机视觉科研​之“路”
- 吞吐性能翻倍!搭载了第三代Tensor Core的A100是怎么做到的?
- CVPR 2019 论文大盘点-目标跟踪篇
- 太棒了!8 个流行的 Python 可视化工具包,你喜欢哪个?
- Tracking 的SimTrack 以及 4D seg
- Python数据分析模块 | pandas做数据分析(二):常用预处理操作
- 计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测