洛谷P1640 [SCOI2010]连续攻击游戏

今天在看题解查如何缩减复杂度的时候看到一个巨巨方法
用时间点来查重!
由于每一次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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值