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(){ 这个题一看就是图论题,然后我们观察他的性质,因为一个图论题如果没有什么性质,就是真· ...
随机推荐
- 【Leetcode】605. Can Place Flowers
Description Suppose you have a long flowerbed in which some of the plots are planted and some are no ...
- python2.7入门---模块(Module)
来,这次我们就看下Python 模块(Module).它是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你的 Pytho ...
- Git使用之一:创建仓储和提交文件
一.前期工作: 1.准备自己的文件夹用于同步文件 2.准备自己的Git账号,并设置好项目(推荐使用国产的码云) 3.安装Git软件 (下载地址: 32-bit Git for Window ...
- django生产环境中部署
https://www.cnblogs.com/chenice/p/6921727.html 本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如 ...
- JVM运行内存分配和回收
本文来自网易云社区 作者:吕宗胜 Java语言与C语言相比,最大的特点是编程人员无需过多的关心Java的内存分配和回收,因为所有这一切,Java的虚拟机都帮我们实现了.JVM的内存管理,大大降低了开发 ...
- Linux上jdk的安装(CentOS6.5)
centos openjdk 安装 http://www.cnblogs.com/ilahsa/archive/2012/12/11/2813059.html 知CentOS6.5桌面版默认安装的是J ...
- CCF-NOIP-2018 提高组(复赛) 模拟试题(三)
T1 取球游戏 问题描述 现有\(N\)个小球,依次编号为\(1\)到\(N\),这些小球除了编号以外没有任何区别.从这\(N\)个小球中取出\(M\)个,请问有多少种取球方案使得在取出的\(M\)个 ...
- TTY锁屏与解锁
今天在tmux中使用vim时,不小心按了CTRL+S,结果整个vim不能使用了,在网上查到这里会有锁屏的问题,具体如下: 在tmux中,按CTRL+S,锁屏,按CTRL+Q,解锁.与系统的锁屏和解锁是 ...
- Linux通配符与特殊符号知识大全汇总
符号 作用 Linux通配符 * 匹配任意(0个或多个)字符或字符串,包括空字符串 ? 匹配任意1个字符,有且只有一个字符 [abcd] 匹配abcd中任何一个字符,abcd也可是其他任意不连续字符 ...
- CentOS 6.5 下安装redis
1.登录虚拟机后,直接输入命令:yum -y install redis 会出现一个错误: 是因为少了epel源, 2.运行:yum -y install epel-release 最后出现 Comp ...
