[PA2014]Budowa
[PA2014]Budowa
题目大意:
有A和B两名候选人。共有\(n(n\le1000)\)个人参加投票。他们之间形成了一个树结构,树上的结点有两种身份:专家(叶子结点)或领导(非叶子结点)。每位专家都有自己的选择——支持A和B之中的一个;每位领导都有若干个下属(子结点),领导的选择决定于下属中人数较多的那一方,下属的数目保证为奇数,从而不会出现平局状况。最后,根结点的选择即为选举结果。
目前仍有一些专家处于犹豫未决的状态,只要前去游说,就可获得他的支持。每人每天只能选择游说一名专家。A先开始,两人交替进行,直到每位专家都有了确定的选择。请问A是否有策略保证自己赢得选举胜利?
思路:
首先,假设那些犹豫的专家最后两边都不支持,如果此时已经B占优势,那么A永远没有反超的机会了。
否则枚举每个犹豫的专家,令他支持A,剩下两边都不支持,看一下是否能使A胜利,如果能,就说明第一步可以选择这个专家。
枚举复杂度\(\mathcal O(n)\),计算支持者的复杂度\(\mathcal O(n)\),总时间复杂度\(\mathcal O(n^2)\)。可以通过此题。
实际上,本题还有一种\(\mathcal O(n\log n)\)的做法。
一开始判断是否有解的算法同上,但是可以\(\mathcal O(n)\)求出可以选择的专家。
对于一个点\(x\),若子结点中支持A的人数+\(\lceil\frac{\text{犹豫的人数}}2\rceil\ge\)支持B的人数,则说明可以选择该子树内的专家。
由于要排序,所以时间复杂度是\(\mathcal O(n\log n)\)的。
源代码:
\(\mathcal O(n^2)\):
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
const int N=1001;
int c[N],d[N][2],ans[N];
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
}
void dfs(const int &x,const int &par) {
//0: xyw, 1: jry
d[x][0]=d[x][1]=0;
if(c[x]<0) d[x][c[x]+2]++;
for(int i=0;i<c[x];i++) {
const int &y=e[x][i];
if(y==par) continue;
dfs(y,x);
if(d[y][1]==d[y][0]) continue;
d[x][d[y][1]>d[y][0]]++;
}
}
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) {
c[i]=getint();
for(register int j=0;j<c[i];j++) {
add_edge(i,getint());
}
}
dfs(1,0);
if(d[1][1]>d[1][0]) {
puts("NIE");
return 0;
}
for(register int i=1;i<=n;i++) {
if(c[i]==0) {
c[i]=-2;
dfs(1,0);
if(d[1][0]>d[1][1]) {
ans[++ans[0]]=i;
}
c[i]=0;
}
}
printf("TAK %d\n",ans[0]);
for(register int i=1;i<=ans[0];i++) {
printf("%d%c",ans[i]," \n"[i==ans[0]]);
}
return 0;
}
\(\mathcal O(n\log n)\):
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
const int N=1001;
int c[N],d[N][3],ans[N];
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
}
void dfs(const int &x,const int &par) {
//0: xyw, 1: jry
if(c[x]<=0) d[x][c[x]+2]++;
for(int i=0;i<c[x];i++) {
const int &y=e[x][i];
if(y==par) continue;
dfs(y,x);
if(d[y][1]==d[y][0]) {
d[x][2]++;
} else {
d[x][d[y][1]>d[y][0]]++;
}
}
}
void solve(const int &x,const int &par) {
if(c[x]==0) ans[++ans[0]]=x;
for(int i=0;i<c[x];i++) {
const int &y=e[x][i];
if(y==par) continue;
if(d[y][0]+1-d[y][2]%2==d[y][1]) {
solve(y,x);
}
}
}
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) {
c[i]=getint();
for(register int j=0;j<c[i];j++) {
add_edge(i,getint());
}
}
dfs(1,0);
if(d[1][1]>d[1][0]) {
puts("NIE");
return 0;
}
if(d[1][1]<d[1][0]) {
for(register int i=1;i<=n;i++) {
if(c[i]==0) {
ans[++ans[0]]=i;
}
}
} else {
solve(1,0);
std::sort(&ans[1],&ans[ans[0]]+1);
}
printf("TAK %d\n",ans[0]);
for(register int i=1;i<=ans[0];i++) {
printf("%d%c",ans[i]," \n"[i==ans[0]]);
}
return 0;
}
[PA2014]Budowa的更多相关文章
- bzoj 3722: PA2014 Final Budowa
3722: PA2014 Final Budowa Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 303 Solved: 108[Submit][St ...
- BZOJ 3721: PA2014 Final Bazarek
3721: PA2014 Final Bazarek Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 645 Solved: 261[Submit][ ...
- BZOJ 3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1050 Solved: ...
- bzoj3714: [PA2014]Kuglarz
[PA2014]KuglarzTime Limit: 20 Sec Memory Limit: 128 MBSubmit: 553 Solved: 317[Submit][Status][Discus ...
- 【贪心】bzoj 3709:[PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 653 Solved: ...
- BZOJ3715: [PA2014]Lustra
3715: [PA2014]Lustra Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 237 Solved: 149[Submit][Status ...
- BZOJ3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 339 Solved: ...
- BZOJ3713: [PA2014]Iloczyn
3713: [PA2014]Iloczyn Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 206 Solved: 112[Submit][Status ...
- BZOJ 3713: [PA2014]Iloczyn( 枚举 )
斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...
随机推荐
- 【强大精美的PS特效滤镜合集】Alien Skin Eye Candy for Mac 7.2.2.20
[简介] Alien Skin Eye Candy for Mac 7.2.2 版本,支持最新的PhotoShop CC 2019.2018等版本,这是一款强大酷炫的PS特效滤镜合集,具有32种滤镜和 ...
- Django admin修改密码
django的admin用户被我多动症一样的测试,给密码弄丢了,需要重置. 从数据库重置的可能性为0,因为django对于密码有保护策略.考虑从运行程序的地方进行重置: 1.在程序的文件夹下,执行这样 ...
- 【1】JDK8 HashMap扩容优化
JDK1.7 VS JDK1.8 比较 优化概述: resize 扩容优化 引入了红黑树,目的是避免单条链表过长而影响查询效率 解决了resize时多线程死循环问题,但仍是非线程安全的 这里主要讲讲扩 ...
- Java设计模式之原型设计模式
概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...
- Resources (being shared)
论文下载求助论坛 数学杂志的模版 答辩PPT模版 发一篇文章的经历 数学期刊名称缩写 英文书籍下载 英文书籍下载 中文书籍下载 数学分析高等代数考研试题官方下载地址
- jpa/hibernate @onetomany 使用left join 添加多条件,可以使用过滤器filters (with-clause not allowed on fetched associations; use filters异常信息)
package com.ipinyou.mip.dataAsset.campaignManagement.entity; import com.ipinyou.mip.utils.NumberUtil ...
- 【ShaderToy】新玩家~❤
最近对shader产生了浓厚兴趣,发现一个超有意思的网站shadertoy.com,各种有意思的shader,很多都是百行以内代码实现,除了学习,作为opgl的练习场所也很不错. 分享今天看的一篇sh ...
- H5取经之路——随便写点儿
[相对定位] * 1.使用position:relative:设置元素为相对定位的元素: * 2.定位机制: ①相对于自己原来文档流中的的位置定位,当不指定top等定位值时,不会改变元素位置: ②相对 ...
- IDEA远程调试服务器代码
先在idea添加一个remote,host填服务器ip,port填监听服务器端口,默认5005 然后在服务器tomcat catalina.sh 添加(红色部分): JAVA_OPTS="$ ...
- 整理一下C++语言中的头文件
对于每一个像我一样的蒟蒻来说,C++最重要的东西就是头文件的使用了.由于初学,直到现在我打代码还是靠一些事先写好的的头文件,仍然不能做到使用自己需要的.最近看了几位大佬打代码,心中突然闪过要把自己冗长 ...