[bzoj2453]【NOI2011模拟7.23】维护队列
2016-05-30 19:14
316 查看
Description
给出n个数,和m次操作。每次操作分为R x y :将第x个数变成y。
Q x y :询问在x到y这个区间里,有多少种数。
n,m<=10000
Solution
壮哉我大莫队算法%%%很明显可以用带修改莫队碾过去(话说这道题正解好像是奇怪的树套树)
练了练手(第一次打,多多包涵)
带修改莫队就是把排序变成三元的,第一关键字是左端点所在的块,第二关键字是右端点所在的块,第三关键字是经过的修改次数。
Code
#include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define N 10005 #define M 30 using namespace std; struct note{int l,r,x,id;}ask ; struct node{int v,w,pre;}r ; int c ,an ,pos ,num[N*100],last ,n,m,x,y,pl,pr,now,tot,cnt,ans; bool vis ; bool cmp(note x,note y) { return pos[x.l]<pos[y.l]||pos[x.l]==pos[y.l]&&pos[x.r]<pos[y.r]|| pos[x.l]==pos[y.l]&&pos[x.r]==pos[y.r]&&x.x<y.x; } char s[1]; void updata(int x) { if (!vis[x]) { if (++num[c[x]]==1) ans++; } else if (!--num[c[x]]) ans--; vis[x]^=1; } void change(int x,int y) { if (vis[x]) { updata(x);c[x]=y;updata(x); } else c[x]=y; } int main() { scanf("%d%d",&n,&m); fo(i,1,n) scanf("%d",&c[i]),pos[i]=(i+1)/M,last[i]=c[i]; fo(i,1,m) { scanf("%s %d %d",s,&x,&y); if (s[0]=='R') r[++cnt].v=y,r[cnt].w=x,r[cnt].pre=last[x],last[x]=y; else ask[++tot].l=x,ask[tot].r=y,ask[tot].x=cnt,ask[tot].id=tot; } sort(ask+1,ask+tot+1,cmp);pl=1; fo(i,1,tot) { if (now<ask[i].x) fo(j,now+1,ask[i].x) change(r[j].w,r[j].v); else fd(j,now,ask[i].x+1) change(r[j].w,r[j].pre); if (ask[i].l>pl) fo(j,pl,ask[i].l-1) updata(j); else fo(j,ask[i].l,pl-1) updata(j); if (pr<ask[i].r) fo(j,pr+1,ask[i].r) updata(j); else fo(j,ask[i].r+1,pr) updata(j); an[ask[i].id]=ans;pl=ask[i].l;pr=ask[i].r;now=ask[i].x; } fo(i,1,tot) printf("%d\n",an[i]); }
事实证明,块的大小开225会跑的飞起。
相关文章推荐
- [bzoj2453]维护队列
- 常用linux命令
- 远程登录Linux图形化界面
- apache commons-io
- linux 连接windows 共享文件夹
- File_operations结构体
- linux下邮件查看命令
- POJ2976 Dropping tests(01分数规划)
- Linux下PCB的结构体
- 【NOI2005】维护数列
- C#三十六 三层架构的实现
- C#三十六 三层架构的实现
- C#三十六 三层架构的实现
- linux下启动和关闭网卡命令
- nginx服务器安装及配置文件详解
- jdk8中tomcat修改配置PermSize为MetaspaceSize
- jdk8中tomcat修改配置PermSize为MetaspaceSize
- jdk8中tomcat修改配置PermSize为MetaspaceSize
- linux_2day
- Tomcat标准目录