题目链接:点击查看

题目大意:给出一个长度为 n 的序列 a,sum 为数列 a 的前缀异或和,再给出 m 次操作,每次操作分为两种类型:

  1. 1 l r:询问 sum 在区间 [ l , r ] 内有多少对不重复的数
  2. 2 pos:交换 a[ pos ] 和 a[ pos + 1 ] 位置的数

题目分析:参考博客:https://blog.csdn.net/qq_42576687/article/details/98211361

带修莫队模板题,存个板子,对于这个题目而言,转换后的题意如上,因为修改操作对于前缀异或和的影响只有 pos 位置受到影响,其他位置不受影响,所以可以视为单点修改,询问有多少对不重复的数,正难则反,可以用总数减去区间内有多少对重复的数即可

分块大小为  ,时间复杂度为 

相对于普通莫队而言,只是在结构体中多了一个变量 t ,代表当前询问之前有多少次修改,在处理时 while 循环也多了两重,需要放在端点修改的 while 之后

修改的话需要分类讨论一下,如果当前修改的点位于当前询问的区间内,则需要对区间的贡献同样做出修改,否则的话不用处理

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;int size,n,m,a[N],sum[N],p[N],qcnt,pcnt;LL cnt[N*10],ans[N];struct query
{int l,r,id,t;bool operator<(const query& a)const{if(l/size!=a.l/size)return l<a.l;else if(r/size!=a.r/size)return r<a.r;elsereturn t<a.t;}
}q[N];LL add(int pos)
{return cnt[sum[pos]]++;
}LL del(int pos)
{return --cnt[sum[pos]];
}LL modify(int id,int pos)
{LL ans=0;bool flag=q[id].l<=p[pos]&&p[pos]<=q[id].r;if(flag)ans-=del(p[pos]);sum[p[pos]]^=a[p[pos]];swap(a[p[pos]],a[p[pos]+1]);sum[p[pos]]^=a[p[pos]];if(flag)ans+=add(p[pos]); return ans;
}void solve()
{sort(q+1,q+1+qcnt);int l=1,r=0,t=0;LL sum=0;for(int i=1;i<=qcnt;i++){int ql=q[i].l,qr=q[i].r,qt=q[i].t;while(r<qr)sum+=add(++r);while(l>ql)sum+=add(--l);while(r>qr)sum-=del(r--);while(l<ql)sum-=del(l++);while(t<qt)sum+=modify(i,++t);while(t>qt)sum+=modify(i,t--);ans[q[i].id]=1LL*(qr-ql+1)*(qr-ql)/2-sum;}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);while(scanf("%d%d",&n,&m)!=EOF){memset(cnt,0,sizeof(cnt));size=(int)pow(n,2.0/3.0);for(int i=1;i<=n;i++){scanf("%d",a+i);sum[i]=sum[i-1]^a[i];}qcnt=0,pcnt=0;while(m--){int op;scanf("%d",&op);if(op==1){int l,r;scanf("%d%d",&l,&r);qcnt++;q[qcnt].l=l-1,q[qcnt].r=r,q[qcnt].t=pcnt,q[qcnt].id=qcnt;}else{int pos;scanf("%d",&pos);p[++pcnt]=pos;}}solve();for(int i=1;i<=qcnt;i++)printf("%lld\n",ans[i]);}return 0;
}

HDU - 6610 Game(带修莫队)相关推荐

  1. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

  2. 牛客练习赛85 数学家的迷题 (带修莫队/线段树)

    题意: 1:将a[id]a[id]a[id]的值改为xxx. 2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a ...

  3. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  4. 莫队+带修莫队模板与总结

    以下总结参考了许多大佬们的博客,开篇先(大佬)% 莫队的入门题目主要为莫队和带修莫队在,这里就先在这里总结一下这两类题目的一些属性. 我认为莫队本质是一种比较优化的暴力查找法.在通过分块操作后把复杂度 ...

  5. LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)

    LG P4074 [WC2013] 糖果公园 Solution 树上带修莫队,主要还是复习带修莫队和树上莫队. 带修莫队: 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键 ...

  6. 牛客挑战赛48E-速度即转发【带修莫队,分块】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列,mmm个操作. 给出l,r,kl,r,kl,r,k,求一个 ...

  7. 分治 —— 莫队算法 —— 带修莫队

    [概述] 普通莫队由于强制离线是不能修改的,但对于强制在线的题,可以在普通莫队的基础上强行加上一维时间轴 time,表示这次操作的时间,即在每个询问前已经完成了多少次修改. 简单来说,就是将询问 [l ...

  8. 【BZOJ4129】Haruna’s Breakfast,树上带修莫队+权值分块求mex

    Time:2016.09.08 Author:xiaoyimi 转载注明出处谢谢 思路: 这道题相当于把昨天学的树上莫队和带修莫队融合了一下,顺便加了一个mex(未出现的最小自然数) 那么主要问题就是 ...

  9. 【BZOJ2120】数颜色,带修莫队

    Time:2016.09.08 Author:xiaoyimi 转载注明出处谢谢 思路: 第一次写带修莫队 感觉还是挺简单的 每一次的修改都是一个时间的变动,即修改一次,时间+1(s) 没有修改的查询 ...

最新文章

  1. STM32F103单片机系统时钟部分归纳
  2. 倩女手游服务器维护,倩女手游7月28日服务器在线维护公告
  3. 在面试中如何展示虚拟机和内存调优技能
  4. Shell替换:Shell变量替换,命令替换,转义字符
  5. Windows Mobile下使用CppUnitLite输出测试结果
  6. Spring–添加SpringMVC –第2部分
  7. C#中的函数参数能不能有默认值的解决方法
  8. Facebook 的应用机器学习平台
  9. C#学习笔记之-----倒序输出字符串
  10. win11休眠选项在哪 Windows11没有休眠选项的解决方法
  11. Xilinx Srio详解IP核使用
  12. PHP从入门到精通pdf
  13. 技术人的软实力(0)不可忽视的软实力培养
  14. intersect 相交 范围_关于CAD二次开发中(范围线自相交)相交线的问题
  15. 阿里云服务器防止暴力破解设置
  16. oracle to_char 和 to_date的区别,斜杠和横杠日期转换,mybatis中入参日期,数据库字段是date的写法
  17. 视频编解码标准情况概述
  18. Windows 11 手机诞生,还是双屏的?
  19. catia高级拔模_解读CATIA拔模的秘密
  20. 情人节!原来程序员也可以那么浪漫!

热门文章

  1. html5自动添加数据库,HTML5本地存储之如果没有数据库究竟会怎样
  2. java加法器_javacc例子:加法器
  3. 分布式ID-雪花算法
  4. The pc Register(程序计数器)
  5. CountDownLatch.countDown
  6. MVC 顶层设计-ModelAndView
  7. 基于Xml 的IOC 容器-载入<property>元素
  8. 如何保证消息消费顺序呢?
  9. 消息发送到topic多个MessageQueue
  10. SpringMVC快速入门-开发步骤