才知道vector在插入值后是可以直接修改的...

那就很简单了

用vector的lowerbound这样的二分操作,提前储存每个颜色的位置

发现交换相对位置不变

关于vector的lowerbound的讲解(感谢QAQ)

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<cstring>
#define MAXN 310001
#define int long long
#define ps push_back
using namespace std;
int n,m;vector<int>v[MAXN];int a[MAXN];
int find(int l,int r,int x)
{
return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
}
int kx(int l,int x)
{
return lower_bound(v[x].begin(),v[x].end(),l)-v[x].begin();
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
v[a[i]].ps(i);
}
for(int i=1;i<=m;++i)
{
int orz;
int l,r,x;
scanf("%lld",&orz);
if(orz==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
printf("%lld\n",find(l,r,x));
}
else
{
scanf("%lld",&l);
if(a[l]==a[l+1])continue;
int me=kx(l,a[l]);
int me1=kx(l+1,a[l+1]);
//printf("me=%lld\nme1=%lld\n",me,me1);
//printf("v[%lld][%lld]=%lld\n",a[l+1],me1,v[a[l+1]][me1]);
v[a[l]][me]=l+1;
v[a[l+1]][me1]=l;
swap(a[l],a[l+1]);
}
}
}

还有主席树做法(我怎么没想到.....)

ps:超时了,只是存板子(它竟然卡我....)

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<cstring>
#define MAXN 1000001
#define int long long
#define ps push_back
using namespace std;
struct node
{
int ls,rs,val;
}T[20*MAXN];
int root[MAXN];int a[MAXN];
int tot=0;int n,m;
void insert(int &now,int l,int r,int x,int k,int last)
{
now=++tot;
T[now]=T[last];
int mid=(l+r)>>1;
if(l==r)
{
T[now].val+=k;
return ;
}
if(x<=mid)insert(T[now].ls,l,mid,x,k,T[last].ls);
else insert(T[now].rs,mid+1,r,x,k,T[last].rs);
}
int query(int x,int l,int r,int val)
{
if(l==r){return T[x].val;}
int mid=(l+r)>>1;
if(val<=mid)return query(T[x].ls,l,mid,val);
else return query(T[x].rs,mid+1,r,val);
}
int maxn=0;
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
maxn=max(maxn,a[i]);
}
for(int i=1;i<=n;++i)
{
//root[i]=root[i-1];
insert(root[i],1,maxn,a[i],1,root[i-1]);
}
for(int i=1;i<=m;++i)
{
int orz,l,r,x;
scanf("%lld",&orz);
if(orz==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
if(x>maxn){printf("0\n");continue;}
printf("%lld\n",query(root[r],1,maxn,x)-query(root[l-1],1,maxn,x));
}
else
{
scanf("%lld",&l);
insert(root[l],1,maxn,a[l],-1,root[l-1]);
insert(root[l],1,maxn,a[l+1],1,root[l-1]);
swap(a[l],a[l+1]);
}
}
}

最新文章

  1. T-SQL字符串相加之后被截断的那点事
  2. Yii2 关闭和打开csrf 验证 防止表单多次重复提交
  3. EXCEL经纬度转化
  4. easyUI之layout
  5. wait、waitpid 僵尸进程 孤儿进程
  6. Sharepoint 列表ItemAdding事件判断文件类型、获取当前上传的文件
  7. Golang项目目录结构组织
  8. EntityFramework 和 linq 判断是否在指定时间段内的方法
  9. DropzoneJS 可以拖拽上传的js库
  10. Codeforces Round #312 (Div. 2) C.Amr and Chemistry
  11. python成长之路——第六天
  12. Determining IP information for eth1... failed; no link present. Check cable? 解决办法
  13. 深入剖析Linux I/O操作与标准I/O操作区别与联系
  14. zookeeper-3.5.4-beta安装
  15. lldb调试mysql 插件命令
  16. 马凯军201771010116《面向对象与程序设计Java》第十三周学习总结
  17. HTML5元素标记释义
  18. IIS7.5配置过程
  19. OpenTSDB(时序数据库官网)
  20. Ubuntu 18.04下Couldn&#39;t connect to Docker daemon at http+docker://localunixsocket解决办法

热门文章

  1. idea 2018.3.3版本激活到
  2. Mybatis-spring-boot-starter自动配置的原理分析
  3. 解决nohup: 忽略输入并把输出追加到&quot;nohup.out&quot;或者nohup: 忽略输入重定向错误到标准输出端
  4. 【yumex图形安装双击】【转载】CentOS yum的详细使用方法
  5. 050.Python前端jQuery
  6. Docker的介绍和安装(1)
  7. brk 和 sbrk 区别
  8. centos下yum方法安装apache+php+mysql
  9. Go语言练习---判断闰年以及根据现在的秒数求现在的年月日
  10. TVM性能评估分析(一)