[POI2008]MAF-Mafia(图论,贪心)
题目描述
Mob feud rages in Equatorial Byteotia. The mob bosses have come to the country's capital, Byteburg, to settle the dispute.
Negotiations were very tense, and at one point the trigger-happy participants drew their guns.
Each participant aims at another with a pistol.
Should they go on a killing spree, the shooting will go in accordance with the following code of honour:
the participants shoot in a certain order, and at any moment at most one of them is shooting, no shooter misses, his target dies instantly, hence he may not shoot afterwards, everyone shoots once, provided he had not been shot before he has a chance to shoot, no participant may change his first target of choice, even if the target is already dead (then the shot causes no further casualties).
An undertaker watches from afar, as he usually does. After all, the mobsters have never failed to stimulate his business.
He sees potential profit in the shooting, but he would like to know tight estimations. Precisely he would like to know the minimum and maximum possible death rate.
The undertaker sees who aims at whom, but does not know the order of shooting.
You are to write a programme that determines the numbers he is so keen to know.
Task Write a programme that:
reads from the standard input what target each mobster has chosen, determines the minimum and maximum number of casualties, writes out the result to the standard output.
给定n个神枪手,每个神枪手瞄准一个人,以一定顺序开枪,问最少和最多死多少人
输入输出格式
输入格式:
The first line of the standard input contains the number of participants
(
).
They are numbered from
to
.
The second line contains
integers
, separated by single spaces,
.
denotes the number of
participant's target.
Note that it is possible that
for some
(the nerves, you know).
输出格式:
Your programme should write out two integers separated by a
single space in the first and only line of the standard output. These
numbers should be, respectively, the minimum and maximum number of
casualties resulting from the shooting.
思路:
入度为0的人肯定死不了,跳过
自杀的救不了,跳过
剩下的就是一个仙人掌
对于一个独立的大小为n的环,最后至多剩下n/2个人,最少剩下一个人
对于一个独立的树,根肯定死不了然后就是个树上问题
环套数缩点瞎搞就行
代码:
#include<iostream>
#include<cstdio>
#include<stack>
#define rii register int i
using namespace std;
int n,to[],e,low[],c[],size[],a1,dfn[];
int a2,xt[],rh[],maxn,minx,rd[];
stack<int> q;
bool r[],zh[],ww[],ded[];
int bj(int x,int y)
{
if(x>=y)
{
x=y;
}
}
void tarjan(int x)
{
e++;
low[x]=dfn[x]=e;
r[x]=;
q.push(x);
if(!dfn[to[x]])
{
tarjan(to[x]);
low[x]=bj(low[x],low[to[x]]);
}
else
{
if(r[to[x]])
{
low[x]=bj(low[x],dfn[to[x]]);
} }
if(low[x]==dfn[x])
{
a1++;
do
{
a2=q.top();
q.pop();
r[a2]=;
c[a2]=a1;
size[a1]++;
}while(a2!=x);
}
}
int main()
{
scanf("%d",&n);
for(rii=;i<=n;i++)
{
scanf("%d",&to[i]);
if(to[i]==i)
{
minx++;
maxn++;
ded[i]=;
}
rd[to[i]]++;
}
for(rii=;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
while(!q.empty())
{
q.pop();
}
for(rii=;i<=n;i++)
{
if(c[i]!=c[to[i]])
{
xt[c[i]]=c[to[i]];
rh[c[to[i]]]++;
}
if(i==to[i])
{
zh[c[i]]=;
}
}
for(rii=;i<=n;i++)
{
if(!rd[i])
{
q.push(i);
}
}
while(!q.empty())
{
a2=q.top();
ww[c[a2]]=;
q.pop();
ww[c[to[a2]]]=;
if(!ded[to[a2]])
{
minx++;
ded[to[a2]]=;
a2=to[to[a2]];
rd[a2]--;
if(rd[a2]==&&!ded[a2])
{
q.push(a2);
}
}
}
for(rii=;i<=a1;i++)
{
if(size[i]!=&&!ww[i])
{
if(size[i]&)
{
a2=(size[i]+)>>;
}
else
{
a2=size[i]>>;
}
minx+=a2;
}
if(size[i]!=&&!rh[i])
{
maxn+=size[i]-;
}
if(size[i]!=&&rh[i])
{
maxn+=size[i];
}
if(size[i]==&&rh[i]&&!zh[i])
{
maxn++;
}
}
printf("%d %d",minx,maxn);
}
[POI2008]MAF-Mafia(图论,贪心)的更多相关文章
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
- Ant Man CodeForces - 704B (图论,贪心)
大意: 给N个点,起点S终点T,每个点有X,A,B,C,D,根据I和J的X坐标可得I到J的距离计算公式 |xi - xj| + ci + bj seconds if j< i |xi - xj| ...
- bzoj 1122 [POI2008]账本BBB 模拟贪心,单调队列
[POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 524 Solved: 251[Submit][Status][Disc ...
- 雅礼培训 Problem B 【图论 + 贪心】
题意 A和B在树上轮流选点,记A的联通块个数为\(x\),B的联通块个数为\(y\) A使\(x - y\)最大,B使\(x - y\) 二人采取最优策略,求\(x-y\) 题解 树联通块个数 = 点 ...
- [CSP-S模拟测试]:Graph(图论+贪心)
题目描述 给定一张$n$个点$m$条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通你想在这张图上进行若干次旅游,每次旅游可以任选一个点$x$作为起点,再走到一个与 $x$直接有边相连的点$ ...
- Codeforces 553D Nudist Beach(图论,贪心)
Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...
- 洛谷P1983 车站分级
P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...
- 洛谷P1546 最短网络 Agri-Net
P1546 最短网络 Agri-Net 526通过 959提交 题目提供者JOHNKRAM 标签图论贪心USACO 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 50分C++代码,求解 请指 ...
- ACM训练小结-2018年6月19日
今天题目情况如下: A题:考察图论建模+判割点.B题:考察基础数据结构的运用(STL).C题:考察数学建模+运算.(三分可解)D题:考察读题+建模+数据结构的运用.E题:考察图论+贪心.F题:考察图 ...
随机推荐
- ZROJ#397. 【18提高7】模仿游戏(爆搜)
题意 题目链接 Sol 考试的时候调了1.5h没调出来我真是菜爆了... 读完题目后不难发现,每次约束的条件相当于是\(b[((x[i] + i) % N + (i / N) % N) % N] = ...
- HTML表格相关元素
<table> 标签定义 HTML 表格.简单的 HTML 表格由 table 元素以及一个或多个 tr.th 或 td 元素组成.tr 元素定义表格行,th 元素定义表头,td 元素定义 ...
- Javascript:各种宽高
Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...
- ezdpl Linux自动化部署实战
最近把ezdpl在生产环境中实施了,再加上这段时间的一些修改,一并介绍一下. 再次申明: ezdpl不是开箱即用的,需要根据自己的应用环境定制.对初学者来说使用起来反倒困难更多.风险更大. 它不是一个 ...
- Microsoft BI - SSRS
1. Shared Dataset 功能在 SQL Server 2008 R2 / 2012 / 2014 的下列三个版本中不支持,详情请参考此处: Express Edition with Adv ...
- wxpython 界面布局
1.frame.Centre() 窗口出来后显示居中 2.textCtrl文本框style=wx.TE_PASSWORD密码, wx.TE_MULTILINE多行输入 3.单选按钮组 4.列表 5.图 ...
- Mysql 服务无法启动解决办法
1.我使用的是MySQL-5.7.10-winx64 版本,在安装后启动服务时出现 “服务无法启动”错误 2.解决办法为删除安装目录中的data文件,然后打开cmd调到自己的安装目录下输入mysqld ...
- ORACLE中一个字符占多少字节?
问题描述 或许你会说一个中文字符占2个字节,这是一定的?如何计算一个字符串的字节数? 解决方案 在oracle中一个字符特别是中文占几个字节是不同的. 比如我创立一个表create table tes ...
- ubuntu怎么关防火墙
1.关闭ubuntu的防火墙 ufw disable2.卸载了iptables apt-get remove iptables 1.用iptables -F这个命令来关闭防火墙,但是使用这个命令前,千 ...
- java 解压缩Zip文件 ziputil
package com.lanyuan.assembly.util; import java.io.BufferedOutputStream;import java.io.File;import ja ...