今天在看题解查如何缩减复杂度的时候看到一个巨巨方法
用时间点来查重!
由于每一次memset来实在是太慢了
直接记录每一次进去的大小
比如第一次进入是 1 只需判断vis[i]是否为1就行
第二次进入是2 只需判断vis[i]是否为2就行!!
太巨了膜拜 我洛谷直接关注
#include<iostream>
#include<cstring>
#define IOS ios::sync_with_stdio(false)
using namespace std;
const int N = 5e6 + 10;
int head[N],to[N],last[N],cnt;
void add(int a,int b){
to[++cnt] = b;
last[cnt] = head[a];
head[a] = cnt;
}
int a[N],b[N];
int now;
int flag[N],match[N];
bool find(int x){
for(int i = head[x]; i != -1; i = last[i]){
int j = to[i];
if(flag[j] != now){
flag[j] = now;
if(!match[j] || find(match[j])){
match[j] = x;
return true;
}
}
}
return false;
}
int main(){
IOS;
int n;
cnt = 0;
memset(head,-1,sizeof head);
cin >> n;
int maxn = 0;
for(int i = 1; i <= n; i++){
cin >> a[i] >> b[i];
add(a[i],i),add(b[i],i);
}
int ans = 0;
for(int i = 1;; i++){
now = i;
if(find(i)){
ans++;
}else break;
}
cout << ans << endl;
return 0;
}