题目:https://www.cnblogs.com/Juve/articles/11295333.html

话说这题方法挺多

40分:暴力

65:莫队,你会T得飞起

我考场上没打出带修莫队,没有修改的·跑普通莫队,有修改的,跑暴力(反正都是离线)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define MAXN 300005
  7. //#define int long long
  8. #define re register
  9. using namespace std;
  10. int n,m,a[MAXN],rk[MAXN];
  11. bool appear[MAXN],flag=0;
  12. int num=0,sum=0,blo,block[MAXN],l=1,r=0;
  13. struct node{
  14. int l,r,id,t,val,opt;
  15. friend bool operator < (node a,node b){
  16. return block[a.l]==block[b.l]?a.r<b.r:a.l<b.l;
  17. }
  18. }ask[MAXN];
  19. struct node1{
  20. int pos,val,t,opt;
  21. }change[MAXN];
  22. struct node2{
  23. int l,r,val,opt,pos;
  24. }vio[MAXN];
  25. int cnt[MAXN],ans[MAXN];
  26. void add(int x){
  27. cnt[x]++;
  28. }
  29. void del(int x){
  30. cnt[x]--;
  31. }
  32. signed main(){
  33. scanf("%d%d",&n,&m);
  34. blo=sqrt(n);
  35. for(re int i=1;i<=n;i++){
  36. scanf("%d",&a[i]);
  37. block[i]=i/blo+1;
  38. if(appear[a[i]]){
  39. flag=1;
  40. }
  41. appear[a[i]]=1;
  42. }
  43. if(!flag){
  44. for(re int i=1;i<=n;i++)
  45. rk[a[i]]=i;
  46. for(re int i=1,opt;i<=m;i++){
  47. scanf("%d",&opt);
  48. if(opt==1){
  49. re int l,r,col;
  50. scanf("%d%d%d",&l,&r,&col);
  51. if(l<=rk[col]&&rk[col]<=r)
  52. puts("1");
  53. else puts("0");
  54. }else{
  55. re int x;
  56. scanf("%d",&x);
  57. rk[a[x]]=x+1;
  58. rk[a[x+1]]=x;
  59. swap(a[x],a[x+1]);
  60. }
  61. }
  62. return 0;
  63. }
  64. for(re int i=1,opt;i<=m;i++){
  65. scanf("%d",&opt);
  66. if(opt==1){
  67. ask[++num].opt=opt;
  68. scanf("%d%d%d",&ask[num].l,&ask[num].r,&ask[num].val);
  69. ask[num].t=sum;
  70. ask[num].id=num;
  71. vio[i].opt=opt;
  72. vio[i].l=ask[num].l,vio[i].r=ask[num].r,vio[i].val=ask[num].val;
  73. }else{
  74. change[++sum].opt=opt;
  75. re int x;
  76. scanf("%d",&x);
  77. change[sum].pos=x,change[sum].val=a[x+1];
  78. change[++sum].opt=opt;
  79. change[sum].pos=x+1,change[sum].val=a[x];
  80. vio[i].opt=opt,vio[i].pos=x;
  81. }
  82. }
  83. if(sum==0){
  84. sort(ask+1,ask+num+1);
  85. for(re int i=1;i<=num;i++){
  86. while(l<ask[i].l){
  87. cnt[a[l++]]--;
  88. //del(a[l++]);
  89. }
  90. while(l>ask[i].l){
  91. cnt[a[--l]]++;
  92. //add(a[--l]);
  93. }
  94. while(r<ask[i].r){
  95. cnt[a[++r]]++;
  96. //add(a[++r]);
  97. }
  98. while(r>ask[i].r){
  99. cnt[a[r--]]--;
  100. //del(a[r--]);
  101. }
  102. ans[ask[i].id]=cnt[ask[i].val];
  103. }
  104. for(re int i=1;i<=num;i++){
  105. printf("%d\n",ans[i]);
  106. }
  107. return 0;
  108. }
  109. else{
  110. for(re int i=1;i<=m;i++){
  111. if(vio[i].opt==1){
  112. re int col=vio[i].val,ans=0;
  113. for(re int j=vio[i].l;j<=vio[i].r;j++){
  114. if(a[j]==col) ans++;
  115. }
  116. printf("%d\n",ans);
  117. }else{
  118. swap(a[vio[i].pos],a[vio[i].pos+1]);
  119. }
  120. }
  121. }
  122. return 0;
  123. }

100:

vector排序+二分查找

  1. #include<cstdio>
  2. #include<vector>
  3. #include<algorithm>
  4. #define N 300050
  5. using namespace std;
  6. int n,m;
  7. int a[N];
  8. vector<int>v[N];
  9. int main()
  10. {
  11. scanf("%d%d",&n,&m);
  12. int ok1=1,ok2=1;
  13. for(int i=1;i<=n;++i)
  14. {
  15. scanf("%d",&a[i]);
  16. v[a[i]].push_back(i);
  17. }
  18. int opt,l,r,c,x;
  19. while(m--)
  20. {
  21. scanf("%d",&opt);
  22. if(opt==1)
  23. {
  24. scanf("%d%d%d",&l,&r,&c);
  25. l=lower_bound(v[c].begin(),v[c].end(),l)-v[c].begin();
  26. r=upper_bound(v[c].begin(),v[c].end(),r)-v[c].begin();
  27. printf("%d\n",r-l);
  28. continue;
  29. }
  30. scanf("%d",&x);
  31. l=a[x],r=a[x+1];
  32. v[l][lower_bound(v[l].begin(),v[l].end(),x)-v[l].begin()]=x+1;
  33. v[r][lower_bound(v[r].begin(),v[r].end(),x+1)-v[r].begin()]=x;
  34. swap(a[x],a[x+1]);
  35. }
  36. return 0;
  37. }

或者。。。主席树?

就是查找排名

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define cri const register int
  4. const int L=1<<20|1;
  5. char buffer[L],*S,*T;
  6. #define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
  7. inline int read(){
  8. int a=0;char ch=getchar();
  9. while(ch<'0'||ch>'9') ch=getchar();
  10. while(ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+ch-'0',ch=getchar();
  11. return a;
  12. }
  13. int a[3000010],rt[3000010],t,now;
  14. int ls[20000010],rs[20000010],da[20000010],cnt;
  15. void insert(int &k,cri l,cri r,cri x,cri y){
  16. if(!k) k=++cnt;
  17. if(l==r){
  18. da[k]+=y;
  19. return;
  20. }
  21. int mid=l+r>>1;
  22. if(x<=mid) insert(ls[k],l,mid,x,y);
  23. else insert(rs[k],mid+1,r,x,y);
  24. da[k]=da[ls[k]]+da[rs[k]];
  25. }
  26. void query(cri k,cri l,cri r,cri L,cri R){
  27. if(!k||da[k]<=0) return;
  28. if(l>=L&&r<=R){
  29. if(da[k]>0) now+=da[k];
  30. return;
  31. }
  32. int mid=l+r>>1;
  33. if(L<=mid) query(ls[k],l,mid,L,R);
  34. if(R>mid) query(rs[k],mid+1,r,L,R);
  35. }
  36. int main(){
  37. // freopen("t.in","r",stdin);
  38. // freopen("w.out","w",stdout);
  39. int n,m,x,y,z,k,ans,ma=0;
  40. scanf("%d%d",&n,&m);t=sqrt(n);
  41. for(int i=1;i<=n;i++) a[i]=read(),insert(rt[a[i]],1,n,i,1);
  42. while(m--){
  43. x=read();ans=0;
  44. if(x==1){
  45. y=read(),z=read(),k=read();
  46. if(y>z) swap(y,z);
  47. now=0;
  48. query(rt[k],1,n,y,z);
  49. printf("%d\n",now);
  50. }
  51. else{
  52. y=read();
  53. insert(rt[a[y]],1,n,y,-1);
  54. insert(rt[a[y+1]],1,n,y+1,-1);
  55. insert(rt[a[y]],1,n,y+1,1);
  56. insert(rt[a[y+1]],1,n,y,1);
  57. swap(a[y],a[y+1]);
  58. }
  59. }
  60. return 0;
  61. }

也可以像我一样,来个平衡树

这里用我的平衡树思路将一下

我们给每个颜色建一个平衡树,将该颜色所在的位置插入平衡树,

修改就暴力del和ins,

查询就是找区间端点的排名,

若我们要询问[L,R]中col的出现次数,那么我们在col的平衡树中查询R+1和L的排名,相减就是答案

好像还要卡常。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define MAXN 1000005
  7. #define re register
  8. using namespace std;
  9. int n,m,a[MAXN],root[MAXN];
  10. inline int read(){
  11. int x=0;char ch=getchar();
  12. while(ch<'0'||ch>'9'){ch=getchar();}
  13. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  14. return x;
  15. }
  16. struct Treap{
  17. int tot;
  18. struct node{
  19. int l,r,data,val,size;
  20. }tr[MAXN];
  21. Treap(){tot=1;}
  22. inline void update(re int p){
  23. tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
  24. }
  25. inline int New(re int val){
  26. re int x=++tot;
  27. tr[x].val=val;
  28. tr[x].data=rand();
  29. tr[x].size=1;
  30. return x;
  31. }
  32. inline void merge(re int &root,re int a,re int b){
  33. if(!a||!b){
  34. root=a+b;
  35. return ;
  36. }
  37. if(tr[a].data<tr[b].data){
  38. root=a;
  39. merge(tr[root].r,tr[a].r,b);
  40. }
  41. else{
  42. root=b;
  43. merge(tr[root].l,a,tr[b].l);
  44. }
  45. update(root);
  46. }
  47. inline void split(re int x,re int &a,re int &b,re int val){
  48. if(!x){
  49. a=b=0;
  50. return ;
  51. }
  52. if(tr[x].val<=val){
  53. a=x;
  54. split(tr[x].r,tr[a].r,b,val);
  55. }
  56. else{
  57. b=x;
  58. split(tr[x].l,a,tr[b].l,val);
  59. }
  60. update(x);
  61. }
  62. inline int get_rank(re int &root,re int val){
  63. int x=0,y=0;
  64. split(root,x,y,val-1);
  65. int ans=tr[x].size+1;
  66. merge(root,x,y);
  67. return ans;
  68. }
  69. inline void ins(re int &root,re int val){
  70. int x=0,y=0;
  71. split(root,x,y,val);
  72. merge(x,x,New(val));
  73. merge(root,x,y);
  74. }
  75. inline void del(re int &root,re int val){
  76. int x=0,y=0,z=0;
  77. split(root,x,y,val);
  78. split(x,x,z,val-1);
  79. merge(z,tr[z].l,tr[z].r);
  80. merge(x,x,z);
  81. merge(root,x,y);
  82. }
  83. }treap;
  84. signed main(){
  85. n=read(),m=read();
  86. for(re int i=1;i<=n;i++){
  87. a[i]=read();
  88. treap.ins(root[a[i]],i);
  89. }
  90. for(re int i=1,opt;i<=m;i++){
  91. opt=read();
  92. if(opt==1){
  93. re int l,r,col;
  94. l=read(),r=read(),col=read();
  95. printf("%d\n",treap.get_rank(root[col],r+1)-treap.get_rank(root[col],l));
  96. }else{
  97. re int pos;
  98. pos=read();
  99. if(a[pos]==a[pos+1]) continue;
  100. treap.del(root[a[pos]],pos);
  101. treap.del(root[a[pos+1]],pos+1);
  102. swap(a[pos],a[pos+1]);
  103. treap.ins(root[a[pos]],pos);
  104. treap.ins(root[a[pos+1]],pos+1);
  105. }
  106. }
  107. return 0;
  108. }

HZOI20190803 B题的更多相关文章

  1. HZOI20190803 A,C题

    题目链接:https://www.cnblogs.com/Juve/articles/11295333.html A: 考场上只有70分... 发现几个性质:特殊性质1:在两条链上,看它是fib第几项 ...

  2. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  3. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  4. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  5. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  6. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  7. SQL面试笔试经典题(Part 1)

    本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...

  8. 刷LeetCode的正确姿势——第1、125题

    最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...

  9. AWS的SysOps认证考试样题解析

    刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...

随机推荐

  1. 校园商铺-4店铺注册功能模块-6店铺注册之Controller层的实现

    1. 从request请求获取获取相关的值 HttpservletRequest request代表的是客户端的请求.当客户端通过http协议访问服务器的时候,http请求头中的所有信息,都封装在这个 ...

  2. C++访问sqlite3的初体验

    Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用.不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqli ...

  3. 运用shtml类型文件,实现项目页面的分割。

    学过动态网页,如asp.php的人知道如何去引用网站头部.底部文件包含.例如在php中有一个方法:include();这个方法能在当前文档中引入外部文件,从而方便网站的开发和维护,然而html静态文件 ...

  4. FastJson使用方法

    FastJson是阿里的一款开源框架,用来快速实现Java的序列化和反序列化. 官方地址:https://github.com/alibaba/fastjson 使用方法演示: 下载jar包,使用ID ...

  5. <爬虫>黑板爬虫闯关01

    import requests from lxml import etree import time ''' 黑板爬虫闯关 网址:http://www.heibanke.com/lesson/craw ...

  6. 炮兵阵地 /// 状压DP oj26314

    题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...

  7. 使用Flume+Kafka+SparkStreaming进行实时日志分析

    每个公司想要进行数据分析或数据挖掘,收集日志.ETL都是第一步的,今天就讲一下如何实时地(准实时,每分钟分析一次)收集日志,处理日志,把处理后的记录存入Hive中,并附上完整实战代码 1. 整体架构 ...

  8. 2019-8-30-PowerShell-通过-WMI-获取系统安装的驱动

    title author date CreateTime categories PowerShell 通过 WMI 获取系统安装的驱动 lindexi 2019-08-30 08:58:39 +080 ...

  9. mysql出现ERROR 1366 (HY000):的解决办法

    今天向新建的表中添加内容,出现以下错误: mysql> INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_sho ...

  10. F. Cowmpany Cowmpensation dp+拉格朗日插值

    题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...