【学习笔鸡】整体二分(P2617 Dynamic Rankings)
【学习笔鸡】整体二分(P2617 Dynamic Rankings)
可以解决一些需要树套树才能解决的问题,但要求询问可以离线。
首先要找到一个具有可二分性的东西,比如区间\(k\)大,就很具有二分性。具体流程是这样的:
- 假设当前分治是已知当前分治中的询问的范围是\([l,r]\),现在要进一步确定每个询问的范围。二分一个\(mid={l+r\over 2}\)出来,继续确定当前分治中心中每个询问的答案是大于还是小于\(mid\),若小于\(mid\)就放入左边递归,否则去右边递归。对于修改操作,我们同样地递归。注意对于修改拆分,将一个修改变为-1和+1。需要预处理每个修改前后的值是多少。
- 撤回修改,继续递归
分析复杂度:
- 对于分治操作,每次问题减半,那么就是\(T(n)=2T(\dfrac n 2)+F(n)\),\(F(n)\)是处理当前分治答案的时间复杂度。那么我们只要设计一个好的算法,使得可以在优秀的时间内处理当前层就可以行了。
- 对于每个询问,每个询问被处理都是一条\(\log\)的链
时间复杂度看个人实现,好的实现可以做到\(O(\log n)\)的时间复杂度
建议写的时候和写线段树的递归方法统一。 不知道为啥我这份代码写得这么快,Hong Kong journalist
//@winlere
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1e5+5;
int sav[maxn<<1],len,n,m,cnt,data[maxn],seg[maxn],ans[maxn];
inline void add(const int&pos,const int&tag){for(int t=pos;t<=len&&t>0;t+=t&-t) seg[t]+=tag;}
inline int que(const int&pos){ int ret=0; for(int t=pos;t>0;t-=t&-t) ret+=seg[t]; return ret; }
struct DATA{int ty,l,r,k; DATA(){ty=l=r=k=0;} DATA(int a,int b,int c,int d){ty=a;l=b;r=c;k=d;}};
vector<DATA> q;
inline void addc(const int&pos,const int&tag){
q.push_back(DATA(0,data[pos],-1,pos));
q.push_back(DATA(0,tag,1,pos));
data[pos]=tag; sav[++cnt]=tag;
}
void divd(const int&l,const int&r,vector<DATA>&ve){
if(l==r||ve.empty()) {for(const auto&t:ve) ans[t.ty]=l; return;}
vector<DATA> lef,rgt;
int mid=(l+r)>>1,temp;
for(auto&t:ve)
if(!t.ty)
if(t.l<=mid) add(t.k,t.r),lef.push_back(t);
else rgt.push_back(t);
else
if((temp=que(t.r)-que(t.l-1))>=t.k) lef.push_back(t);
else t.k-=temp,rgt.push_back(t);
for(auto&t:lef) if(!t.ty) add(t.k,-t.r);
divd(l,mid,lef); divd(mid+1,r,rgt);
}
int main(){
n=qr(); m=qr();
memset(data,-1,sizeof data);
for(int t=1;t<=n;++t) q.push_back(DATA(0,sav[++cnt]=data[t]=qr(),1,t));
for(int t=1,t1,t2,t3;t<=m;++t) {
static char c[20];
scanf("%s",c+1);
if(c[1]=='C') t1=qr(),t2=qr(),addc(t1,t2);
if(c[1]=='Q') t1=qr(),t2=qr(),t3=qr(),q.push_back(DATA(t,t1,t2,t3));
}
sort(sav+1,sav+cnt+1);
len=unique(sav+1,sav+cnt+1)-sav-1;
for(auto&t:q)
if(!t.ty)
t.l=lower_bound(sav+1,sav+len+1,t.l)-sav;
divd(1,len,q);
for(int t=1;t<=m;++t) if(ans[t]) printf("%d\n",sav[ans[t]]);
return 0;
}
【学习笔鸡】整体二分(P2617 Dynamic Rankings)的更多相关文章
- 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]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...
- 洛谷 P2617 Dynamic Rankings 解题报告
P2617 Dynamic Rankings 题目描述 给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\) ...
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- 【学习笔鸡】快速沃尔什变换FWT
[学习笔鸡]快速沃尔什变换FWT OR的FWT 快速解决: \[ C[i]=\sum_{j|k=i} A[j]B[k] \] FWT使得我们 \[ FWT(C)=FWT(A)*FWT(B) \] 其中 ...
- Luogu P2617 Dynamic Rankings(整体二分)
题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...
- 洛谷$P2617\ Dynamic\ Rankings$ 整体二分
正解:整体二分 解题报告: 传送门$w$ 阿查询带修区间第$k$小不显然整体二分板子呗,,, 就考虑先按时间戳排序(,,,其实并不需要读入的时候就按着时间戳排的鸭$QwQ$ 每次二分出$mid$先把所 ...
- 洛谷P2617 Dynamic Rankings
带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...
- 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≤ ...
随机推荐
- 阿里云智能数据构建与管理 Dataphin公测,助力企业数据中台建设
阿里云智能数据构建与管理 Dataphin (下简称“Dataphin”)近日重磅上线公共云,开启智能研发版本的公共云公测!在此之前,Dataphin以独立部署方式输出并服务线下客户,已助力多家大型客 ...
- @loj - 2434@ 「ZJOI2018」历史
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...
- SprinfJdbcTemplate+SpringMVC 代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)
代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件) 原文地址: http://jilongliang.iteye.com/blog/2262070 p ...
- Pytorch的默认初始化分布 nn.Embedding.weight初始化分布
一.nn.Embedding.weight初始化分布 nn.Embedding.weight随机初始化方式是标准正态分布 ,即均值$\mu=0$,方差$\sigma=1$的正态分布. 论据1——查看 ...
- oracle使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAM ...
- Unity 鼠标控制视角功能和动画播放冲突解决办法
环境是 unity 5.6.4 情况说明: 1 模型动画单独播放是没问题的. 2 鼠标控制模型是没问题的. 3 在start中播放模型动画,即使鼠标控制视角代码还挂载着,但是模型却无法用鼠标旋转等操作 ...
- git提交空目录的方法
大家有时候希望从git仓库中拉取代码时目录就已经存在了,不需要再手动创建,但是git并不允许git提交空目录,应该怎么办呢?这篇文章通过可能遇到的两个情况来分别介绍如何解决,有需要的朋友们可以参考借鉴 ...
- excel求和结果不对
excel求和结果不对 Excel求和功能是excel中最常用的功能,但是很多时候会碰到各种错误,比如求和结果总是0.公式求和结果和用计算器敲出来的结果不一样.更新了数据但是求和结果没有变等等.本经验 ...
- 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- [C++] 获取IE代理服务器的账号密码
很多程序需要使用'浏览器设置'的代理服务器,IE设置的代理服务器有可能是需要账号密码的.怎样编程获取浏览器设置的代理服务器的账号密码呢? InternetQueryOption(NULL, INTER ...