bzoj 1124 [POI2008]枪战Maf 贪心
[POI2008]枪战Maf
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 741 Solved: 295
[Submit][Status][Discuss]
Description
有n个人,每个人手里有一把手枪。一开始所有人都选定一个人瞄准(有可能瞄准自己)。然后他们按某个顺序开枪,且任意时刻只有一个人开枪。因此,对于不同的开枪顺序,最后死的人也不同。
Input
输入n人数<1000000 每个人的aim
Output
你要求最后死亡数目的最小和最大可能
Sample Input
2 3 2 2 6 7 8 5
Sample Output
HINT
- #include <queue>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #define N 1000100
- using namespace std;
- int n,cnt;
- int a[N];
- int du[N];
- int head[N];
- int vis[N];
- int v[N];
- int fir[N];
- struct node
- {
- int from,to,next;
- }edge[N<<];
- int belong[N];
- int cnt_du[N];
- int siz[N];
- int tot;
- void init()
- {
- memset(head,-,sizeof(head));
- cnt=;
- }
- void edgeadd(int from,int to)
- {
- edge[cnt].from=from,edge[cnt].to=to,edge[cnt].next=head[from];
- head[from]=cnt++;
- }
- void dfs(int now,int ff)
- {
- vis[now]=,belong[now]=tot,siz[tot]++;
- for(int i=head[now];i!=-;i=edge[i].next)
- {
- int to=edge[i].to;
- if(to==now||to==ff||vis[to])continue;
- dfs(to,now);
- }
- }
- int check(int now,int num)
- {
- v[now]=;
- int t=now,cntt=;
- while(!v[a[t]])
- {
- v[a[t]]=;
- t=a[t];
- cntt++;
- }
- t=a[t];
- if(t==now&&cntt==num)return ;
- return ;
- }
- int main()
- {
- init();
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- {
- scanf("%d",&a[i]);
- du[a[i]]++;
- edgeadd(i,a[i]);
- edgeadd(a[i],i);
- }
- for(int i=;i<=n;i++)
- {
- if(!vis[i])
- tot++,dfs(i,),fir[tot]=i;
- }
- for(int i=;i<=n;i++)
- {
- if(du[i]==)cnt_du[belong[i]]++;
- }
- int ansma=,ansmi=;
- for(int i=;i<=tot;i++)
- {
- if(siz[i]==)ansma++;
- if(check(fir[i],siz[i]))
- ansma+=siz[i]-;
- else ansma+=siz[i]-cnt_du[i];
- }
- memset(v,,sizeof(v));
- memset(vis,,sizeof(vis));
- queue<int>q;
- for(int i=;i<=n;i++)
- {
- if(!du[i])
- q.push(i);
- }
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- v[u]=;
- if(!vis[a[u]])
- {
- v[a[u]]=vis[a[u]]=,ansmi++;
- du[a[a[u]]]--;
- if(!du[a[a[u]]])
- q.push(a[a[u]]);
- }
- }
- for(int i=;i<=n;i++)
- {
- if(!v[i])
- {
- int t=i,cnt=;
- while(!v[t])
- {
- v[t]=;
- cnt++;
- t=a[t];
- }
- ansmi+=(cnt+)/;
- }
- }
- printf("%d %d\n",ansmi,ansma);
- }
bzoj 1124 [POI2008]枪战Maf 贪心的更多相关文章
- BZOJ 1124: [POI2008]枪战Maf
1124: [POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 617 Solved: 236[Submit][Status ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
- 【刷题】BZOJ 1124 [POI2008]枪战Maf
Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. ...
- BZOJ1124 [POI2008]枪战Maf[贪心(证明未完成)+拓扑排序]
吐槽:扣了几个小时,大致思路是有了,但是贪心的证明就是不会, 死磕了很长时间,不想想了,结果码代码又不会码.. 深深体会到自己码力很差,写很多行还没写对,最后别人代码全一二十行,要哭了 以下可能是个人 ...
- 【BZOJ1124】[POI2008]枪战Maf 贪心+思路题
[BZOJ1124][POI2008]枪战Maf Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开 ...
- 【BZOJ】1124: [POI2008]枪战Maf
题意 \(n(n < 1000000)\)个人,每个人\(i\)指向一个人\(p_i\),如果轮到\(i\)了且他没死,则他会将\(p_i\)打死.求一种顺序,问死的人最少和最多的数目. 分析 ...
- [POI2008]枪战Maf题解
问题 C: [POI2008]枪战Maf 时间限制: 1 Sec 内存限制: 256 MB 题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺 ...
- [POI2008]枪战Maf
[POI2008]枪战Maf 题目 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的 ...
- 【BZOJ 1124】[POI2008] 枪战Maf Tarjan+树dp
#define int long long using namespace std; signed main(){ 这个题一看就是图论题,然后我们观察他的性质,因为一个图论题如果没有什么性质,就是真· ...
随机推荐
- Excel学习路径总结
本片涉及从入门到Excel的各个方向,包含众多资料和自己学习的心得,希望您可以仔细阅之: 入门篇: 无论是软件,还是编程,最好的入门就是通过看视频来学习,视频优点为很容易看清楚,手把手教授,不容易 ...
- nyoj 525 一道水题【字符串(分割)】
参考:https://blog.csdn.net/dxx_111/article/details/48154687 #include <iostream> #include <cst ...
- TRANSLATE(转换大/小写并替换字符)
可以将字母 转换大/小 写或使用替 换规则. 要转换大/小 写,请使用 TRANSLATE 语句,用法 如下: 语法 TRANSLATE <c> TO UPPER CASE. TRANSL ...
- Sphinx与coreseek
Sphinx : 高性能SQL全文检索引擎 分类 编程技术 Sphinx是一款基于SQL的高性能全文检索引擎,Sphinx的性能在众多全文检索引擎中也是数一数二的,利用Sphinx,我们可以完成比数据 ...
- What to do when Enterprise Manager is not able to connect to the database instance (ORA-28001)
摘自:http://dbtricks.com/?p=34 If you are trying to connect to the Oracle enterprise Manger and you ge ...
- Kotlin 1 函数
#2 函数 函数声明和平时我见到的有点不太一样,使用关键字fun来声明.(感觉好欢乐的样子···O(∩_∩)O~~) 下面的示例,简单的声明了一个函数: // 这是函数声明 fun this_is_a ...
- Ngix配置,让所有请求指向同一个文件
统一入口使所有请求在同一个文件先验证处理,Ngix添加如下代码: location / { try_files '' /index.php; }
- MySQL☞create语句
几种常用的建表语句: 1.最简单的建表语句: create table 表名( 列名1 数据类型(长度), 列名2 数据类型(长度), ... ) 2.带主键的建表语句: CREATE TABLE 表 ...
- MySQL linux错误处理
https://cloud.tencent.com/developer/article/1023732 mysql5.7 ERROR 1045 (28000): Access denied for u ...
- [leetcode-655-Print Binary Tree]
Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...