TJOI2018 智力竞赛

这题做的真的让我没了智力...

题目大意:
从n个点的图中选出n + 1条链问是否能够全部覆盖(可相交),如果不能,输出覆盖的最小点权最小值最大是多少?

思路:
最小值最大问题考虑二分,二分答案用二分图匹配去求链覆盖即可,记得floyd处理闭包。

吐槽:
调了半天发现是二分上界太大...wtf?

Code:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 510;
const int INF = 1e9;
int v[MAXN];
int f[MAXN][MAXN];
int match[MAXN];
int a[MAXN];
int l;
int m;
int cnt;
int n;
int ans;
int mx;
int vis[MAXN];
int mk[MAXN][MAXN];
int r;
int read () {
    int q=0,f=1;char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        q=q*10+ch-'0';ch=getchar();
    }
    return q*f;
}
int dfs(int x) {
    for(int i = 1;i <= cnt; ++i) {
        if(!vis[i] and mk[a[x]][a[i]]) {
            vis[i] = 1;
            if(!match[i] or dfs(match[i])) {
                match[i] = x;
                return true;
            }
        }
    }
    return false;
}

int ok(int mid) {
    cnt = 0;
    for(int i = 1;i <= m; ++i) {
        if(v[i] < mid) a[++cnt] = i;
    }
    int res = cnt;
    for(int i = 1;i <= cnt; ++i) {
        memset(vis,0,sizeof vis);
        res -= dfs(i);
    }
    return res;
}
void floyd() {
    for(int k = 1;k <= m; ++k) {
        for(int i = 1;i <= m; ++i) {
            for(int j = 1;j <= m; ++j) {
                mk[i][j] |= mk[i][k] & mk[k][j];
            }
        }
    }
}
int main () {
    n = read(),m = read();
     ++ n;
    for(int i = 1;i <= m; ++i) {
        v[i] = read();int tmp = read();
        mx = max(mx,v[i]);
        for(int j = 1;j <= tmp; ++j) {
            int x = read();
            mk[i][x] = 1;
        }
    }
    floyd();
    l = 1;
    r = mx;
    ans = 0;
    while(l <= r) {
        int mid = (l + r) >> 1;
        memset(match,0,sizeof match);
        if(ok(mid) <= n) {
            l = mid + 1;
            ans = mid;
        }
        else r = mid - 1;
    }
    if(ans >= mx) puts("AK");
    else printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/akoasm/p/10105536.html

时间: 2024-07-30 07:48:53

TJOI2018 智力竞赛的相关文章

BZOJ5335:[TJOI2018]智力竞赛——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m道题目,每个入都有1次答题机会,每次答题为选择一道题目回答,在回答正确后,可以从这个题目的后续题目,直达题目答错题目或者没有后续题目.每个问题都会代表一个价值,比赛最后的参赛选手获得奖励价值等价于该选手和他的亲友团没有回答的问题中的最低价值.我们现在知道小豆和他的亲友团实力非常强,能够做出这次竞赛中

bzoj5335: [TJOI2018]智力竞赛

这道题做了一个多月?感谢噶爷教我做题 (滑稽)自己给自己停bc准备中考然而还是考的不咋地 这道题二分之后就是找最小链覆盖,算经典的吧. 注意下那个权可能重复啊,二分要离散化..(然而我WA无数次的原因居然是打了个match[y]==false什么鬼) #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #includ

[Offer收割]编程练习赛3 - 题目3 : 智力竞赛

智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mean: 略(中文题). analyse: 比赛中最先想到的是三维dp,但思考后发现可以压缩为二维,状态转移方程: dp[i][j]=min(dp[i][j],dp[i][j-(right+fault)]+right) 其中dp[i][j]表示: 到通过第i关为止,在总共只有j次答题机会的情况下,总共至

hihocoder #1285 智力竞赛

传送门 总结: 1.仔细读题 2.仔细分析复杂度 3.不要想当然,乱下结论 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小Hi他们需要获得Ai点分数才能够进入下一关.每一关的分数都是独立计算的,即使在一关当中获得超过需要的分数,也不会对后面的关卡产生影响. 小Hi他们可以通过答题获得分数.答对一道题获得S点分数,答错一道题获得T点分数.在所有的N个关卡中

[TJOI 2018] 智力竞赛

[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5335 [算法] 首先发现答案具有单调性 , 不妨二分答案mid 将所有权值小于mid的 , 且在原图上可以互相到达的点连边 那么我们需要判断新图的最小可重路径点覆盖是否 <= n + 1 直接网络流 / 匈牙利算法解决 时间复杂度 : O(M ^ 3logM) [代码] #include<bits/stdc++.h> using namespace std; #define

TJOI2018

好像被老张坑了,TJ省选怎么出六道送分题啊..... d1t1[TJOI2018]数学计算 线段树模板题. //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> #inc

luogu 乘积最大

题目描述 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

2000年 乘积最大

乘积最大 题目描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

CodeVS 1017 乘积最大

1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K