[2018HN省队集训D9T1] circle
[2018HN省队集训D9T1] circle
题意
给定一个 \(n\) 个点的竞赛图并在其中钦定了 \(k\) 个点, 数据保证删去钦定的 \(k\) 个点后这个图没有环. 问在不删去钦定的这 \(k\) 个点的情况下最少要删几个点让原图没有环. 如果不存在答案小于 \(k\) 的解则输出 impossible
.
\(n,k\le2000\).
题解
好像这篇草稿鸽的时间有点久qaq
首先一个显然的性质是无环的竞赛图一定是一个全序集.
其次是如果钦定的点不是全序集那么必定无解.
无解判掉之后所有的点就被分成了两个全序集合(数据保证剩下的点无环). 我们枚举剩下的点看它能不能合法插入被钦定的全序集中. 对于能合法插入的点, 一定会有一个唯一的插入位置. 显然我们必须让这些点的插入位置递增(因为要满足两个全序关系). 于是我们按照全序顺序把所有能插入的点的插入位置求出来, 然后在上面求一个最长上升子序列就好了.
时间复杂度 \(O(n^2)\).
参考代码
#include <bits/stdc++.h>
const int MAXN=2010;
int n;
int k;
int val[MAXN];
int cnt[MAXN];
bool blk[MAXN];
int m[MAXN][MAXN];
std::vector<int> s;
std::vector<int> r;
void Fail();
int ReadInt();
int main(){
n=ReadInt();
k=ReadInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
m[i][j]=ReadInt();
for(int i=0;i<k;i++){
s.push_back(ReadInt());
blk[*s.rbegin()]=true;
}
for(int i=1;i<=n;i++)
if(!blk[i])
r.push_back(i);
auto cmp=[](int a,int b){return bool(m[a][b]);};
std::sort(r.begin(),r.end(),cmp);
std::stable_sort(s.begin(),s.end(),cmp);
for(int i=0;i<k;i++)
for(int j=i+1;j<k;j++)
if(!cmp(s[i],s[j]))
Fail();
for(auto i:r){
bool flag=true;
for(auto j:s){
if((!flag)&&cmp(j,i)){
val[i]=-1;
break;
}
flag&=cmp(j,i);
if(flag)
++val[i];
}
}
int ans=0;
for(auto i:r){
if(val[i]==-1)
continue;
cnt[i]=1;
for(auto j:r){
if(i==j)
break;
if(val[j]!=-1&&val[j]<=val[i])
cnt[i]=std::max(cnt[i],cnt[j]+1);
}
ans=std::max(ans,cnt[i]);
}
ans=r.size()-ans;
if(ans<k)
printf("%d\n",ans);
else
Fail();
return 0;
}
void Fail(){
puts("impossible");
exit(0);
}
int ReadInt(){
int x=0;
register char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
[2018HN省队集训D9T1] circle的更多相关文章
- [2018HN省队集训D8T1] 杀毒软件
[2018HN省队集训D8T1] 杀毒软件 题意 给定一个 \(m\) 个01串的字典以及一个长度为 \(n\) 的 01? 序列. 对这个序列进行 \(q\) 次操作, 修改某个位置的字符情况以及查 ...
- [2018HN省队集训D8T3] 水果拼盘
[2018HN省队集训D8T3] 水果拼盘 题意 给定 \(n\) 个集合, 每个集合包含 \([1,m]\) 中的一些整数, 在这些集合中随机选取 \(k\) 个集合, 求这 \(k\) 个集合的并 ...
- [2018HN省队集训D6T2] girls
[2018HN省队集训D6T2] girls 题意 给定一张 \(n\) 个点 \(m\) 条边的无向图, 求选三个不同结点并使它们两两不邻接的所有方案的权值和 \(\bmod 2^{64}\) 的值 ...
- [Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform
[Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform 题意 给定一个小写字母构成的字符串, 每个字符有一个非负权值. 输出所有满足权值和等于这个子串在所有本质 ...
- [2018HN省队集训D5T2] party
[2018HN省队集训D5T2] party 题意 给定一棵 \(n\) 个点以 \(1\) 为根的有根树, 每个点有一个 \([1,m]\) 的权值. 有 \(q\) 个查询, 每次给定一个大小为 ...
- [2018HN省队集训D5T1] 沼泽地marshland
[2018HN省队集训D5T1] 沼泽地marshland 题意 给定一张 \(n\times n\) 的棋盘, 对于位置 \((x,y)\), 若 \(x+y\) 为奇数则可能有一个正权值. 你可以 ...
- [Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard
[Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard 题意 给定一个 \(n\times n\) 的矩阵 \(A\), (\(n\) 为奇数) , ...
- [2018HN省队集训D1T3] Or
[2018HN省队集训D1T3] Or 题意 给定 \(n\) 和 \(k\), 求长度为 \(n\) 的满足下列条件的数列的数量模 \(998244353\) 的值: 所有值在 \([1,2^k)\ ...
- [2018HN省队集训D1T1] Tree
[2018HN省队集训D1T1] Tree 题意 给定一棵带点权树, 要求支持下面三种操作: 1 root 将 root 设为根. 2 u v d 将以 \(\operatorname{LCA} (u ...
随机推荐
- js实现时间日期的格式化
前几天参加cvte的笔试,碰到了这样一道题目: //请写一个时间日期格式化的函数,具体要求如下: function format(date,"yyyy-mm-dd HH-mm-ss" ...
- Netty 高性能之道 FastThreadLocal 源码分析(快且安全)
前言 Netty 作为高性能框架,对 JDK 中的很多类都进行了封装了和优化,例如 Thread 类,Netty 使用了 FastThreadLocalRunnable 对所有 DefaultThre ...
- new~mac os 给终端命令写alias(及其他常用命令)及软连接
配置执行顺序 优先级 配置 说明 1 /etc/profile 系统级别 —— 不推荐修改 2 /etc/paths 系统级别 —— 不推荐修改 3 ~/.profile 用户设置 4 ~/.bash ...
- SQL Server T—SQL 基本编程
一 定义变量 declare @变量名 数据类型 例:declare @a int -- 变量名前必须有 @ 二 赋值 set @变量名 = 值 sele ...
- Java基础——ArrayList与LinkedList(一)
一.定义 ArrayList和LinkedList是两个集合类,用于储存一系列的对象引用(references). 引用的格式分别为: ArrayList<String> list = n ...
- java数组创建
java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小
- Mybatis插件开发
前面几篇文章介绍了Mybtis中四个重要的对象,其中提到它们都是在Configuration中被创建的,我们一起看一下创建四大对象的方法,代码如下所示: public ParameterHandler ...
- java设计模式-----24、访问者模式
概念: Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作. 访问者模式的应用示例 比如有一个公园,有一到多个不同 ...
- 微信小程序传参数的几种方法
1,navigator 跳转时 wxml页面(参数多时可用“&”) <navigator url='../index/index?id=1&name=aaa'></n ...
- [Android] Linux下JNI简单实现过程
大概梳理了一下JNI的过程: start->先写好A.java文件,里面添加native方法B,调用库C.so->编译成.class文件->用javac生成.h文件,文件包含Java ...