HDU - 6610 Nim博弈+带修莫队

news/2024/11/30 7:56:10/

可以看出来两人的游戏是nim博弈 所以如果区间内的数异或和不为0 那么Alice 必胜  

简单分析一下我们肯定要做一个前缀异或  然后再莫队就行  因为Bob会对序列进行修改 所以我们需要用带修莫队   然后就变成一个板子题目了

带修莫队 在块大小为 n^(2/3) 理论上复杂度最优

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5+10,M = 1e6+100;
typedef long long ll;
int xsum[N],p[N],sqn,a[N],blk;
ll tx[M],ans[N],ret;
struct node{int l,r,t,id;bool operator < (const node &a)const{if(l/blk!=a.l/blk) return l/blk<a.l/blk;if(r/blk!=a.r/blk) return r/blk<a.r/blk;return t<a.t;} 
}q[N];
void add(int x){ret+=tx[xsum[x]]++;}
void del(int x){ret-=--tx[xsum[x]];}
void upd(int i,int t){int flag=(p[t]<=q[i].r&&p[t]>=q[i].l);if(flag) del(p[t]);xsum[p[t]]^=a[p[t]],swap(a[p[t]],a[p[t]+1]),xsum[p[t]]^=a[p[t]];//printf("xsum=%d\n",xsum[p[t]]);if(flag) add(p[t]);
}
int main(){int n,m;while(~scanf("%d%d",&n,&m)){memset(tx,0,sizeof(tx));ret=0;blk=max(10,(int)pow(n,2./3));int qcnt=0,kcnt=0;for(int i = 1; i <= n; i++){scanf("%d",&a[i]);xsum[i]=xsum[i-1]^a[i];}for(int i = 1; i <= m; i++){int op,l,r;scanf("%d%d",&op,&l);if(op==1){scanf("%d",&r);q[++qcnt]=(node){l-1,r,kcnt,qcnt};}else p[++kcnt]=l;}sort(q+1,q+1+qcnt);int l=1,r=0,T=0;for(int i = 1; i <= qcnt; i++){while(l<q[i].l) del(l++);while(l>q[i].l) add(--l);while(r<q[i].r) add(++r);while(r>q[i].r) del(r--);while(T<q[i].t) upd(i,++T);while(T>q[i].t)	upd(i,T--);ans[q[i].id]=1ll*(q[i].r-q[i].l)*(q[i].r-q[i].l+1)/2ll-ret;}for(int i = 1; i <= qcnt; i++) printf("%lld\n",ans[i]);}return 0;
}

 


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

相关文章

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…

【HDU 6610】Game

1.题目链接。题目的意思其实就是在问&#xff1a;先把数列做一个前缀异或和&#xff0c;然后给定区间【L,R】&#xff0c;算一下区间内有多少对数异或值不为0.我们知道&#xff0c;只有两个相等的数异或起来才是0&#xff0c;所以再转化计算其对立问题&#xff1a;区间内有多少…