博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2120 数颜色 分块
阅读量:6573 次
发布时间:2019-06-24

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

分块大法好 orz

处理出每个点的前驱和后继位置。

暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了

#include
#include
#include
#include
#include
#define N 10005using namespace std;int n,m,nn,a[N],be[N],pre[N],nxt[N];int last[1000005],pp[N],ans;void work(int x){ int l=(x-1)*nn+1,r=min(n,x*nn); for(int i=l;i<=r;i++) pp[i]=pre[i]; sort(pp+l,pp+r+1);}void change(int x,int y){ a[x]=y; if(nxt[x]){pre[nxt[x]]=pre[x];work(be[nxt[x]]);} if(pre[x]){nxt[pre[x]]=nxt[x];work(be[pre[x]]);} int pr=0,ne=0; for(int i=1;i<=n;i++){ if(i
x&&a[i]==y){ne=i;break;} } pre[x]=pr; nxt[x]=ne; work(be[x]); if(pr) {nxt[pr]=x;work(be[pr]);} if(ne) {pre[ne]=x;work(be[ne]);}}int main(){ scanf("%d%d",&n,&m); nn=(int) sqrt(n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); be[i]=(i-1)/nn+1; } for(int i=1;i<=n;i++){ pre[i]=last[a[i]]; last[a[i]]=i; if(pre[i]) nxt[pre[i]]=i; } int tot=be[n]; for(int i=1;i<=tot;i++)work(i); char ch; int x,y,l,r,num; while(m--){ ch=getchar(); while(ch!='Q'&&ch!='R')ch=getchar(); scanf("%d%d",&x,&y); if(ch=='Q'){ ans=0; if(be[x]==be[y]){ for(int i=x;i<=y;i++)if(pre[i]

转载于:https://www.cnblogs.com/Ren-Ivan/p/7746750.html

你可能感兴趣的文章
在JS中使用Ajax
查看>>
将一个十六进制数的字符串参数转换成整数返回
查看>>
在Unbuntu 上安装Phalcon
查看>>
Python正则表达式指南
查看>>
常用的加密算法--摘要认证和签名认证的实现
查看>>
webplayer 设置加载图标和屏蔽右键
查看>>
开源数据库:何为NoSQL生态系统?
查看>>
PHP中利用Ffmpeg获得flv视频缩略图和播放时间
查看>>
percona-toolkit工具包的安装和使用
查看>>
corosync配置与详解
查看>>
Fail to get tape drive(tsm) inventory
查看>>
openssl校验SSL证书public key是否配对
查看>>
十八、AR数据库的关联查询relations之单条数据查询
查看>>
管理历程篇---学会四心
查看>>
RCNA复习知识点
查看>>
Jolt大奖获奖图书
查看>>
tomcat安装并设置开机启动
查看>>
drools 将添加switch支持
查看>>
android中webview空间通过Img 标签显示sd卡中 的图片
查看>>
Shell in AIX Web端 自动远程执行重启tomcat服务命令
查看>>