【题意】给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字。n,m<=10^4,ai<=10^6。

【算法】带修改的莫队算法

【题解】对于询问(x,y,t),其中t是前面的修改次数,所有修改记录改前和改后。

首先按belong[x],然后按belong[y],最后按t排序。(块大小n^(2/3))

移动询问,先移动t,然后移动x和y,运用对称差操作实现。如果移动t前修改格访问过,先删除影响,修改,再加回。

区间莫队需要注意的还有操作顺序问题,区间先拓展再收缩,以及修改的开闭边界问题需要特别注意(左右是不同的)。

哦还有还有,初始是(0,0,0)的话,令vis[0]=1。

为什么我说得这么草率?因为写完了糖果公园后就真的没什么好说的了……当然还是在区间移动上面栽了一下233。

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int belong[maxn],n,m,pre[maxn],c[maxn],d[],ans=,c0,c1,ANS[maxn];
bool vis[maxn];
struct q{int x,y,t,id;}b[maxn];
struct mo{int x,y,pre;}a[maxn];
bool cmp(q a,q b){return belong[a.x]<belong[b.x]||(belong[a.x]==belong[b.x]&&belong[a.y]<belong[b.y])||
(belong[a.x]==belong[b.x]&&belong[a.y]==belong[b.y]&&a.t<b.t);}
void solve(int x){
if(!vis[x])ans+=(++d[c[x]]==);
else ans-=(--d[c[x]]==);//
vis[x]^=;
}
void modify(int x,int y){
if(!vis[x])c[x]=y;
else solve(x),c[x]=y,solve(x);
}
char s[];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&c[i]),pre[i]=c[i];
for(int i=;i<=m;i++){
int u,v;
scanf("%s%d%d",s,&u,&v);
if(s[]=='R')a[++c0]=(mo){u,v,pre[u]},pre[u]=v;
else {if(u>v)swap(u,v);b[++c1]=(q){u,v,c0,c1};}
}
int Q=(int)pow(n,2.0/);
for(int i=;i<=n;i++)belong[i]=(i-)/Q+;
sort(b+,b+c1+,cmp);
vis[]=;//
for(int i=;i<=c1;i++){
for(int j=b[i-].t+;j<=b[i].t;j++)modify(a[j].x,a[j].y);
for(int j=b[i-].t;j>b[i].t;j--)modify(a[j].x,a[j].pre);
for(int j=b[i-].y+;j<=b[i].y;j++)solve(j);//
for(int j=b[i-].x-;j>=b[i].x;j--)solve(j);
for(int j=b[i-].x;j<b[i].x;j++)solve(j);
for(int j=b[i-].y;j>b[i].y;j--)solve(j);
ANS[b[i].id]=ans;
}
for(int i=;i<=c1;i++)printf("%d\n",ANS[i]);
return ;
}

最新文章

  1. sqlmap和burpsuite绕过csrf token进行SQL注入检测
  2. c# udp局域网通信
  3. Linux版本‘’大‘’全|形而上学
  4. win7下用python3.3获取cable modem的设备信息
  5. Anchor和Dock的区别
  6. Android开发学习之LauncherActivity开发启动的列表
  7. html Table实现表头固定
  8. iOS开发系列--打造自己的“美图秀秀”
  9. Gallery平滑移动
  10. hibernate 缓存 4.3
  11. 【CodeVS】1293
  12. C++头文件#include&lt;bits/stdc++.h&gt;
  13. C# 运行时通过鼠标拖动改变控件的大小
  14. S2 深入.NET和C#编程 三:使用集合组织相关数据
  15. django-haystack全文检索
  16. 云计算概述和KVM虚拟化
  17. 关于 js tofixed()保留小数位数问题
  18. CMake 示例
  19. Python 基础数据类型之dict
  20. 《深入理解Java虚拟机》笔记--第四章、虚拟机性能监控与故障处理工具

热门文章

  1. 简述Java中Http/Https请求监听方法
  2. Django内置的分页模块
  3. PHP中与类有关的几个魔术常量
  4. Spring-MVC理解之二:前置控制器
  5. jquery截取手机号中间4位数,然后变为*
  6. FZU2128_最长子串
  7. 【uoj#139】[UER #4]被删除的黑白树 贪心
  8. jmeter同步定时器
  9. 如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求
  10. Codeforces710