BZOJ1854 连续攻击游戏 题解

前言:

这个题很有意思。在考试的时候并没有想出来。最后大法师了50分就滚蛋了。后来发现解法很多。学习一下。

1.最好拿分:拉斯维加斯剪枝(来自Liu_yi_tong)

当我知道这也能AC掉这道题的时候,我的内心是崩溃的。
后来我也写了一下:

发现即使运气再不好,也能拿90。。。
其实应该是我瞎jb搞了个random_shuffle,时间开销有点大,然后就T了?
反正把random_shuffle去掉就A了。
应该大家都会拉斯维加斯剪枝,就只放代码了。



#include <bits/stdc++.h>
using namespace std;
const int maxn=1000000+10,maxm=10000+10;
vector <int> a[maxm];
struct node{
	int x,y;
}b[maxn];
bool vis[maxn];
int ans,n,Time;
void dfs(int now,int x){
	if(vis[x]) return;
	if(Time>6e7) return;
	Time++;
	vis[x]=1;
	for(int i=0;i<a[now+1].size();++i){
		Time++;
		dfs(now+1,a[now+1][i]);
	}
	ans=max(ans,now);
	vis[x]=0;
}
void Solve(){
	//srand(time(NULL));
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&b[i].x,&b[i].y);
		a[b[i].x].push_back(i);
		a[b[i].y].push_back(i);
	}
	/*
	for(int i=1;i<=10000;++i){
		if(a[i].size()) random_shuffle(a[i].begin(),a[i].end());
	}//加上这个就90,我也不知道为什么
	*/
	for(int i=0;i<a[1].size();++i){
		dfs(1,a[1][i]);
	}
	printf("%d\n",ans);
}
int main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	Solve();
	return 0;
}

2.貌似没人写的并查集方法

今天考试,Youxam坐我旁边。我吃完饭刚到机房,Youxam就跟我说他做过这个题,是个并查集。
当时我心里:mmp,我tm谢谢你啊
当时我心态就有点崩。后来看了15分钟没啥思路,心态就更崩了。
后来考试结束以后,Youxam也没写出来并查集。。。哈 哈 哈
反正最后我翻开了Youxam的题解 学习了一下。
维护一个vis数组。
首先,把每一个武器的两个节点合并起来,让较大的点做父亲。然后把较小的点的原祖先的vis设为1。
到最后扫一遍vis数组,遇到第一个vis值为0的点i,就输出i-1即为答案。
正确性。。。。并不会证。但是想了半天,我觉得挺对劲的。
代码:

#include <bits/stdc++.h>
using namespace std;
const int manx=1000000+10,maxm=10000+10;
int vis[maxm],fa[maxm];
int n;
int find(int x){
	return x==fa[x] ? x : (fa[x]=find(fa[x]));
}
void Merge(int x,int y){
	int fx=find(x);
	int fy=find(y);
	vis[fx]=1;
	if(fx!=fy) fa[fx]=fy;
}
void Solve(){
	scanf("%d",&n);
	for(int i=1;i<=10000;++i) fa[i]=i;
	for(int i=1,x,y;i<=n;++i){
		scanf("%d%d",&x,&y);
		if(x>y) swap(x,y);
		Merge(x,y);
	}
	for(int i=1;i<=10000+1;++i){	
		if(!vis[i]){
			printf("%d\n",i-1);
			break;
		}
	}
}
int main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	Solve();
	return 0;
}

3.O(n)的贪心

并没有看懂。
https://www.luogu.com.cn/blog/crpboy/solution-p1640#

4.网络流

并不会。复杂度O(跑的过)
https://www.luogu.com.cn/blog/command-block/solution-p1640

5.二分图

posted @ 2020-10-13 15:35  “起个名字真难♘”  阅读(116)  评论(0编辑  收藏  举报