题解

一道裸的数据结构题

正解是排序 \(+\) 二分,但是这怎么能有动态开点线段树好写呢?

于是我就打了暴力,骗了五十分。

对于每种颜色,我们在下标上开一颗线段树,对于交换若颜色相同则跳过,否则直接修改两种颜色的线段树。

跟正解一样是 \(\mathcal O(nlogn)\),但常数巨大,慢三倍还多

Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=3e5+7;
int a[N],n,m;
struct Seg{
#define ls(x) T[x].l
#define rs(x) T[x].r
#define sum(x) T[x].sum
struct Segmenttree{int l,r,sum;}T[N<<5];
int rt[N],tot;
inline void up(int x) {
int l=ls(x),r=rs(x);
sum(x)=sum(l)+sum(r);
}
void update(int &x,int l,int r,int p,int w) {
if (!x) x=p(tot);
if (l==r) {sum(x)+=w;return;}
int mid((l+r)>>1);
if (p<=mid) update(ls(x),l,mid,p,w);
else update(rs(x),mid+1,r,p,w);
up(x);
}
int query(int x,int l,int r,int lt,int rt) {
if (!x) return 0;
if (l<=lt&&rt<=r) return sum(x);
int mid((lt+rt)>>1),res=0;
if (l<=mid) res+=query(ls(x),l,r,lt,mid);
if (r>mid) res+=query(rs(x),l,r,mid+1,rt);
return res;
}
}T;
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
n=read(),m=read();
for (ri i(1);i<=n;p(i)) {
int c=read();a[i]=c;
T.update(T.rt[c],1,n,i,1);
}
for (ri i(1);i<=m;p(i)) {
int t=read();
if (t==1) {
int l=read(),r=read(),c=read();
printf("%d\n",T.query(T.rt[c],l,r,1,n));
} else {
int x=read();
if (a[x]==a[x+1]) continue;
T.update(T.rt[a[x]],1,n,x,-1);
T.update(T.rt[a[x]],1,n,x+1,1);
T.update(T.rt[a[x+1]],1,n,x+1,-1);
T.update(T.rt[a[x+1]],1,n,x,1);
swap(a[x],a[x+1]);
}
}
return 0;
}
}
int main() {return nanfeng::main();}

最新文章

  1. eclispe+axis2+webservice入门
  2. OkHttp,Retrofit 1.x - 2.x 基本使用
  3. [No00002B]知乎精选:如果兔子都在拼命奔跑,乌龟该如何前进
  4. Stencil Buffer
  5. javascript边角知识
  6. ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, or not known
  7. Java多态性举例说明
  8. 【HDOJ】1558 Segment set
  9. 张羿给的删除重复数据的mssql语句
  10. mysql的四种隔离级别
  11. MySQL高效获取记录总数
  12. iOS学习——(转)多线程
  13. .Net Core 实践 - 使用log4net记录日志(1)
  14. Unity3d让某个物体一直正对着相机
  15. 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
  16. java 生成zip文件并导出
  17. python3中的新式类mro查看和C3算法原理
  18. 也谈SpringCloud:假如 《复仇者联盟4》是一个微服务
  19. C++ 动态内存
  20. opencv的基本数据结构(二)(转)

热门文章

  1. Spring Boot(一):如何使用Spring Boot搭建一个Web应用
  2. 构造函数 析构函数的区别与联系 C#
  3. 雪花算法(SnowFlake)Java实现
  4. centos7 几种修改系统时区的方法
  5. 去掉返回的json中特殊字符
  6. SpringBoot 无法注入 service 的 bean
  7. Echarts的应用实践
  8. Python - 浅拷贝的四种实现方式
  9. Apache Flink jobmanager/logs路径遍历CVE-2020-17519
  10. QT经验(一)——按钮长按事件分析