洛谷$P2617\ Dynamic\ Rankings$ 整体二分
正解:整体二分
解题报告:
阿查询带修区间第$k$小不显然整体二分板子呗,,,
就考虑先按时间戳排序(,,,其实并不需要读入的时候就按着时间戳排的鸭$QwQ$
每次二分出$mid$先把所有修改值小于等于$mid$的计入进去就成
查询的时候用值域线段树就成.
其实感觉和板子差不多,,,?而且修改还从区间变成单点了$QwQ$
$over$
- #include<bits/stdc++.h>
- using namespace std;
- #define il inline
- #define gc getchar()
- #define ri register int
- #define rb register bool
- #define rc register char
- #define lowbit(x) (x&(-x))
- #define rp(i,x,y) for(ri i=x;i<=y;++i)
- #define my(i,x,y) for(ri i=x;i>=y;--i)
- const int N=+,inf=1e9;
- int n,m,a[N],nod_cnt,tr[N<<];
- struct node{int l,r,K,id,as;}nod[N<<],tmp1[N<<],tmp2[N<<];
- il int read()
- {
- rc ch=gc;ri x=;rb y=;
- while(ch!='-' && (ch>'' || ch<''))ch=gc;
- if(ch=='-')ch=gc,y=;
- while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
- return y?x:-x;
- }
- il bool cmp(node gd,node gs){return gd.id<gs.id;}
- il bool rd(){rc ch=gc;while(ch!='Q' && ch!='C')ch=gc;return ch=='Q';}
- il void modify(ri x,ri val){while(x<=n)tr[x]+=val,x+=lowbit(x);}
- il int query(ri x){ri ret=;while(x)ret+=tr[x],x-=lowbit(x);return ret;}
- void solv(ri l,ri r,ri dat_l,ri dat_r)
- {
- if(l>r)return;
- if(dat_l==dat_r){rp(i,l,r)nod[i].as=dat_l;return;}
- ri mid=(dat_l+dat_r)>>,t1=,t2=;
- rp(i,l,r)
- if(nod[i].l>n)if(nod[i].K<=mid)tmp1[++t1]=nod[i],modify(nod[i].r,nod[i].l-n-);else tmp2[++t2]=nod[i];
- else
- {
- ri d=query(nod[i].r)-query(nod[i].l-);
- if(d>=nod[i].K)tmp1[++t1]=nod[i];else nod[i].K-=d,tmp2[++t2]=nod[i];
- }
- rp(i,l,r)if(nod[i].l>n && nod[i].K<=mid)modify(nod[i].r,-nod[i].l+n+);
- rp(i,,t1)nod[i+l-]=tmp1[i];rp(i,t1+,t1+t2)nod[i+l-]=tmp2[i-t1];
- solv(l,l+t1-,dat_l,mid);solv(l+t1,r,mid+,dat_r);
- }
- int main()
- {
- //freopen("2617.in","r",stdin);freopen("2617.out","w",stdout);
- n=read();m=read();rp(i,,n)nod[++nod_cnt]=(node){n+,i,a[i]=read(),};
- rp(i,,m)
- {
- rb op=rd();ri pos=read();
- if(op)nod[++nod_cnt]=(node){pos,read(),read(),nod_cnt};
- else{nod[++nod_cnt]=(node){n+,pos,a[pos],};a[pos]=read();nod[++nod_cnt]=(node){n+,pos,a[pos],};}
- }
- solv(,nod_cnt,,inf);
- sort(nod+,nod+nod_cnt+,cmp);rp(i,,nod_cnt)if(nod[i].l<=n)printf("%d\n",nod[i].as);
- return ;
- }
谁能想到我一个整体二分板子写了差不多两个小时呢,,,$QAQ$
洛谷$P2617\ Dynamic\ Rankings$ 整体二分的更多相关文章
- 洛谷P2617 Dynamic Rankings
带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...
- 洛谷P2617 Dynamic Rankings (主席树)
洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...
- 【学习笔鸡】整体二分(P2617 Dynamic Rankings)
[学习笔鸡]整体二分(P2617 Dynamic Rankings) 可以解决一些需要树套树才能解决的问题,但要求询问可以离线. 首先要找到一个具有可二分性的东西,比如区间\(k\)大,就很具有二分性 ...
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 洛谷 P2617 Dynamic Rankings 解题报告
P2617 Dynamic Rankings 题目描述 给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\) ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 洛咕P3250 [HNOI2016]网络 整体二分
这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...
- P2617 Dynamic Rankings
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- 【BZOJ1901】Dynamic Rankings [整体二分]
Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 给定一个含 ...
随机推荐
- composer基本使用
一.Composer的安装 1.下载Composer 2.Composer安装 1).Composer安装前请确保已经安装了php:打开命令行窗口输入php -v可以查看php的当前版本号. 3.局部 ...
- USDT钱包安装
安装USDT钱包 wget https://bintray.com/artifact/download/omni/OmniBinaries/omnicore-0.4.0-x86_64-linux-gn ...
- H3C 路由器的特点
- 分布式TensorFlow集群local server使用详解
通过local server理解分布式TensorFlow集群的应用与实现. 简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...
- hdu 1358 Period (KMP求循环次数)
Problem - 1358 KMP求循环节次数.题意是,给出一个长度为n的字符串,要求求出循环节数大于1的所有前缀.可以直接用KMP的方法判断是否有完整的k个循环节,同时计算出当前前缀的循环节的个数 ...
- 【转载】.NET中使用Redis
Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...
- poj1573
题意:给出一个矩形,N,E,S,W分别代表进行移动的方向,如果走出矩形网格则输出经过的网格数,如果在矩形网格内循环,则输出没进入循环之前所走过的网格数和循环所经过的网格数: 思路:创建两个数组,一个字 ...
- Python--day46--分组(看了别人博客掌握的)
原文链接:https://www.cnblogs.com/snsdzjlz320/p/5738226.html group by group by + group_concat() group by ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- linux模块参数
驱动需要知道的几个参数因不同的系统而不同. 从使用的设备号( 如我们在下一章见到的 ) 到驱动应当任何操作的几个方面. 例如, SCSI 适配器的驱动常常有选项控制标记命令队列 的使用, IDE 驱动 ...