题目描述

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(图论,贪心)的更多相关文章

  1. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  2. 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| ...

  3. bzoj 1122 [POI2008]账本BBB 模拟贪心,单调队列

    [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 524  Solved: 251[Submit][Status][Disc ...

  4. 雅礼培训 Problem B 【图论 + 贪心】

    题意 A和B在树上轮流选点,记A的联通块个数为\(x\),B的联通块个数为\(y\) A使\(x - y\)最大,B使\(x - y\) 二人采取最优策略,求\(x-y\) 题解 树联通块个数 = 点 ...

  5. [CSP-S模拟测试]:Graph(图论+贪心)

    题目描述 给定一张$n$个点$m$条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通你想在这张图上进行若干次旅游,每次旅游可以任选一个点$x$作为起点,再走到一个与 $x$直接有边相连的点$ ...

  6. Codeforces 553D Nudist Beach(图论,贪心)

    Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...

  7. 洛谷P1983 车站分级

    P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...

  8. 洛谷P1546 最短网络 Agri-Net

    P1546 最短网络 Agri-Net 526通过 959提交 题目提供者JOHNKRAM 标签图论贪心USACO 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 50分C++代码,求解 请指 ...

  9. ACM训练小结-2018年6月19日

    今天题目情况如下:  A题:考察图论建模+判割点.B题:考察基础数据结构的运用(STL).C题:考察数学建模+运算.(三分可解)D题:考察读题+建模+数据结构的运用.E题:考察图论+贪心.F题:考察图 ...

随机推荐

  1. (三)HTML中的列表标签、框架集及表单标签

    一.HTML的列表标签 在网页中,经常可以看到,有的内容排列如同word里面的项目编号,这就是HTML的无序排列和有序排列起到的作用.. HTML之无序排列:<ul></ul> ...

  2. ThreadPoolExecutor(上篇)

    Java有两个线程池类:ThreadPoolExecutor和ScheduledThreadPoolExecutor,继承AbstractExecutorService类,AbstractExecut ...

  3. javascript小数相减出现一长串的小数位数

    我们要修改网页某个数据的显示格式,需要两步操作: 1.在JS中通过$('.class1 .class2 li:eq(2) span.value').text().trim();类似的语句获取到数据内容 ...

  4. 类的方法练习——定义MySQL类

    要求: 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和port 方式二: ...

  5. easyui datebox 精确到秒并且显示值

    其实这个官网文档有的,也就不啰嗦了,直接贴官网的代码吧. <input id="dt" type="text" name="birthday&q ...

  6. asp.net学习视频大全(共800集)

    今天在网上找asp.net学习视频时,发现了一些好的学习资源,记录一下供大家学习. 资料名称 下载地址 <ASP.NET4.0从入门到精通>随书教学视频  http://down.51ct ...

  7. 刚在虚拟机上装的Linux系统,ifconfig后IP地址怎么成了127.0.0.1了

    之前在虚拟机上装了Linux系统,用了一段时间后想删除了重新装一下,然而装完以后ifconfig后,出现的是 [root@localhost ~]# ifconfig lo Link encap:Lo ...

  8. Shader之ShaderUI使用方法

    shader中的宏定义在material中Inspector中打开 Shader "Custom/Redify" { Properties{ _MainTex("Base ...

  9. CSS3中的Flexbox弹性布局(一)

    CSS3引入了一种新的布局模式——Flexbox布局,即伸缩布局盒模型(Flexible Box),用来提供一个更加有效的方式制定.调整和分布一个容器里项目布局,即使它们的大小是未知或者动态的,这里简 ...

  10. python memory-management

    http://deeplearning.net/software/theano/tutorial/python-memory-management.html