HDU - 6610 Game (带修莫队)

news/2024/11/30 7:38:24/

题链:https://vjudge.net/problem/HDU-6610

题意:用到了尼姆博弈的结论。对于一个区间[L,R],问有多少子区间[l,r],a[l] ^ a[l+1] ^ a[l+2] ^  ...  ^ a[r] != 0 ? 有修改,修改是将a[pos],a[pos+1]交换。

思路:我们求等于0的子区间个数,再减去即可。CodeForces - 617E 的带修版。考虑修改带来的影响,首先因为前缀的思想,pre[pos-1]以及pre[pos+2] ,  pre[pos+3] , pre[pos+4] , ... , pre[n]都不会受影响。

修改前:

pre[pos]=pre[pos-1] ^ a[pos]

pre[pos+1] = pre[pos] ^ a[pos+1] = pre[pos-1] ^ a[pos] ^ a[pos+1]

修改后:

新的pre[pos] = pre[pos-1] ^ a[pos+1] = pre[pos-1] ^ a[pos]^a[pos] ^a[pos+1] = 旧的 pre[pos] ^a[pos] ^a[pos+1]  

新的 pre[pos+1] = 新的 pre[pos] ^ a[pos] =  pre[pos-1] ^ a[pos+1] ^ a[pos] = pre[pos-1] ^ a[pos] ^ a[pos+1] = 旧的 pre[pos+1]

我们可以发现只有pre[pos]发生了变化,变为了pre[pos]^a[pos]^a[pos+1] 。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+10;
const int M = 2e6+10;
int n,m,a[N],pre[N];
struct node{int l,r,id,tim;
}q[N];
int cntq;
int b[N],cntb;
int base,be[N];
bool cmp(node a,node b){return (be[a.l]^be[b.l]) ? be[a.l]<be[b.l] :(be[a.r]^be[b.r]) ? be[a.r]<be[b.r] : a.tim<b.tim;
}
int num[M];
ll sum,ans[N],f[N];
void del(int x){--num[pre[x]];sum-=num[pre[x]];}
void add(int x){sum+=num[pre[x]];++num[pre[x]];
}
int read() {int res = 0;char c = getchar();while(!isdigit(c)) c = getchar();while(isdigit(c)) res = (res << 1) + (res << 3) + c - 48, c = getchar();return res;
}
int main(void){	for(ll i=1;i<N;i++)f[i]=i*(i+1)/2;//n=read(),m=read();while(scanf("%d%d",&n,&m)!=EOF){int maxx=0;cntq=cntb=0;base=ceil(pow(1.0*n,2.0/3.0));for(int i=1;i<=n;i++){a[i]=read();if(a[i]>maxx) maxx=a[i];pre[i]=pre[i-1]^a[i];be[i]=i/base;}for(int i=1;i<=m;i++){int op;op=read();if(op==1){q[++cntq].l=read();q[cntq].r=read();q[cntq].l--;q[cntq].id=cntq;q[cntq].tim=cntb;}elseb[++cntb]=read();}sort(q+1,q+1+cntq,cmp);sum=0;int l=1,r=0,ti=0;for(int i=1;i<=cntq;i++){			int ql=q[i].l,qr=q[i].r,qt=q[i].tim;while(l<ql) del(l++);while(l>ql) add(--l);while(r<qr) add(++r);while(r>qr) del(r--);			while(ti<qt){++ti;int pos=b[ti];if(ql<=pos&&pos<=qr)del(pos);				pre[pos]=pre[pos]^a[pos]^a[pos+1];swap(a[pos],a[pos+1]);if(ql<=pos&&pos<=qr)add(pos);}while(ti>qt){int pos=b[ti];if(ql<=pos&&pos<=qr)del(pos);				pre[pos]=pre[pos]^a[pos]^a[pos+1];swap(a[pos],a[pos+1]);if(ql<=pos&&pos<=qr)add(pos);--ti;}ans[q[i].id]=f[qr-ql]-sum;}for(int i=1;i<=cntq;i++)printf("%lld\n",ans[i]);maxx<<=1;for(int i=0;i<=maxx;i++)num[i]=0;}return 0;	
} 

   


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

相关文章

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;区间内有多少…

2019杭电多校第三场 HDU 6610

题意 给出 n n n个数&#xff0c;询问一个区间 [ L , R ] [L,R] [L,R]&#xff0c;在这个区间内找 [ l , r ] [l,r] [l,r] 做 N I M NIM NIM游戏&#xff0c;问先手必胜的 [ l , r ] [l,r] [l,r] 种类数 首先&#xff0c; N I M NIM NIM游戏的判断条件为 &#xff0c;所有数…

TPS61088的同步升压转换器 替换物料 SGM6610

圣邦微电子的SGM6610是一款输出高达10A的开关型同步升压芯片&#xff0c;其输入电压范围&#xff0c;输出电压范围&#xff0c;工作模式&#xff0c;开关频率范围&#xff0c;拓扑结构&#xff0c;结温范围与TI公司的TPS61088相同&#xff0c;封装尺寸和引脚位号定义也与TI公司…

hdu 6610 Game

题意&#xff1a;带修改地维护区间异或和 思路&#xff1a;带修改莫队&#xff08;注意分块大小为 0.66666n&#xff09; #include <bits/stdc.h> using namespace std; typedef int lint; typedef long long LL; const lint maxn 1000005; lint a[maxn],pos[maxn],su…