P2519 [HAOI2011]problem a

题目描述

一次考试共有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;
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/10924078.html