码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • AtCoder Beginner Contest 278 G.Generalized Subtraction Game(思维题/博弈 multi-sg)


    题目

    交互题,初始给出n(n<=2e3),l,r(1<=l<=r<=n)

    表示初始时桌面上有n张牌,1到n依次排列,选手和交互机可以轮流取,

    每次可以选择一个初始的位置x,并在[l,r]内选择一个数y,

    表示本次要将x,x+1,...,x+y-1这连续的y张牌都取走,

    如果有一方不能操作了,则另一方胜利,现在需要你战胜交互机,模拟交互过程

    初始时,你可以输出First或Second,表示你先手或后手

    到你出牌时,你输出(x,y),表示本次要将x,x+1,...,x+y-1这连续的y张牌都取走

    并读入(x,y),表示交互机要将x,x+1,...,x+y-1这连续的y张牌都取走

    当你读入的是(0,0)时,代表你获胜,此时终止读入

    思路来源

    灵茶群

    题解

    一眼multi-sg,即当前游戏的操作会使得局面分裂成多个子游戏

    hdu3980 Paint Chain(博弈/Multi-SG)_Code92007的博客-CSDN博客

    但是n<=2e3,multi-sg的复杂度只能解决单点,比如l=r的情形,

    此时,先打出sg表,然后只需暴力set维护当前有哪些线段,

    当该你操作时,枚举所有线段,枚举所有切割可能,暴力找到一个sg=0的后继即可

    由于单次操作时,所有线段的所有切割可能是不超过2e3的,所以复杂度可行

    而当l

    总可以选择First,第一步通过将初始局面分割为两个对称局面,后续模仿交互机即可

    思路想到之后就不难了,implementation会是一个难点,交互题也很难debug

    代码

    1. #include
    2. using namespace std;
    3. const int N=2e3+10;
    4. typedef pair<int,int> P;
    5. int n,l,r,a,b,sg[N],f;
    6. bool vis[N];
    7. set

      now;

    8. void ask(int x,int y){
    9. cout<" "<1<
    10. }
    11. void getsg(int m){
    12. for(int i=0;i0;
    13. sg[m]=1;
    14. for(int i=m+1;i<=n;++i){
    15. memset(vis,0,sizeof vis);
    16. for(int j=0;j<=i-m;++j)
    17. vis[sg[j]^sg[i-m-j]]=1;
    18. for(int j=0;;++j)
    19. if(!vis[j]){
    20. sg[i]=j;
    21. break;
    22. }
    23. }
    24. }
    25. void op1(){
    26. for(auto &v:now){
    27. int x=v.first,y=v.second,z=y-x+1;
    28. f^=sg[z];
    29. for(int i=0;i<=z-r;++i){
    30. int L=i,R=z-r-i;
    31. if(!(f^sg[L]^sg[R])){
    32. now.erase(P(x,y));
    33. if(L>=r)now.insert(P(x,x+L-1));
    34. if(R>=r)now.insert(P(y-R+1,y));
    35. ask(x+L,y-R);
    36. f=0;
    37. return;
    38. }
    39. }
    40. f^=sg[z];
    41. }
    42. }
    43. void op2(int a,int b){
    44. for(auto &v:now){
    45. int x=v.first,y=v.second,z=y-x+1;
    46. if(x<=a && b<=y){
    47. f^=sg[z];
    48. now.erase(P(x,y));
    49. if(a-x>=r)f^=sg[a-x],now.insert(P(x,a-1));
    50. if(y-b>=r)f^=sg[y-b],now.insert(P(b+1,y));
    51. return;
    52. }
    53. }
    54. }
    55. int main(){
    56. cin>>n>>l>>r;
    57. if(l2==0)){
    58. int z=(n-r)%2==0?r:r-1;
    59. cout<<"First"<
    60. ask((n-z)/2+1,(n-z)/2+z);
    61. while(cin>>a>>b){
    62. if(!a && !b)return 0;
    63. b=a+b-1;
    64. ask(n+1-b,n+1-a);
    65. }
    66. }
    67. else{
    68. getsg(r);
    69. now.insert(P(1,n));
    70. f=sg[n];
    71. if(!sg[n])cout<<"Second"<
    72. else{
    73. cout<<"First"<
    74. op1();
    75. }
    76. while(cin>>a>>b){
    77. if(!a && !b)return 0;
    78. b=a+b-1;
    79. op2(a,b);
    80. op1();
    81. }
    82. }
    83. return 0;
    84. }

  • 相关阅读:
    Q_ENUM Q_ENUMS Q_ENUM_NS Q_FLAG Q_FLAGS Q_FLAG_NS
    力扣刷题(代码回忆录)——动态规划
    【C语言经典100例题-70】求一个字符串的长度(指针)
    [C++]为什么invertmap运用到map的每个循环需要check?
    「SpringCloud」07 Gateway服务网关
    中尺度混凝土二维有限元求解——运行弯曲、运行光盘、运行比较、运行半圆形(Matlab代码实现)
    Nature Plants|植物基因组测序20年回顾与展望:三代HiFi基因组时代
    【AGC】使用云调试优惠扣费、华为设备上触发崩溃、无法下载华为应用市场问题小结
    易班 华南理工大学 新生入学教育在线考试 题库共503题
    tcpdump相关
  • 原文地址:https://blog.csdn.net/Code92007/article/details/128164074
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号