BZOJ2120
来源:互联网 发布:ajax处理返回的数据 编辑:程序博客网 时间:2024/05/29 12:00
http://www.lydsy.com/JudgeOnline/problem.php?id=2120
莫队的主要思想,就是尽量控制区间转移的次数。
本题与一般莫队的区别在于加入了修改操作。然而事实上,我们可以把修改看成查询的另一个参数,即查询由Q(ft,to)变为了Q(fr,to,mmt),代表查询mmt时刻(每进行一次修改时刻就+1)时的区间[fr,to]。那么只需找出新的转移方法即可。
fr与to的转移很简单,在此略过。
重点说一下mmt的转移。当我们存储修改操作R时,可以额外存储一个变量col0,记录该次修改前p的颜色,表示这次修改将p的颜色从col0改成了col。那么当mmt回退时,就把p改成col0,反之当mmt前进时,把p改成col。
//数颜色 - 带修改莫队 #include <cstdio>#include <algorithm>using namespace std;int const N=10010;int n,m,a[N];int fr0,to0,mmt0,tAns;struct query{int fr,to,mmt;int ori;}q[N];int fCol[N];struct repaint{int p,col,col0;}r[N];int n0,cnt[N*100],ans[N];bool rngCmp(query q1,query q2){int rng1=(q1.fr-1)/n0,rng2=(q2.fr-1)/n0;if(rng1==rng2)if(q1.to==q2.to) return q1.mmt<q2.mmt;else return q1.to<q2.to;else return rng1<rng2;}void paint(int p,int col){if(fr0<=p && p<=to0){if(cnt[a[p]]--==1) tAns--;if(++cnt[col]==1) tAns++;}a[p]=col;}int main(){freopen("bzoj2120.in","r",stdin);//读入scanf("%d%d",&n,&m);while(n0*n0<n) n0++;for(int i=1;i<=n;i++) scanf("%d",&a[i]),fCol[i]=a[i];int k=0,mQ=0,mR=0;for(int i=1;i<=m;i++) {char ch;scanf("\n%c",&ch);if(ch=='Q'){mQ++;scanf("%d%d",&q[mQ].fr,&q[mQ].to);q[mQ].mmt=k;q[mQ].ori=i;}else{mR++;scanf("%d%d",&r[mR].p,&r[mR].col);int p=r[mR].p,col=r[mR].col;r[mR].col0=fCol[p];fCol[p]=col;k++;}}//莫队算法sort(q+1,q+mQ+1,rngCmp);/*for(int i=1;i<=mQ;i++) printf("[%d,%d] ",q[i].fr,q[i].to);printf("\n");for(int i=1;i<=mR;i++) printf("%d,%d->%d ",r[i].p,r[i].col0,r[i].col);printf("\n");*///求解fr0=1,to0=0,mmt0=0;tAns=0;for(int i=1;i<=mQ;i++){int fr=q[i].fr,to=q[i].to,mmt=q[i].mmt;while(fr<fr0) if(++cnt[a[--fr0]]==1) tAns++;while(fr>fr0) if(cnt[a[fr0++]]--==1) tAns--;while(to<to0) if(cnt[a[to0--]]--==1) tAns--;while(to>to0) if(++cnt[a[++to0]]==1) tAns++;while(mmt<mmt0){paint(r[mmt0].p,r[mmt0].col0);mmt0--;}while(mmt>mmt0){mmt0++;paint(r[mmt0].p,r[mmt0].col);}/*for(int j=1;j<=6;j++) printf("%d ",cnt[j]);printf("\n");*/ans[q[i].ori]=tAns;}for(int i=1;i<=m;i++) if(ans[i]) printf("%d\n",ans[i]);return 0;}
P.S. 这道题因为数据范围太小或者数据上的原因,暴力也能过…
阅读全文
0 0
- bzoj2120
- BZOJ2120
- 【BZOJ2120】数颜色 循环
- [BZOJ2120]数颜色
- bzoj2120 数颜色 分块
- BZOJ2120数颜色
- 【bzoj2120】数颜色
- 【bzoj2120】 数颜色
- 【BZOJ2120】数颜色,带修莫队
- bzoj2120 数颜色
- 【bzoj2120】数颜色 莫队
- 【bzoj2120】数颜色
- bzoj2120 数颜色
- [带修莫队] BZOJ2120: 数颜色
- 【bzoj2120】数颜色
- BZOJ2120 数颜色 分块
- bzoj2120 数颜色 分块
- bzoj2120 数颜色(莫队)
- 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
- flex语法及练习
- 使用国内镜像加速npm和yarn
- mysql数据库学习(1)
- java基础 学习遇到的问题(一)
- BZOJ2120
- html学习的第三天
- HTML 表格
- Android ViewFilgger+GestrueDetector用手势实现滑动
- 删除链表中的重复元素
- 【总结】理解KMP算法思想
- 《机器学习》阅读心得--二、模型评估与选择
- 九度 1431
- 莫比乌斯反演与杜教筛