题目描述
一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)
输入输出格式
输入格式:
第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai、bi
输出格式:
一个整数,表示最少有几个人说谎
——————————————————————————————————、
巨短的题面,巨大的码量,我要死了
与奶牛吃草重合了一部分,可以理解为使其升级版,一开始准备拓扑,结果被题解启发还是打了二分区间
还是很好的一个题的
// luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; int n,m,k,a,b,_ans,ne,head[100001],vis[100001],mk[1000001]; struct node {int nxt,to;}edge[1000001]; void adde(int from,int to){ edge[++ne].to=to; edge[ne].nxt=head[from]; head[from]=ne; } int dfs(int u) { for(int i=head[u];i;i=edge[i].nxt) { int g=edge[i].to; if(!mk[g]){mk[g]=1;if(!vis[g]||dfs(vis[g])) {vis[g]=u;return 1;}} } return 0; } int main() { cin>>n>>m>>k; while(k--){cin>>a>>b;if(a>n||b>m)continue;adde(a,b);} for(int i=1;i<=n;i++){ memset(mk,0,sizeof(mk));if(dfs(i))++_ans; } cout<<_ans; }