Game HDU - 6610(带修莫队)

news/2024/11/30 5:01:25/

莫队算法是离线算法,不支持修改,强制在线需要另寻他法。的确,遇到强制在线的题目莫队基本上萎了,但是对于某些允许离线的带修改区间查询来说,莫队还是能大展拳脚的。
讲解:https://www.cnblogs.com/WAMonster/p/10118934.html
https://blog.csdn.net/qq_45458915/article/details/106958683

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N=1e5+10;
int size,cntq,cntc;ll now;
int a[N],sum[N],cnt[N*15];
ll ans[N];
struct query{int l,r,t,id;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];
struct change{int x;
}c[N];void del(int x)
{now-=(--cnt[sum[x]]);
}
void add(int x)
{now+=(cnt[sum[x]]++);}
void modify(int i,int time)
{int tl=q[i].l,tr=q[i].r; if(tl<=c[time].x&&c[time].x<=tr){del(c[time].x);sum[c[time].x]=sum[c[time].x]^a[c[time].x]^a[c[time].x+1];add(c[time].x);		swap(a[c[time].x],a[c[time].x+1]);}else{sum[c[time].x]=sum[c[time].x]^a[c[time].x]^a[c[time].x+1];		swap(a[c[time].x],a[c[time].x+1]);}
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)!=EOF){cntq=0;cntc=0;now=0;memset(cnt,0,sizeof cnt);size=pow(n,2.0/3.0);	for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]^a[i];}for(int i=1;i<=m;i++){int op;scanf("%d",&op);if(op==1){int l,r;scanf("%d%d",&l,&r);q[++cntq].l=l-1;//注意是l-1q[cntq].r=r;q[cntq].id=cntq;q[cntq].t=cntc;}else{int x;scanf("%d",&x);c[++cntc].x=x;}}sort(q+1,q+cntq+1);int tl=1,tr=0,time=0;for(int i=1;i<=cntq;i++){int l=q[i].l,r=q[i].r,id=q[i].id,t=q[i].t;while(tl<l){del(tl++);}while(tl>l){add(--tl);}while(tr<r){add(++tr);}while(tr>r){del(tr--);}while(time<t){modify(i,++time);}while(time>t){modify(i,time--);}ans[q[i].id]=(ll)(r-l+1)*(r-l)/2-now;}for(int i=1;i<=cntq;i++){printf("%lld\n",ans[i]);}}
}

http://www.ppmy.cn/news/636555.html

相关文章

HDU - 6610 Nim博弈+带修莫队

可以看出来两人的游戏是nim博弈 所以如果区间内的数异或和不为0 那么Alice 必胜 简单分析一下我们肯定要做一个前缀异或 然后再莫队就行 因为Bob会对序列进行修改 所以我们需要用带修莫队 然后就变成一个板子题目了 带修莫队 在块大小为 n^(2/3) 理论上复杂度最优 #inclu…

HDU6610——Game——(待修改莫队+Nim游戏)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid6610 题目大意&#xff1a; Alice和Bob在玩石子游戏&#xff0c;Alice选择一个区间【L,R】&#xff0c;确定玩游戏的区间&#xff0c;Bob再选择一个【l,r】&#xff0c; 因为每次Alice可以先走&#xff0c;…

HDU 6610 Game — 2019第三场杭电多校 1008题

目录 题意思路AC_Code (hdu 6610) 题意 大概说一下我理解的题意。。。 链接&#xff1a;here 你有\(n\)堆石子&#xff0c;每堆石子有\(a_i\)个石子。游戏规则&#xff1a;\(Alice\)先选择一个大范围\([L,R]\)区间内的石子&#xff0c;\(Bob\)选择一个子区间\([l,r]\)内的石子最…

HDU - 6610 Game (带修莫队)

题链&#xff1a;https://vjudge.net/problem/HDU-6610 题意&#xff1a;用到了尼姆博弈的结论。对于一个区间[L,R]&#xff0c;问有多少子区间[l,r],a[l] ^ a[l1] ^ a[l2] ^ ... ^ a[r] &#xff01; 0 &#xff1f; 有修改&#xff0c;修改是将a[pos],a[pos1]交换。 思路…

HDU6610(Game 带修莫队+将区间内的值异或转化为两个前缀异或)

题目 题意&#xff1a; 给你n堆石头&#xff0c;m次操作。操作&#xff1a;将x与x1堆石头交换位置 询问:[L,R]多少子区间里面的石头值异或起来不等于0. 思路&#xff1a; 带修莫队板子。那我们就求异或起来等于0的子区间个数。可能modify_t add del函数有一丢丢不好写! &#…

带修莫队学习笔记+HDU6610

带修莫队 允许离线的带区间修改的操作 -将修改操作编号&#xff0c;称为"时间戳" 普通莫队是不能带修改的&#xff0c;我们可以强行让它可以修改 可以强行加上一维时间维, 表示这次操作的时间 [ l − 1 , r , t i m e ] [l−1, r, time] [l−1,r,time] [ l 1 , r …

Qt笔记-自定义QSet,QHash的Key

官方文档已经说得很详细了。 If you want to use other types as the key, make sure that you provide operator() and a qHash() implementation. Example:#ifndef EMPLOYEE_H#define EMPLOYEE_Hclass Employee{public:Employee() {}Employee(const QString &name, con…

UPC 6610 Restoring Road Network

问题 C: Restoring Road Network 题目描述 In Takahashi Kingdom, which once existed, there are N cities, and some pairs of cities are connected bidirectionally by roads. The following are known about the road network: People traveled between cities only thr…