【JZOJ 5296】【清华集训2017模拟】Sequence
来源:互联网 发布:高斯步枪 知乎 编辑:程序博客网 时间:2024/05/19 17:56
Solution
发现,那个条件2其实没有用,可以用主席树预处理一下,转为数值在x,y之间,
那么这题就变成了求二维平面上的第k大,
这个用整体二分即可,
复杂度:
Code
#include <cstdio>#include <cstdlib>#include <algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)#define min(q,w) ((q)>(w)?(w):(q))#define max(q,w) ((q)<(w)?(w):(q))#define NX(q) ((q)&(-(q)))#define Gsum(l,r) (find(r)-find((l)-1))using namespace std;const int N=100500;int read(int &n){ char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;}int m,n,ans;struct qqww{ int x,y,v;}a[N],p1[N];struct qwqw{ int x,y,v,i,k,p;}b[N*2],pb[N*2];int root[N],b10;struct qwqwq{ int l,r,v;}b1[N*70];int f[N];int c[N],Ans[N];bool PX(qwqw q,qwqw w){return q.p<w.p;}void build(int l,int r,int e1,int &e,int l1){ if(!e||e1==e)b1[e=++b10]=b1[e1]; if(l==r){b1[e].v++;return;} b1[e].v++; int t=(l+r)>>1; if(l1<=t)build(l,t,b1[e1].l,b1[e].l,l1); else build(t+1,r,b1[e1].r,b1[e].r,l1);}int findr(int l,int r,int e1,int e,int l1){ if(l==r)return l; int t=(l+r)>>1; if(!b1[e].r||b1[b1[e].l].v-b1[b1[e1].l].v>=l1)return findr(l,t,b1[e1].l,b1[e].l,l1); return findr(t+1,r,b1[e1].r,b1[e].r,l1-b1[b1[e].l].v+b1[b1[e1].l].v);}void add(int q,int e){for(int i=q;i<=n;i+=NX(i))f[i]+=e;}int find(int q){ int ans=0; for(int i=q;i;i-=NX(i))ans+=f[i]; return ans;}void divide(int l,int r,int L,int R,int L1,int R1){ if(l==r) { fo(i,L1,R1)Ans[b[i].i]=l; return; } if(L1>R1||L>R)return; int t=(l+r)>>1; int T=0; fo(i,L,R) { a[i-T]=a[i]; if(a[i].v>t)p1[++T]=a[i]; } T=R-T; fo(i,T+1,R)a[i]=p1[i-T]; int q=L1; fo(i,L,T) { for(;b[q].p<a[i].x&&q<=R1;q++) { c[b[q].i]+=b[q].k*Gsum(b[q].x,b[q].y); } add(a[i].y,1); } for(;q<=R1;q++)c[b[q].i]+=b[q].k*Gsum(b[q].x,b[q].y); q=0; fo(i,L1,R1) { b[i-q]=b[i]; if(c[b[i].i]<b[i].v) { b[i].v-=c[b[i].i]; q++; pb[q]=b[i]; } if(b[i].k>0)c[b[i].i]=0; } fo(i,R1-q+1,R1)b[i]=pb[i-R1+q]; fo(i,L,T)add(a[i].y,-1); divide(l,t,L,T,L1,R1-q); divide(t+1,r,T+1,R,R1-q+1,R1);}int main(){ freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); int q,w,e,_,l,r,x,y; read(n); fo(i,1,n)read(a[i].y),a[i].x=i; fo(i,1,n) { read(a[i].v); build(1,n,root[i-1],root[i],a[i].y); } read(m); fo(i,1,m) { read(b[i*2-1].p),read(b[i*2].p); b[i*2-1].p--; read(q),read(w); b[i*2].x=b[i*2-1].x=findr(1,n,root[b[i*2-1].p],root[b[i*2].p],q); b[i*2].y=b[i*2-1].y=findr(1,n,root[b[i*2-1].p],root[b[i*2].p],w); b[i*2].v=read(b[i*2-1].v); b[i*2-1].k=-1;b[i*2].k=1; b[i*2-1].i=b[2*i].i=i; } sort(b+1,b+1+2*m,PX); divide(1,n,1,n,1,m*2); fo(i,1,m)printf("%d\n",Ans[i]); return 0;}
阅读全文
0 0
- 【JZOJ 5296】【清华集训2017模拟】Sequence
- 【清华集训2017模拟】Sequence
- 【清华集训2017模拟】Sequence
- 【JZOJ 5295】【清华集训2017模拟】Create
- 5296. 【清华集训2017模拟】Sequence 树套树
- 【JZOJ5296】【清华集训2017模拟】Sequence
- 【JZOJ 5276】【清华集训2017模拟】神奇的玩具
- 【JZOJ 5282】【清华集训2017模拟】等差划分数
- 【JZOJ 5284】【清华集训2017模拟】超级翻转
- JZOJ 5483. 【清华集训2017模拟11.26】简单路径
- JZOJ 5484. 【清华集训2017模拟11.26】快乐树
- JZOJ 5485. 【清华集训2017模拟11.26】字符串
- [jzoj]5483. 【清华集训2017模拟11.26】简单路径
- JZOJ 5489. 【清华集训2017模拟11.28】海明距离
- JZOJ 5489. 【清华集训2017模拟11.28】海明距离
- JZOJ 5490. 【清华集训2017模拟11.28】图染色
- JZOJ 5500. 【清华集训2017模拟12.10】营养餐
- JZOJ 5496. 【清华集训2017模拟12.09】Tree
- 一周科技要闻
- 关于醉驾的想去没去成,去了没撞人,去了撞了,该受到怎样的谴责的理由
- QNX系统的ftp调试,连接FTP调试-QNX的PC104调试ftp
- BZOJ[1455]罗马游戏 可并堆
- 竞赛题目讲解-【Central Europe 1996】装箱问题
- 【JZOJ 5296】【清华集训2017模拟】Sequence
- NG机器学习week6 Advice for Applying Machine Learning
- lr相关
- Spring笔记-Spring的bean
- Akka 实践(二)- java开发demo1
- google地图
- Java中list对象的三种遍历方式
- CodeForces 548B 模拟连续的技巧。
- 利用多个域名来存储网站资源