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