[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题:考察图 ...
随机推荐
- Java基础入门 - 简介
官网:https://www.oracle.com Java分为三个体系: JavaEE: Java Platform, Enterprise Edition, Java平台企业版 JavaSE: J ...
- html+css动态篇
transition过渡 transform旋转 animation动画 一般是父div包含两个子div,一个写鼠标悬浮之前,一个写鼠标悬浮之后, 鼠标悬浮之后的div要写overflow:hidde ...
- 【数据库】6.0 MySQL入门学习(六)——MySQL启动与停止、官方手册、文档查询
1.0 MySQL主要有四种启动方式:直接启动.安全启动.服务启动.多实例启动. 直接启动: 服务器启动: 安全启动(最常用): 多实例启动: 2.0如何获得MySQL帮助 2.1官方手册 下面提供百 ...
- bootstrap模态框实现相对定位拖拽
1.正常的拖拽是用绝对定位absolute来实现的,可是bootstrap的模态框是用relative,为了统一更改方便,就照着相对定位来实现拖拽效果. $(".modal .modal-h ...
- C语言字符数组与字符串
研究几个案例: 输出图案: #include <stdio.h> void main() { ][] = { {', ' ', ' '}, {', ' '}, {'}, {', ' '}, ...
- linux 中环境变量配置文件说明
1. 修改/etc/profile文件 特点:所有用户的shell都有权使用你配置好的环境变量 说明:如果你的电脑仅用作开发,建议使用此配置,因为所有用户的shell都有权使用你配置好的环境变量,所以 ...
- AJAX 学习笔记 2017_05_04
1.使用 AJAX 修改该文本内容 <%@ page language="java" contentType="text/html; charset=UTF-8&q ...
- java面试题之----转发(forward)和重定向(redirect)的区别
阅读目录 一:间接请求转发(Redirect) 二:直接请求转发(Forward) 用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相 ...
- BIEE入门(四)展现层
BIEE里最终面向最终用户(业务界面使用者的)叫做BIEE的Presentation Layer也即展现层,展现层的定义将是最终用户Web报表开发界面里能够看见的完全一样的样子,所以展现层一般将是以最 ...
- Flask入门 表单Flask-wtf form原生 Bootstrap渲染(七)
(1) 原生的表单 模板页面,form表单form.html <form action="{{ url_for('/check/') }}" method='post'> ...