IOI2017 Day1 Toy Train 题解
传送门
题解
这题思维难度比较大_
首先,对任意集合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一定可以进入XXX,所以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\rbracew={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 题解相关推荐
- 【BJOI2019 Day1】简要题解
T1: 传送门 很显然是要在AcAcAc自动机上dpdpdp 一个显然的dpdpdp是f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个字符,当前在自动机的点jjj,已经有kk ...
- codeforces 1129 A2. Toy Train【贪心】
题目大意 有1-n个站点,成环形,有一辆运货车,在这个n个站点之间运输糖果,货车只能按照1->n的方向走,到第n个站的时候,又回到的1,现在告诉你有m个运输任务,从x站点运输一个糖果到y站点.已 ...
- 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 ...
- Codeforces1130
A.Be Positive 题意:给定一个数列,求数列中一半及以上的数是正数.负数还是零. 代码: #include <cstdio> #include <cstring> # ...
- codeforces1130 B C D
目录 B. Two Cakes C. Connect D2. Toy Train B. Two Cakes 有一个长度为2*n的数列 里面有1-n 每个数字各两个 顺序是乱的 求两条1到n的最短路径之 ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)
A - Toy Train 很显然,一个站有多少个糖,那么就要从这个点运多少次.设第i个点有\(a_i\)个糖,那么就要转\(a_i-1\)圈,然后再走一段.很显然最后一段越小越好. 然后枚举起点后, ...
- Codeforces Round 542 (Div. 2)
layout: post title: Codeforces Round 542 (Div. 2) author: "luowentaoaa" catalog: true tags ...
- Manacher 例题讲解
文章目录 HDU 4513 吉哥系列故事--完美队形II 题意: 题解: 代码: HDU 3613 Best Reward 题意: 题解: 代码: HDU 3068 最长回文 题意: 题解: 代码: ...
- 决策单调性Ⅰ:四边形不等式(bzoj 1563: [NOI2009]诗人小G)
题目描述: 给出n个数字和常数L,你可以任意合并相邻的两个数字a[x]和a[x+1],并得出一个新的数a[x]+a[x+1]+1,一通合并后得到一个有若干个数的序列,这个序列的不协调值为∑|(a[i] ...
- 考研英语 - word-list-31
每天十个单词,本博客收集整理自<考研英语词汇>,仅供学习和个人积累. 新东方单词在线阅读地址 ,希望这个链接一直都有效 :) 2017年07月19日 22:16:38 consequent ...
最新文章
- Java8 HashMap
- JVM统介——Java虚拟机架构
- 博客园 CSS 代码定制
- arthas命令redefine实现Java热更新
- Android学习笔记---监听ContentProvider(内容共享者)中数据的变化
- Swift之UITextField+富文本+代理传值
- 三条中线分的六个三角形_初中数学:在三角形中辅助线添加规律归纳总结
- 分享一个游戏源码、游戏服务端、下载网站
- 安装Win7或者XP系统用虚拟光驱加载Win7或者XP镜像 iso文件xp win7wim文件
- 亚马逊云服务器账号注册,免费申请12个月aws亚马逊云详细教程
- vue emoji编辑器
- 机器学习之你不懂的 sigmoid函数
- python开三次方_用python计算三次方根
- 阿里云域名注册优惠口令和续费优惠口令(更新)
- 计算机三级网络技术——综合题一IP地址计算等
- 高等数学学习笔记——第六十八讲——隐函数存在定理
- Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFail
- 简单的网易云音乐热门评论爬虫
- 超级老板键软件,一键隐藏任务。如何在上班的时候打游戏看电影
- EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 论文笔记