月赛div2 T3 调 2h 依然爆蛋。
  • 板块学术版
  • 楼主Miraik
  • 当前回复14
  • 已保存回复14
  • 发布时间2022/7/17 18:31
  • 上次更新2023/10/27 19:50:52
查看原帖
月赛div2 T3 调 2h 依然爆蛋。
236862
Miraik楼主2022/7/17 18:31

不是求调代码,我知道也没人帮我调。

只是感受到了没有代码能力的绝望。

心态有点崩,本来打算把预处理调出来后整一波正解的,结果直接爆蛋,保底分都没拿到。

被自己菜哭了。

#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define mp make_pair
#define sec second
#define fir first
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
using namespace std;
typedef long long ll;
const int N=1000005;
const int NS=1005;
const int inf=(1<<30)-1;
const ll inff=1ll<<60;
const int mod=1e9+7;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int n,k;
int R,len,mx;
int tot,vec[N];
int top,stc[N];
int vis[N],cir[N],dep[N];
int c[N],p;
int sx[N],ans;
struct Altale{
	int x,y;
}a[N];
bool cmp(Altale a,Altale b){
	return a.y>b.y;
}
bool cmp2(Altale a,Altale b){
	return a.x>b.x;
}
int cnt;
struct Edge{
	int from,to,nxt;
}e[N<<1];
int head[N],edcnt;
void add(int u,int v){
	e[++edcnt].from=u;
	e[edcnt].to=v;
	e[edcnt].nxt=head[u];
	head[u]=edcnt;
}
void dfs(int u,int fa,int anc){
//	printf("%d %d %d\n",u,fa,anc);
	vis[u]=1;
	vec[++tot]=u;
	stc[++top]=u;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa || (v!=anc&&vis[v])) continue;
		if(v==anc){
//			printf("%d %d %d\n",u,v,fa);
			R=1;
			len=dep[u];
			for(int j=1;j<=len;j++) cir[stc[top]]=1,top--;
			continue;
		}
		dep[v]=dep[u]+1;
		dfs(v,u,anc);
	}
	top--;
}
void dfs2(int u,int fa,int now){
//	printf("%d %d %d\n",u,fa,now);
	mx=max(mx,now);
	vis[u]=2;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(cir[v] || vis[v]==2) continue;
		dfs2(v,u,now+1);
	}
}
void expand(int u){
	dep[u]=1; vis[u]=1;	
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(vis[v]){
			continue;
		}
		R=len=tot=0;
		dep[v]=2;
		top=1; stc[1]=u;
		dfs(v,u,u);
		if(R){
			mx=0;
			for(int j=1;j<=tot;j++)
			    if(!cir[vec[j]] && vis[vec[j]]!=2)
			        dfs2(vec[j],-1,1);
			a[++cnt].x = mx , a[cnt].y = tot;
		}
	    else a[++cnt].x = tot , a[cnt].y = tot;
	}
}
void solve(){
	sort(a+1,a+n+1,cmp2);
    for(int i=1;i<=n;i++){
    	sx[i]=sx[i-1]+a[i].x;
    	if(sx[i]>=k){
    		ans=min(ans,i);
    		break;
    	}
    }
	sort(a+1,a+cnt+1,cmp);
    for(int i=1;i<=cnt;i++) sx[i]=sx[i-1]+a[i].x;
    ans=inf;
    for(int i=1;i<=cnt;i++){
    	int now = sx[i-1]+a[i].y;
    	if(now>=k){
    		ans=min(ans,i+1);
    		continue;
    	}
    	int res=i+1;
    	p=0;
    	for(int j=1;j<i;j++)
    	    c[++p]=a[j].y-a[j].x;
    	for(int j=i+1;j<=cnt;j++)
    	    c[++p]=a[j].x;
    	sort(c+1,c+p+1);
    	for(int j=p;j;j--){
    		now += c[j];
    		res++;
    		if(res>=ans) break;
    		if(now>=k){
    			ans=res;
    			break;
    		}
    	}
    }
    printf("%d\n",ans);
}
int main(){int tests=1;//tests=read();
while(tests--){
	n=read(),k=read();
	for(int i=1;i<=n;i++){
		int u=read(),v=read();
		add(u,v); add(v,u);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			if(f[i]!=i) while(1);
			expand(i);
		}
	}
//	printf("cnt:%d\n",cnt);
//	for(int i=1;i<=cnt;i++) printf("1:%d 2:%d\n",a[i].x,a[i].y);
    solve();
}	return 0;
}
/*
6 3
1 3 
2 3 
2 5 
3 4 
4 5 
4 6

17 9
1 2
1 6
1 3
3 4
4 5
5 6
6 7
16 10
10 9
10 11
11 12
11 13
13 14
14 16
15 13
8 16
8 17
*/
2022/7/17 18:31
加载中...