传送门

题解

这题思维难度比较大_

首先,对任意集合SSS,定义函数fA(S)f_A(S)fA​(S)为不管B怎样A都能进入SSS的起点的集合,fB(S)f_B(S)fB​(S)同理

设充电站集合为RRR,则如果起点在fA(R)f_A(R)fA​(R)以外B必胜(即B一定有一种策略使得火车无法进入RRR)

如果fA(R)f_A(R)fA​(R)为全集则A赢(不管怎样A总能使火车进入RRR)

如果fA(R)f_A(R)fA​(R)不为全集,设XXX为fA(R)f_A(R)fA​(R)的补集,则如果起点属于XXX则B必胜

如果起点属于fB(X)​f_B(X)​fB​(X)​中B一定可以进入X​X​X​,所以B同样必胜

剩下的节点胜负未定,我们可以抠掉这些B胜的节点,继续判断fA(R)f_A(R)fA​(R)是否为全集并重复上述过程,直到fA(R)f_A(R)fA​(R)为全集为止,此时剩下的节点就是A必胜的起点


现在问题就是快速求fAf_AfA​,fBf_BfB​(由于求fAf_AfA​的过程和求fBf_BfB​的过程相似,所以这里只讨论求fAf_AfA​的方法)

由于n≤5000n\le 5000n≤5000,所以可以根据定义直接求fAf_AfA​

首先fA(S)f_A(S)fA​(S)至少是SSS

每次选一个点,它进入fAf_AfA​的条件是:

  • 它由A掌控,并且它至少有一条道路通向SSS
  • 它由B掌控,并且它所有道路全部都通向SSS

具体实现时可以每次在SSS中取出一个尚未取出的节点,并更新每个点是否满足条件。

举个栗子

红色节点属于A,蓝色节点属于B,黄色标记代表这是一个充电车站

首先R={2,9}R=\lbrace2,9\rbraceR={2,9}

按照前面的方法求出fA(R)={2,3,4,5,9}f_A(R)=\lbrace2,3,4,5,9\rbracefA​(R)={2,3,4,5,9}

则X=notfA(R)={1,6,7,8}X=notf_A(R)=\lbrace1,6,7,8\rbraceX=notfA​(R)={1,6,7,8}

fB(X)={1,2,6,7,8}f_B(X)=\lbrace1,2,6,7,8\rbracefB​(X)={1,2,6,7,8}

把{1,2,6,7,8}\lbrace1,2,6,7,8\rbrace{1,2,6,7,8}抠掉,得到{3,4,5,9}\lbrace3,4,5,9\rbrace{3,4,5,9}

用类似的方法,得R={9}R=\lbrace9\rbraceR={9},fA(R)={3,4,5,9}f_A(R)=\lbrace3,4,5,9\rbracefA​(R)={3,4,5,9}为全集

所以得到答案w={0,0,1,1,1,0,0,0,1}​w=\lbrace0,0,1,1,1,0,0,0,1\rbrace​w={0,0,1,1,1,0,0,0,1}​

我在交的时候忘删了调试语句,结果调了好久…qwq

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int n,m,q[N],h,t,vis[N];
vector<int> e[N],e2[N];
vector<int> f(int flag,vector<int> a,vector<int> r,vector<int> res){memset(vis,0,sizeof(vis));vector<int> ans(n),deg(n);t=0,h=-1;for(int i=0;i<n;i++)if(r[i]&&res[i])q[++h]=i,ans[i]=1;for(int i=0;i<n;i++){for(int j=0;j<(int)e[i].size();j++)if(res[e[i][j]]){if(a[i]^flag)deg[i]++;else deg[i]=1;}}while(t<=h){int v=q[t++];for(int i=0;i<(int)e2[v].size();i++){int u=e2[v][i];if(!ans[u]&&res[u]){deg[u]--;if(!deg[u])ans[q[++h]=u]=1;}}}return ans;
}
vector<int> who_wins(vector<int> a,vector<int> r,vector<int> u,vector<int> v){n=a.size(),m=u.size();while(m--)e[u[m]].push_back(v[m]),e2[v[m]].push_back(u[m]);vector<int> ans(n);for(int i=0;i<n;i++)ans[i]=1;while(1){int flag=1;vector<int> res1=f(1,a,r,ans);for(int i=0;i<n;i++)if(ans[i]&&!res1[i])flag=0;if(flag)return ans;for(int i=0;i<n;i++)res1[i]^=1;vector<int> res2=f(0,a,res1,ans);for(int i=0;i<n;i++)if(res2[i])ans[i]=0;}return ans;
}

IOI2017 Day1 Toy Train 题解相关推荐

  1. 【BJOI2019 Day1】简要题解

    T1: 传送门 很显然是要在AcAcAc自动机上dpdpdp 一个显然的dpdpdp是f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个字符,当前在自动机的点jjj,已经有kk ...

  2. codeforces 1129 A2. Toy Train【贪心】

    题目大意 有1-n个站点,成环形,有一辆运货车,在这个n个站点之间运输糖果,货车只能按照1->n的方向走,到第n个站的时候,又回到的1,现在告诉你有m个运输任务,从x站点运输一个糖果到y站点.已 ...

  3. My winning theory in IOI 2018 2019 — Why I won 2 golds in IOI

    总目录详见https://blog.csdn.net/mrcrack/article/details/103564004 摘自https://codeforces.com/blog/entry/691 ...

  4. Codeforces1130

    A.Be Positive 题意:给定一个数列,求数列中一半及以上的数是正数.负数还是零. 代码: #include <cstdio> #include <cstring> # ...

  5. codeforces1130 B C D

    目录 B. Two Cakes C. Connect D2. Toy Train B. Two Cakes 有一个长度为2*n的数列 里面有1-n 每个数字各两个 顺序是乱的 求两条1到n的最短路径之 ...

  6. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)

    A - Toy Train 很显然,一个站有多少个糖,那么就要从这个点运多少次.设第i个点有\(a_i\)个糖,那么就要转\(a_i-1\)圈,然后再走一段.很显然最后一段越小越好. 然后枚举起点后, ...

  7. Codeforces Round 542 (Div. 2)

    layout: post title: Codeforces Round 542 (Div. 2) author: "luowentaoaa" catalog: true tags ...

  8. Manacher 例题讲解

    文章目录 HDU 4513 吉哥系列故事--完美队形II 题意: 题解: 代码: HDU 3613 Best Reward 题意: 题解: 代码: HDU 3068 最长回文 题意: 题解: 代码: ...

  9. 决策单调性Ⅰ:四边形不等式(bzoj 1563: [NOI2009]诗人小G)

    题目描述: 给出n个数字和常数L,你可以任意合并相邻的两个数字a[x]和a[x+1],并得出一个新的数a[x]+a[x+1]+1,一通合并后得到一个有若干个数的序列,这个序列的不协调值为∑|(a[i] ...

  10. 考研英语 - word-list-31

    每天十个单词,本博客收集整理自<考研英语词汇>,仅供学习和个人积累. 新东方单词在线阅读地址 ,希望这个链接一直都有效 :) 2017年07月19日 22:16:38 consequent ...

最新文章

  1. Java8 HashMap
  2. JVM统介——Java虚拟机架构
  3. 博客园 CSS 代码定制
  4. arthas命令redefine实现Java热更新
  5. Android学习笔记---监听ContentProvider(内容共享者)中数据的变化
  6. Swift之UITextField+富文本+代理传值
  7. 三条中线分的六个三角形_初中数学:在三角形中辅助线添加规律归纳总结
  8. 分享一个游戏源码、游戏服务端、下载网站
  9. 安装Win7或者XP系统用虚拟光驱加载Win7或者XP镜像 iso文件xp win7wim文件
  10. 亚马逊云服务器账号注册,免费申请12个月aws亚马逊云详细教程
  11. vue emoji编辑器
  12. 机器学习之你不懂的 sigmoid函数
  13. python开三次方_用python计算三次方根
  14. 阿里云域名注册优惠口令和续费优惠口令(更新)
  15. 计算机三级网络技术——综合题一IP地址计算等
  16. 高等数学学习笔记——第六十八讲——隐函数存在定理
  17. Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFail
  18. 简单的网易云音乐热门评论爬虫
  19. 超级老板键软件,一键隐藏任务。如何在上班的时候打游戏看电影
  20. EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 论文笔记

热门文章

  1. 吃饭 睡觉 打豆豆游戏
  2. 基于PHP课程网站设计开题报告,在线课程网站设计开题报告
  3. 学大数据需要具备什么基础和知识点?
  4. thinkphp5 layui分页样式
  5. 添加metadata到tflite模型
  6. hdu 1203 (01背包,灵活运用)
  7. 微信热修复框架Tinker集成和使用,爬了很多坑后。带你成功跑通项目!
  8. Android Q设备唯一标识符(Device ID)获取
  9. python爬虫——校花网
  10. 李宏毅作业十 Generative Adversarial Network生成对抗网络(代码)