【BZOJ 2120】 数颜色 (乱搞分块,直指暴力)
来源:互联网 发布:mac系统偏好设置卡死 编辑:程序博客网 时间:2024/05/16 08:10
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=2120
题解:
超级无敌大暴力,简直醉了,算法复杂度(m*(根号m+1000)),假如没有修改,那么这就是个明显的莫队,然而其中有修改就比较坑了,但是我们注意到修改次数最多只有1000,啥都不说,先莫队,每次到查询 i 的区间时暴力的搜所有的修改操作来修改本次的答案,之后再改回去,不过注意有时候会多次修改同一个位置。。。。。
据说也可以不用分块,只需要离散化后暴力就行,而且只要两秒。。。
代码:
#include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<string.h>#define maxn (100005)using namespace std;struct node{ int l;int r; int id;int t;}q[maxn],c[maxn];int n,m,len,a[maxn],sq[maxn],cnt[1000005],ans[maxn],gai[maxn];char p[2];int cmp(node x,node y){ int idx=(x.l)/len; int idy=(y.l)/len; if (idx!=idy) return idx<idy; return x.r<y.r;}int main(){ memset(gai,-1,sizeof(gai)); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]); len=sqrt(n); int numq=0,numc=0; for (int i=1;i<=m;i++) { int x,y; scanf("%s%d%d",p,&x,&y); if (p[0]=='Q') { numq++; q[numq].l=x;q[numq].r=y; q[numq].id=numq; q[numq].t=i; } else { numc++; c[numc].l=x;c[numc].r=y; c[numc].t=i; } } sort(q+1,q+1+numq,cmp); int nol=0,nor=0; int noa=0; for (int i=1;i<=numq;i++) { while(q[i].r < nor) { cnt[a[nor]]--; if (cnt[a[nor]]==0) noa--; nor--; } while(q[i].r > nor) { nor++; cnt[a[nor]]++; if (cnt[a[nor]]==1) noa++; } while(q[i].l < nol) { nol--; cnt[a[nol]]++; if (cnt[a[nol]]==1) noa++; } while(q[i].l > nol) { cnt[a[nol]]--; if (cnt[a[nol]]==0) noa--; nol++; } for (int j=1;j<=numc;j++) { int x=c[j].l; int y=c[j].r; int tmp=c[j].t; if (x>=q[i].l && x<=q[i].r && tmp<q[i].t) { if (gai[x]!=-1) { cnt[gai[x]]--; if (cnt[gai[x]]==0) noa--; } else { cnt[a[x]]--; if (cnt[a[x]]==0) noa--; } gai[x]=y; cnt[y]++; if (cnt[y]==1) noa++; } } ans[q[i].id]=noa;// cout<<q[i].id<<' '<<noa<<endl; for (int j=1;j<=numc;j++) { int x=c[j].l; int y=c[j].r; int tmp=c[j].t; if (x>=q[i].l && x<=q[i].r && tmp<q[i].t) { if (gai[x]==y) { cnt[gai[x]]--; if (cnt[gai[x]]==0) noa--; cnt[a[x]]++; if (cnt[a[x]]==1) noa++; gai[x]=-1; } } }// cout<<noa<<endl; } for (int i=1;i<=numq;i++) printf("%d\n",ans[i]);}
0 0
- 【BZOJ 2120】 数颜色 (乱搞分块,直指暴力)
- 【BZOJ 2120】 数颜色 (分块,暴力)
- bzoj 2120: 数颜色(分块)
- BZOJ 2120 数颜色 暴力
- BZOJ 2120 数颜色 分块+二分
- [暴力 乱搞] BZOJ 2338 [HNOI2011]数矩形
- BZOJ 2453: 维护队列&&BZOJ 2120 数颜色 分块
- BZOJ 4216 Pig 分块乱搞
- bzoj 2120 数颜色 莫队超级大暴力
- bzoj 4028: [HEOI2015]公约数数列 (分块乱搞+map)
- [树状数组套权值线段树 || 分块] BZOJ 2120 数颜色 & BZOJ 2453 维护队列
- BZOJ2120 数颜色(分块)
- BZOJ 2120: 数颜色 && 2453: 维护队列 【带修莫队版题【也可以学黄学长分块
- [BZOJ 2906]颜色:分块
- bzoj 2120: 数颜色
- bzoj 2120: 数颜色
- bzoj 2120: 数颜色
- BZOJ 2120 数颜色
- 有重复元素的排列问题
- PagerAdapter学习
- python笔记1
- codeforces-148B-Escape
- android 自定义View知识点
- 【BZOJ 2120】 数颜色 (乱搞分块,直指暴力)
- forward和redirect的区别
- 《Linux内核设计与实现》——第1、2章(内核简介)
- Hadoop MapReduce模块 Module 4: MapReduce
- 关于Java增强for循环的一点儿思考
- 利用递归实现10进制转化成任意进制
- display:none和visibility:hidden的区别?
- iOS版本更新的App提交审核发布流程
- 无线个域网及蓝牙