博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解题:国家集训队 Middle
阅读量:5037 次
发布时间:2019-06-12

本文共 2422 字,大约阅读时间需要 8 分钟。

求中位数的套路:二分,大于等于的设为1,小于的设为-1

于是可以从小到大排序后依次加入可持久化线段树,这样每次只会变化一个位置

那左右端点是区间怎么办?

先把中间的算上,然后维护每个区间左右两侧最大子段和,左右和右左拼起来即可

1 #include
2 #include
3 #include
4 using namespace std; 5 const int N=20005,M=1e7+70,inf=1e9; 6 int num[N],root[N],son[M][2],sum[M],lsum[M],rsum[M],qry[10]; 7 int n,m,t1,t2,t3,t4,rd,tot,ans; pair
mem[N]; 8 void Pushup(int nde) 9 { 10 int ls=son[nde][0],rs=son[nde][1]; 11 sum[nde]=sum[ls]+sum[rs]; 12 lsum[nde]=max(lsum[ls],sum[ls]+lsum[rs]); 13 rsum[nde]=max(rsum[rs],sum[rs]+rsum[ls]); 14 } 15 int Pre(int l,int r) 16 { 17 int nde=++tot; 18 if(l==r) 19 sum[nde]=lsum[nde]=rsum[nde]=1; 20 else 21 { 22 int mid=(l+r)>>1; 23 son[nde][0]=Pre(l,mid); 24 son[nde][1]=Pre(mid+1,r); 25 Pushup(nde); 26 } 27 return nde; 28 } 29 int Insert(int pre,int l,int r,int pos,int tsk) 30 { 31 int nde=++tot; 32 son[nde][0]=son[pre][0]; 33 son[nde][1]=son[pre][1]; 34 if(l==r) 35 sum[nde]=lsum[nde]=rsum[nde]=tsk; 36 else 37 { 38 int mid=(l+r)>>1; 39 if(pos<=mid) son[nde][0]=Insert(son[pre][0],l,mid,pos,tsk); 40 else son[nde][1]=Insert(son[pre][1],mid+1,r,pos,tsk); Pushup(nde); 41 } 42 return nde; 43 } 44 int Query1(int nde,int l,int r,int ll,int rr) 45 { 46 if(l==ll&&r==rr) 47 return sum[nde]; 48 else 49 { 50 int mid=(l+r)>>1; 51 if(mid>=rr) return Query1(son[nde][0],l,mid,ll,rr); 52 else if(mid
>1; 63 if(mid>=rr) return Query2(son[nde][0],l,mid,ll,rr); 64 else if(mid
>1; 75 if(mid>=rr) return Query3(son[nde][0],l,mid,ll,rr); 76 else if(mid
=0; 86 } 87 int main() 88 { 89 scanf("%d",&n); 90 for(int i=1;i<=n;i++) 91 scanf("%d",&num[i]),mem[i]=make_pair(num[i],i); 92 sort(mem+1,mem+1+n),root[1]=Pre(1,n); 93 for(int i=2;i<=n;i++) 94 root[i]=Insert(root[i-1],1,n,mem[i-1].second,-1); 95 scanf("%d",&m); 96 for(int i=1;i<=m;i++) 97 { 98 for(int j=1;j<=4;j++) 99 scanf("%d",&rd),qry[j]=(rd+ans)%n+1;100 sort(qry+1,qry+5);101 int l=1,r=n,lst=1;102 while(l<=r)103 {104 int mid=(l+r)>>1;105 if(Check(mid)) l=mid+1,lst=mid;106 else r=mid-1;107 }108 printf("%d\n",ans=mem[lst].first);109 }110 return 0;111 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10534813.html

你可能感兴趣的文章
PHP preg_match正则表达式
查看>>
Windows2008R2安装Exchange 2010前必须要做的准备工作
查看>>
了解栈(顺序栈)的实现方法
查看>>
bzoj 3732 Network
查看>>
对象数组
查看>>
Hadoop创建/删除文件夹出错
查看>>
差速移动机器人之建模与里程计
查看>>
Django学习笔记
查看>>
03-THREE.JS GUI使用
查看>>
Python os.path.join 双斜杠的解决方法
查看>>
高并发下线程安全的单例模式
查看>>
Windows下修改Git bash的HOME路径(转)
查看>>
第三章 TCP/IP
查看>>
【cocos2d-x制作别踩白块儿】第一期:游戏介绍
查看>>
发现的最大数量
查看>>
Ubuntu12.04环境搭建遇到的问题和建议(一个)
查看>>
19.最经济app发短信的方法
查看>>
从零開始学android&lt;SeekBar滑动组件.二十二.&gt;
查看>>
教你用笔记本破解无线路由器password
查看>>
网络编程学习小结
查看>>