@

题意

大概说一下我理解的题意。。。

链接:here

你有\(n\)堆石子,每堆石子有\(a_i\)个石子。游戏规则:\(Alice\)先选择一个大范围\([L,R]\)区间内的石子,\(Bob\)选择一个子区间\([l,r]\)内的石子最终进行游戏。每次至少取走某一堆的一个石子,至多全部取走,无法移动石子者输。\(Alice\)先手,双方足够聪明。问对\(Alice\)的每次选择\([L_i,R_i]\),\(Bob\)有多少种选择能让\(Alice\)必胜。

还有修改操作,即交换相邻的两堆石子。

思路

Nim博弈,区间异或和,带修改莫队

  • \(nim\)博弈结论,区间异或和为\(0\),则先手必败。
  • 问题转换为维护区间异或和为\(0\)的对数,对序列做前缀异或和,莫队维护前缀异或和出现的次数,基本操作。
  • 带修改?交换相邻两堆石子,只会对左堆石子的前缀异或和造成影响,即单点修改。
  • 参考bzoj_2120数颜色,加一个修改时间戳标记,每次询问前回到当时修改时间戳即可。
  • 带修改莫队的块的大小为\(n^{\frac 23}\)较优。

写了很多\(bug\),嘤嘤嘤,太久没写过莫队, 代码里面一堆\(debug\)操作。。。汗

AC_Code

const int MXN = 1e5 + 5;
const int MXE = 3e6 + 6;
int n, m;
LL ANS[MXN], ans;
int bel[MXN];
struct lp {
int l, r, id, tim;
}cw[MXN];
struct lh {
int x, oldx, newx;
}tim[MXN];
int vis[MXE], ar[MXN], res[MXN], ret[MXN];
LL L, R;
bool cmp(const lp&a, const lp&b) {
if(bel[a.l] != bel[b.l]) return a.l < b.l;
if(bel[a.r] != bel[b.r]) {
if(bel[a.l] & 1) return a.r < b.r;
return a.r > b.r;
}
return a.tim < b.tim;
}
inline void up(int p) {
++ vis[res[p]];
ans += vis[res[p]] - 1;
}
inline void down(int p) {
-- vis[res[p]];
ans -= vis[res[p]];
}
inline void upT(int t) {
res[tim[t].x] = tim[t].newx;
if(L <= tim[t].x && tim[t].x <= R) {
++ vis[tim[t].newx];
// debug(tim[t].oldx, tim[t].newx)
ans += vis[tim[t].newx] - 1;
-- vis[tim[t].oldx];
ans -= vis[tim[t].oldx];
}
}
inline void downT(int t) {
res[tim[t].x] = tim[t].oldx;
if(L <= tim[t].x && tim[t].x <= R) {
-- vis[tim[t].newx];
ans -= vis[tim[t].newx];
++ vis[tim[t].oldx];
ans += vis[tim[t].oldx] - 1;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("/home/cwolf9/CLionProjects/ccc/in.txt", "r", stdin);
//freopen("/home/cwolf9/CLionProjects/ccc/out.txt", "w", stdout);
#endif
// int Tim = read();
while(~scanf("%d%d", &n, &m)) {
int block = (int)pow(n, 2. / 3);//标程和10取了max,不知道为啥
int Max = 0;
for(int i = 1; i <= n; ++i) {
ar[i] = read();
bel[i] = (i-1)/block + 1;
res[i] = res[i-1] ^ ar[i];
ret[i] = res[i];
Max = big(Max, ar[i], res[i]);
}
int change = 0, cnt1 = 1, cnt2 = 0;
for(int i = 1, a; i <= m; ++i) {
a = read();
if(a == 1) {
cw[cnt1].l = read(), cw[cnt1].r = read();
cw[cnt1].tim = change;
cw[cnt1].id = cnt1;
++ cnt1;
}else {
tim[cnt2].x = read();
tim[cnt2].oldx = res[tim[cnt2].x];
tim[cnt2].newx = (res[tim[cnt2].x + 1] ^ ar[tim[cnt2].x]);
res[tim[cnt2].x] = tim[cnt2].newx;
Max = big(Max, tim[cnt2].newx);
swap(ar[tim[cnt2].x], ar[tim[cnt2].x + 1]);
// debug(cnt2, tim[cnt2].oldx, tim[cnt2].newx)
++ change; ++ cnt2;
}
}
for(int i = 0; i <= Max; ++i) vis[i] = 0;
sort(cw + 1, cw + cnt1, cmp);
L = R = ans = 0;
up(0);
for(int i = 0; i <= n; ++i) res[i] = ret[i];
for(int i = 1, t = 0, f = 1; i < cnt1; ++i) {
while(R < cw[i].r) up(++ R);
while(R > cw[i].r) down(R --);
while(L < cw[i].l - 1) down(L ++);
while(L >= cw[i].l) up(-- L);
// for(int j = 0; j <= 7; ++j) printf("%d ", res[j]); printf("\n");
// for(int j = 0; j <= 16; ++j) printf("%d ", vis[j]); printf("\n");
for(;t < cw[i].tim; ++ t) upT(t);
for(;t > cw[i].tim; -- t) downT(t-1);
// for(int j = 0; j <= 7; ++j) printf("%d ", res[j]); printf("\n");
// for(int j = 0; j <= 16; ++j) printf("%d ", vis[j]); printf("\n");
// printf("*%lld %d %d %d\n", ans, L, R, cw[i].tim);
ANS[cw[i].id] = (R - L + 1)*(R - L)/2 - ans;
}
for(int i = 1; i < cnt1; ++i) write(ANS[i]);
}
#ifndef ONLINE_JUDGE
cout << "time cost:" << 1.0*clock()/CLOCKS_PER_SEC << "ms" << endl;
#endif
return 0;
}

HDU 6610 Game — 2019第三场杭电多校 1008题的更多相关文章

  1. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

    题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<1 ...

  2. HDU 5795 A Simple Nim (博弈) ---2016杭电多校联合第六场

    A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  3. HDU 5744 Keep On Movin (贪心) 2016杭电多校联合第二场

    题目:传送门. 如果每个字符出现次数都是偶数, 那么答案显然就是所有数的和. 对于奇数部分, 显然需要把其他字符均匀分配给这写奇数字符. 随便计算下就好了. #include <iostream ...

  4. HDU6655 Just Repeat(2019杭电多校J题)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 简单博弈问题,A,B手里各有n,m张牌,牌有颜色,两人轮流出牌(A先出),一个人只能打出对放未打 ...

  5. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

  6. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  7. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  8. HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场

    题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...

  9. hdu 5319 Painter(杭电多校赛第三场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5319 Painter Time Limit: 2000/1000 MS (Java/Others)   ...

随机推荐

  1. Unity编程标准导引-3.1 Component 组件脚本及其基本生命周期

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan 3.1组件 Component 组件是Unity中最核心的一个概念,它是一切编程的基础.没有组件 ...

  2. (转)springboot应用启动原理(一) 将启动脚本嵌入jar

    转:https://segmentfault.com/a/1190000013489340 Spring Boot Takes an opinionated view of building prod ...

  3. QTP中类的使用(转)

    Call Test Class Tester Dim mvarTesterName,mvarAge,mvarGender                        Sub Class_Initia ...

  4. Linux vsftpd服务配置以及三种验证方式以及常见错误解决办法

    文件传输协议(FTP): 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件 ...

  5. 实验报告(七)&第九周课程总结

    班级 计科二班 学号 20188425 姓名 IM 完成时间2019/10/24 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: ...

  6. OpenCV2马拉松第9圈——再谈对照度(对照度拉伸,直方图均衡化)

    收入囊中 lookup table 对照度拉伸 直方图均衡化 葵花宝典 lookup table是什么东西呢? 举个样例,假设你想把图像颠倒一下,f[i] = 255-f[i],你会怎么做? for( ...

  7. (转)收集 Spring Boot 相关的学习资料,Spring Cloud点这里 重点推荐:Spring Boot 中文索引

    推荐博客 纯洁的微笑-Spring Boot系列文章 林祥纤-从零开始学Spring Boot Mkyong-Spring Boot教程(国外) baeldung-Spring Boot教程(国外) ...

  8. 【知识强化】第六章 查找 6.4 散列(Hash)表

    本节课我们来学习一种新的查找方式叫做散列查找.什么是散列查找呢?在学习散列查找之前,一定要介绍一个基本概念就是散列表.那么学习散列表之前我们先来回忆一下之前所学习过的所有查找方式,那么无论是顺序查找还 ...

  9. 2019-9-2-win10-uwp-颜色转换

    title author date CreateTime categories win10 uwp 颜色转换 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 1 ...

  10. org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

    原因: 这个问题的解决方案很简单,主要是因为数据库中不存在相关的表或者列. org.springframework.dao.InvalidDataAccessApiUsageException: Pa ...