题意

\(n(n < 1000000)\)个人,每个人\(i\)指向一个人\(p_i\),如果轮到\(i\)了且他没死,则他会将\(p_i\)打死。求一种顺序,问死的人最少和最多的数目。

分析

贪心+乱搞

题解

最多剩下的:
链:(n+1)/2
环:n/2
环套内向树:维护没被杀的点,即用队列维护入度为0的点,然后环变成了一堆链,再用上面的结论即可。

最少剩下的:
链:1
环:1
环套内向树:入度为0的个数

#include <bits/stdc++.h>
using namespace std;
inline int getint() {
    int x=0, c=getchar();
    for(; c<48||c>57; c=getchar());
    for(; c>47&&c<58; x=x*10+c-48, c=getchar());
    return x;
}
const int N=1000005;
int to[N], in[N], q[N];
bool vis[N], del[N];
int main() {
    int n=getint(), ans1=0, ans2=0;
    for(int i=1; i<=n; ++i) {
        ++in[to[i]=getint()];
    }
    int *fr=q, *ta=q;
    for(int i=1; i<=n; ++i) {
        if(in[i]==0) {
            ++ans1;
            for(int j=i; !vis[j]; vis[j]=1, j=to[j]);
            *ta++=i;
        }
    }
    for(int i=1; i<=n; ++i) {
        if(!vis[i]) {
            int len=0;
            for(int j=i; !vis[j]; vis[j]=1, j=to[j], ++len);
            ans1+=len>1;
        }
    }
    memset(vis, 0, sizeof(bool)*(n+1));
    for(; fr!=ta; ) {
        int x=*fr++, y=to[x];
        vis[x]=1;
        if(!del[x]) {
            ++ans2;
            del[y]=1;
        }
        if(!--in[y]) {
            *ta++=y;
        }
    }
    for(int i=1; i<=n; ++i) {
        if(!vis[i] && del[i]) {
            int len=0;
            for(int j=i; !vis[j]; vis[j]=1, j=to[j]) {
                if(!del[j]) {
                    ++len;
                }
                else {
                    ans2+=(len+1)>>1;
                    len=0;
                }
            }
            ans2+=(len+1)>>1;
        }
    }
    for(int i=1; i<=n; ++i) {
        if(!vis[i]) {
            int len=0;
            for(int j=i; !vis[j]; vis[j]=1, j=to[j], ++len);
            ans2+=len>>1;
        }
    }
    printf("%d %d\n", n-ans2, n-ans1);
    return 0;
}

【BZOJ】1124: [POI2008]枪战Maf的更多相关文章

  1. BZOJ 1124: [POI2008]枪战Maf

    1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 617  Solved: 236[Submit][Status ...

  2. [POI2008]枪战Maf

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

  3. bzoj1124[POI2008]枪战maf

    这代码快写死我了.....死人最多随便推推结论.死人最少,每个环可以单独考虑,每个环上挂着的每棵树也可以分别考虑.tarjan找出所有环,对环上每个点,求出选它和不选它时以它为根的树的最大独立集(就是 ...

  4. 枪战Maf[POI2008]

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

  5. BZOJ 1113: [Poi2008]海报PLA

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1025  Solved: 679[Submit][Statu ...

  6. BZOJ 1116: [POI2008]CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 922  Solved: 514[Submit][Status][ ...

  7. BZOJ 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Statu ...

  8. BZOJ 1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 440[Submit][Status] ...

  9. BZOJ 1121: [POI2008]激光发射器SZK

    1121: [POI2008]激光发射器SZK Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 792  Solved: 653[Submit][Sta ...

随机推荐

  1. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  2. SQL Server基线算法(同比和环比)

    基线介绍 基线为历史数据统计而成的数据,具有参考价值,并利用基线数据与当前值的对比,通过一定的报警机制,形成实时监控架构.SQL Server计数器采用同比和环比两种方式. 同比:可以计算未来一周的基 ...

  3. 2016 - 1 - 25 CSS初步 (二)

    1.The customising link We can change the link's style when we move our pointer on the link like that ...

  4. 查看当前正在运行的activity

    找到sdk的安装路径,比如我的是 D:\prostu\Android\android-sdk\tools该路径下的: hierarchyviewer.bat 双击,可以用此工具查看设备跑的是当前的哪个 ...

  5. Beta项目冲刺&ndash;第四天

    考试太多,做项目的时间太少-- 队伍:F4 成员:031302301 毕容甲 031302302 蔡逸轩 031302430 肖阳 031302418 黄彦宁 会议内容: 1.站立式会议照片: 2.项 ...

  6. Jquery禁止/恢复按钮与文本框代码

    最近,加入了一个小项目,由浩哥带领我们几个人一起开发一个东西.幸运的是,我和胡志婷分到了一组,她可是一个具有丰富经验的牛人,对我也很好,哈哈. --背景 说点正事,最近,我们在进行项目的时候,提到了一 ...

  7. iOS:Xcode8以下真机测试iOS10.0和iOS10.1配置包

    一.介绍 xcode的升级都已经到8系列了,可是还是有很多开发者使用的xcode还是7系列,然而xcode7...最多支持9.3,无法给升级到10.0和10.1的iPhone手机用户进行真机测试.此时 ...

  8. Scanner

    /* next()与nextLine()区别 next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉. 3.只有输入有效字符后才将 ...

  9. tcpdump抓包规则命令大全

    下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo. 1.抓取包含10.10.10.122的数据包 # tcpdump -i eth0 -vnn host 1 ...

  10. 百度编辑器Ueditor自动换行,添加&lt;p&gt;的问题

    百度编辑器Ueditor其实蛮好用的,后来使用了一段时间发现,每次打开后又保存,发现都会往内容的前后都增加一个空白的<p></p>.刚开始以后是百度编辑器的问题,找了很长时间也 ...