题意:有n堆石子,第n堆有a[i]个,A先选择一个范围【L,R】,B选择一个子区间【l,r】,之后照nim游戏的规则进行

现在有询问与操作

每次询问B在给定的【L,R】内有多少种子区间的取法使得A必胜

每次操作会交换第x堆和第x+1堆石头

0<=a[i]<=1e6,n,m<=1e5

思路:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 3000010
#define M 100010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=0x7fffffff;
int inf=1e9;
int dx[]={-,,,};
int dy[]={,,-,}; struct Q
{
int l,r,cur,id;
}q[M]; struct P
{
int x,pre,now;
}p[M]; int a[M],b[M],v[M],cnt[N],pos[M];
ll sum,ans[M]; bool cmp(Q a,Q b)
{
return pos[a.l]<pos[b.l]
||pos[a.l]==pos[b.l]&&pos[a.r]<pos[b.r]
||pos[a.l]==pos[b.l]&&pos[a.r]==pos[b.r]&&a.cur<b.cur;
} int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void go(int x)
{
if(v[x])
{
cnt[b[x]]--;
sum-=cnt[b[x]];
}
else
{
sum+=cnt[b[x]];
cnt[b[x]]++;
}
v[x]^=;
} void update(int x)
{
if(!x) return;
if(v[x])
{
go(x);
b[x]^=a[x];
swap(a[x],a[x+]);
b[x]^=a[x];
go(x);
}
else
{
b[x]^=a[x];
swap(a[x],a[x+]);
b[x]^=a[x];
}
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
mem(cnt,);
mem(v,);
mem(a,);
mem(b,);
int S=max(,(int)pow(n,2.0/));
a[]=b[]=; pos[]=;
rep(i,,n+)
{
a[i]=read();
b[i]=b[i-]^a[i];
pos[i]=(i-)/S;
}
int l1=,l2=;
rep(i,,m)
{
int op=read();
if(op==)
{
int x=read(),y=read();
q[++l1].l=x;
q[l1].r=y+;
q[l1].id=l1;
q[l1].cur=l2;
}
else
{
int x=read();
p[++l2].x=x+;
} }
sort(q+,q+l1+,cmp);
int L=,R=,T=;
sum=;
rep(i,,l1)
{
while(T<q[i].cur)
{
T++;
update(p[T].x);
} while(T>q[i].cur)
{
update(p[T].x);
T--;
} while(L>q[i].l) go(--L);
while(L<q[i].l) go(L++);
while(R>q[i].r) go(R--);
while(R<q[i].r) go(++R);
ll len=R-L+;
ans[q[i].id]=len*(len-)/-sum;
}
rep(i,,l1) printf("%I64d\n",ans[i]);
} return ;
}

【HDOJ6610】Game(序列带修莫队)的更多相关文章

  1. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  2. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  3. bzoj4129 Haruna’s Breakfast 树上带修莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...

  4. LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)

    传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...

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

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出\(n\)个数字的一个序列,\(m\)个操作. 给出\(l,r,k\),求一个最大 ...

  6. Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)

    Codeforces 题目传送门 & 洛谷题目传送门 震惊!我竟然独立切掉了这道 *3100 的题! 虽然此题难度的确虚高,感觉真实评分也就 2800~2900 罢.但感觉还是挺有成就感的( ...

  7. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  8. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  9. UVA 12345 Dynamic len(带修莫队)

    Dynamic len [题目链接]Dynamic len [题目类型]带修莫队 &题解: 莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字. 之后循环离线的时候,先暴力时 ...

随机推荐

  1. JS-Promise(使异步操作同步执行)

    单个异步操作同步 <div id="box"></div> <script> var box = document.querySelector( ...

  2. Webhook到底是个啥?

    参照: https://segmentfault.com/a/1190000015437514

  3. gradle命令行打包不同环境的apk包

    为什么我搜这个? 因为 早上在开发那边我看到他控制不同环境就是在这个下拉框选择不同的环境的 搜索词: Gradle 入门--只此一篇 https://www.jianshu.com/p/001abe1 ...

  4. 更新系统时间 & 查看/修改LINUX时区和时间

    一.时区0. date '+%Y%M%D' 按照格式显示当前日期,结果如下: date "+%Y-%m-%d %H:%M:%S" 1. 查看当前时区 :[root@master ~ ...

  5. shell 删除项目日志

    删除半年之前的日志 find 后面紧跟目录 .为当前目录 -type f 指定查找的是文件 -mtime +180  查找180天之前的 -name  文件名筛选 -exec -rm -rf  执行的 ...

  6. Day10---Python的jieba库

    jieba库:中文分词第三方库 jieba.lcut(s) jieba.lcut(s,cut_all=true) jieba.lcut_for_search(s)

  7. 60-python基础-python3-集合-集合常用方法-交集、并集、差集、对称差集-intersection(&)-union(|)-difference(-)-symmetric_difference()

    交集.并集.差集-intersection(&)-union(|)-difference(-) 1-intersection(&) s1.intersection(s2),返回s1和s ...

  8. Stupid cat & Doge (分形图)

    [题目描述] [题目链接] http://noi.openjudge.cn/ch0204/8463/ [算法] 为求等级N下的点的坐标可由几何关系找到其与等级N-1下对应点的关系,然后递归直至所有点的 ...

  9. HDU 6315 Naive Operations 【势能线段树】

    <题目链接> 题目大意: 给出两个序列,a序列全部初始化为0,b序列为输入值.然后有两种操作,add x y就是把a数组[x,y]区间内全部+1,query x y是查询[x,y]区间内∑ ...

  10. console.log的高级用法

    //基本用法 console.log('最常见用法\n换行'); console.error('输出错误信息 会以红色显示'); console.warn('打印警告信息 会以黄色显示'); cons ...