题目传送门:https://www.luogu.org/problemnew/show/P3939

题外话:写完这题后本地跑了下极限数据,用时1.5s,于是马上用fread+fwrite优化至0.3s,交至OJ,跑了600+ms,好奇地去掉fread和fwrite,居然只跑了700+ms(总感觉哪里不太对劲)。

此题有一个性质:对于一个点i,其有且只有一只兔子,且该兔子的颜色是唯一的。考虑到数据范围较小(兔子数量和颜色数量均$\leq 3*10^{5}$),我们可以对所有颜色开一棵线段树,维护该区间内有多少只兔子的颜色符合该线段树要求。更新答案时,先将两只兔子分别从两棵线段树中删去,然后再插回线段树中。由于线段树数量较多,若使用非动态开点线段树,其空间复杂度为$O(n \times max(c_{i}))$,显然MLE。故必须采用动态开点线段树,空间复杂度降低至$O((n+m)\times log(n))$。该做法时间复杂度为$O((n+m)\times log(n))$。

 #include<iostream>
#include<cstdio>
#include<cstring>
#define M 310000
using namespace std;
struct sgt{int lc,rc,sum;}a[M*]={}; int rt[M]={},use=;
int col[M]={};
int query(int x,int l,int r,int ll,int rr){
if(!x) return ;
if(l<=ll&&rr<=r) return a[x].sum;
int mid=(ll+rr)>>,sum=;
if(l<=mid) sum=query(a[x].lc,l,r,ll,mid);
if(mid<r) sum+=query(a[x].rc,l,r,mid+,rr);
return sum;
}
int updata(int x,int k,int ll,int rr,int zhi){
if(!x) x=++use; a[x].sum+=zhi;
int mid=(ll+rr)>>; if(ll==rr) return x;
if(k<=mid) a[x].lc=updata(a[x].lc,k,ll,mid,zhi);
else a[x].rc=updata(a[x].rc,k,mid+,rr,zhi);
return x;
}
int main(){
int n,m; scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int x; scanf("%d",&x); col[i]=x;
rt[x]=updata(rt[x],i,,n,);
}
while(m--){
int op,l,r,x; scanf("%d",&op);
if(op==){
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",query(rt[x],l,r,,n));
}else{
scanf("%d",&x);
rt[col[x]]=updata(rt[col[x]],x,,n,-);
rt[col[x+]]=updata(rt[col[x+]],x+,,n,-);
rt[col[x]]=updata(rt[col[x]],x+,,n,);
rt[col[x+]]=updata(rt[col[x+]],x,,n,);
swap(col[x],col[x+]);
}
}
}

最新文章

  1. Say goodbye to my photos&amp;videos
  2. maven命令参考简要
  3. .net core 学习笔记(4)-ViewComponent
  4. ready和onload的区别
  5. Docker学习(2)
  6. 欧冠杯:葡萄牙VS法国——葡萄牙首次夺冠!
  7. java hashCode方法返回值
  8. 【leetcode】Distinct Subsequences(hard)
  9. 计算直线的交点数(hdu1466简单的dp)
  10. 命令行利器Tmux
  11. ng-select ng-options ng-repeat的用法与区别
  12. GridView 无数据时,绑定提示
  13. linux安装时提示发生不正常错误问题
  14. Lucene的多域查询、结果中查询、查询结果分页、高亮查询结果和结果评分
  15. DirectShow基础编程 最简单transform filter 编写步骤
  16. ES6初体验
  17. Dynamics CRM2016 Web API之删除
  18. 关于oracle设置主键自增的问题
  19. css调整图片位置布局
  20. L02-RHEL6.5环境中安装JDK1.8

热门文章

  1. arduino一些内容
  2. @media screen
  3. Swift的Optional类型
  4. DOM数据解析
  5. Shell编程-05-Shell中条件测试与比较
  6. (连通图)Network--POJ--3694
  7. LCS,LIS,LCIS学习
  8. Oracle 在not in中使用null的问题
  9. 成员函数指针与高性能C++委托
  10. Android-系统解析AndroidManifest