【题目描述】

老虎和蒜头是好朋友。

众所周知,蒜头经常给老虎出一些题目,而老虎也常常被难倒,作为捧杯之王的老虎难免心有怨怼。今天,老虎发现了蒜头的一个序列 a​ 。虽然老虎不知道这个序列是用来做什么的,但老虎还是希望搞点破坏——他计划把序列 a​ 全部变成 0​ 。

然而,对蒜头的序列进行操作绝不是容易的事情。具体来说,老虎每次可以选择两个位置 i,j(i≠j) ,将 ai 和 aj 变为 ai⊕aj,其中 ⊕ 是异或操作。

然而,只将蒜头的一个序列变成 0 实在是不够解气。因此,老虎希望你能够对于 m 组询问 l,r ,告诉老虎对于该序列的一个子序列 al,al+1,…,ar,最少需要操作几次才能将该序列变为全 0 序列。

【输入格式】

输入的第一行包括两个正整数 n,m​ ,表示序列的长度和询问的次数。

接下来 m​ 行,每行两个正整数 li,ri​ ,表示一组询问。

【输出格式】

输出共 m​ 行,每行一个数,表示该组询问最少的操作次数。

【样例数据】

input

5 3

3 3 3 3 5

1 5

2 3

3 5

output

4

1

3

【数据范围】

对于 100% 的数据,0≤ai<230。

Subtask 1(20 分): 2≤n,m≤10

Subtask 2(30 分): 2≤n,m≤2000

Subtask 3(50 分): 2≤n,m≤2×105

时间限制: 2s

空间限制: 512MB

很显然,对于一段区间,如果有相同的数,那么一次可以消掉两个。如果两个数不同,那么两次就能消掉(它们两个碰两次),如果有单个的,需要两次才能消掉(一次和0,一次它们两个相消)。

很显然,我们只需要维护一段区间中相同的数的个数,和落单的数的个数,这个每次拓展一位是很好处理的。

所以上莫队就行了。QAQ

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define MAXN 200010
  7. using namespace std;
  8. int n,m,block,cur_ans,sum1;
  9. int a[MAXN],b[MAXN],pos[MAXN],ans[MAXN],sum[MAXN];
  10. struct Node{int id,l,r;}node[MAXN];
  11. inline bool cmp(struct Node x,struct Node y)
  12. {return pos[x.l]<pos[y.l]||(pos[x.l]==pos[y.l]&&x.r<y.r);}
  13. inline void ins(int x)
  14. {
  15. if(!x) return;
  16. if(sum[x]%2==1)
  17. {
  18. if(sum1&1) cur_ans--,sum1=0;
  19. else cur_ans++,sum1=1;
  20. }
  21. else
  22. {
  23. if(sum1&1) sum1=0;
  24. else cur_ans+=2,sum1=1;
  25. }
  26. sum[x]++;
  27. }
  28. inline void del(int x)
  29. {
  30. if(!x) return;
  31. if(sum[x]%2==1)
  32. {
  33. if(sum1&1) cur_ans-=2,sum1=0;
  34. else sum1=1;
  35. }
  36. else
  37. {
  38. if(sum1&1) cur_ans--,sum1=0;
  39. else cur_ans++,sum1=1;
  40. }
  41. sum[x]--;
  42. }
  43. int main()
  44. {
  45. #ifndef ONLINE_JUDGE
  46. freopen("ce.in","r",stdin);
  47. #endif
  48. scanf("%d%d",&n,&m);
  49. block=(int)sqrt(1.0*n);
  50. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  51. memcpy(b,a,sizeof(a));
  52. sort(&b[1],&b[n+1]);
  53. int k=unique(&b[1],&b[n+1])-b-1;
  54. for(int i=1;i<=n;i++) a[i]=lower_bound(&b[1],&b[k+1],a[i])-b;
  55. for(int i=1;i<=n;i++)
  56. {
  57. pos[i]=i/block;
  58. if(i%block) pos[i]++;
  59. }
  60. for(int i=1;i<=m;i++)
  61. {
  62. scanf("%d%d",&node[i].l,&node[i].r);
  63. node[i].id=i;
  64. }
  65. sort(&node[1],&node[m+1],cmp);
  66. int l=1,r=0;
  67. for(int i=1;i<=m;i++)
  68. {
  69. // printf("%d %d\n",node[i].l,node[i].r);
  70. while(r<node[i].r) r++,ins(a[r]);
  71. while(l>node[i].l) l--,ins(a[l]);
  72. while(l<node[i].l) del(a[l]),l++;
  73. while(r>node[i].r) del(a[r]),r--;
  74. ans[node[i].id]=cur_ans;
  75. }
  76. for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
  77. return 0;
  78. }

noi.ac #553 序列的更多相关文章

  1. NOI.ac #31 MST DP、哈希

    题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...

  2. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  3. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  4. noi.ac上的一套(假)NOI题

    noi.ac上的一套(假)NOI题 本来想着可以刷点通过量的,结果发现好像并不是这样的. 整数 description 给你\(n,p\),要你求\(\sum_{k=1}^n\sum_{i=1}^k\ ...

  5. SDOI2015 寻宝游戏 | noi.ac#460 tree

    题目链接:戳我 可以知道,我们相当于是把有宝藏在的地方围了一个圈,求这个圈最小是多大. 显然按照dfs序来遍历是最小的. 那么我们就先来一遍dfs序列,并且预处理出来每个点到根的距离(这样我们就可用\ ...

  6. NOI.AC#2139-选择【斜率优化dp,树状数组】

    正题 题目链接:http://noi.ac/problem/2139 题目大意 给出\(n\)个数字的序列\(a_i\).然后选出一个不降子序列最大化子序列的\(a_i\)和减去没有任何一个数被选中的 ...

  7. NOI.AC#2144-子串【SAM,倍增】

    正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串\(s\)和一个序列\(a\).将字符串\(s\)的所有本质不同子串降序排序后,求有多少个区间\([l,r ...

  8. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

  9. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

随机推荐

  1. T100——不绑定数据表字段,做查询条件(待改进)

    此例子使用的方法有待改善,不是很好的方法. 范例:aimm200: 作用:查询时默认不显示无效料件:新增参数控制查询是否显示无效料件.(只作用查询,不影响新增.修改等)

  2. T100——单据别的新增、修改设置

    何为单据别,例如下图,新增的时候开窗选择单据别: 新增单据别: 1.首先在azzi600 系统分类码维护作业里面新增新的系统分类码(在系统分类码24下新增),如图: 2.在azzi910 作业基本数据 ...

  3. C语言写郑州大学校友通讯录

    #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN sizeof(stru ...

  4. ASP.NET Core MVC里面Razor如何获取URL参数

    原文:ASP.NET Core MVC里面Razor如何获取URL参数 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  5. A Pythonic Card Deck: __len__ & __getitem__ & for 循环的嵌套

    1. 列表生成式的嵌套 for 循环: 示例如下: li1 = range(1,6) li2 = list("ABC") # list("ABC") 的结果为 ...

  6. golang(9):网络编程 & redis

    网络编程 TCP/IP 协议: . TCP(传输控制协议) -- 应用程序之间通信 . UDP(用户数据包协议)-- 应用程序之间的简单通信 . IP(网际协议) -- 计算机之间的通信 . DHCP ...

  7. linux mint ubuntu 安装qq

    git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.gitcd deepin-wine-for-ubuntu./install.sh ...

  8. sccrapy 爬虫框架网数据库储存时去重的问题

    from scrapy.exceptions import DropItem #导入异常处理模块 class Baidu03Pipeline(object): def __init__(self): ...

  9. postgres 表和库等信息大小统计

    一 .数据库大小的统计 1.单个库查询 select pg_database_size('zybdb'); 2.查询所有的库 方法一: select pg_database.datname, pg_s ...

  10. JavaScript事件的基本学习