【LOJ】#2574. 「TJOI2018」智力竞赛
题解
二分答案
求最小路径点覆盖
由于这里最小路径点覆盖,点是可重的,用floyd求出传递闭包(也就是求出,哪两点之间是可达的)
最后用这个floyd求出的数组建出一个新图,在这个图上跑普通的最小路径点覆盖即可
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 1000005
//#define ivorysi
#define pb push_back
#define mo 1000007
#define pii pair<int,int>
#define mp make_pair
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int N,M,w[505],f[505][505],d[505][505],num[505];
struct node {
int to,next;
}E[2000005];
int sumE,head[505],matk[505];
bool vis[505];
bool match(int u) {
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v]) {
vis[v] = 1;
if(!matk[v] || match(matk[v])) {
matk[v] = u;
return true;
}
}
}
return false;
}
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
bool check(int mid) {
for(int i = 1 ; i <= M ; ++i) {
if(w[i] >= mid) continue;
for(int j = 1 ; j <= M ; ++j) {
if(w[j] >= mid) continue;
d[i][j] = f[i][j];
}
}
for(int k = 1 ; k <= M ; ++k) {
for(int i = 1 ; i <= M ; ++i) {
for(int j = 1 ; j <= M ; ++j) {
d[i][j] |= d[i][k] & d[k][j];
}
}
}
int res = 0;
memset(head,0,sizeof(head));sumE = 0;
for(int i = 1 ; i <= M ; ++i) {
if(w[i] < mid) ++res;
else continue;
for(int j = 1 ; j <= M ; ++j) {
if(d[i][j]) add(i,j);
}
}
if(res <= N) return true;
memset(matk,0,sizeof(matk));
for(int i = 1 ; i <= M ; ++i) {
if(w[i] >= mid) continue;
memset(vis,0,sizeof(vis));
if(match(i)) --res;
}
return res <= N;
}
void Solve() {
read(N);read(M);
++N;
for(int i = 1 ; i <= M ; ++i) {
read(w[i]);
num[i] = w[i];
int k;read(k);
for(int j = 1 ; j <= k ; ++j) {
int v;read(v);
f[i][v] = 1;
}
}
sort(num + 1,num + M + 1);
int L = 1,R = M + 1;
while(L < R) {
int mid = (L + R + 1) >> 1;
if(check(num[mid])) L = mid;
else R = mid - 1;
}
if(R == M + 1) puts("AK");
else {out(num[R]);enter;}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【LOJ】#2574. 「TJOI2018」智力竞赛的更多相关文章
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- sys模块python
sys模块 1: sys是python自带模块. 利用 import 语句输入sys 模块. 当执行import sys后, python在 sys.path 变量中所列目录中寻找 sys 模块文件. ...
- nginx client ip配置
server { listen 80; server_name localhost; location /{ root html; index index.html index.htm; proxy_ ...
- 如何写一个好bug
自己的总结,和大家分享~
- 装好Linux后没有声音的看过来
现代的Linux发行版对声卡的支持都应该没有问题.系统装好,声卡就应该正常工作. (尤其是ArchLinux,我觉得对硬件支持最跟得上时代步伐.) 可是我用mplayer播放mp3文件却没有声音,但也 ...
- 2016-2017-20155329 《Java程序设计》第7周学习总结
学号 2016-2017-20155329 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治标准时间(GMT时间) 世界时(UT) 国际原子时(TAI) 世界协调 ...
- 微服务深入浅出(3)-- 服务的注册和发现Eureka
现来说一些Eureka的概念: 1.服务注册 Register 就是Client向Server注册的时候提供自身元数据,比如IP和Port等信息. 2.服务续约 Renew Client默认每隔30s ...
- java基础学习:JavaWeb之Cookie和Session
一.会话概述 1.1.什么是会话? 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话其中不管浏览器发送多少请求,都视为一次会话,直到 ...
- 标准vim配置文件 带注释(适合C++编译)
我的vim配置文件,适合大多数人习惯 """""""""""""&qu ...
- 《区块链100问》第85集:资产代币化之对标美元USDT
USDT是Tether公司推出的对标美元(USD)的代币Tether USD.1USDT=1美元,用户可以随时使用USDT与USD进行1:1兑换.Tether公司执行1:1准备金保证制度,即每个USD ...
- 10种CSS3实现的Loading效果
原文链接:http://www.cnblogs.com/jr1993/p/4622039.html 第一种效果: 代码如下: <div class="loading"> ...