昨天改了1.5h了,今天还是RE
查看原帖
昨天改了1.5h了,今天还是RE
80679
Register楼主2020/10/4 12:45
#include <bits/stdc++.h>
#define mp make_pair
#define y e[x][i].vv
#define w e[x][i].cc
#define l e[x][i].ww
using namespace std;
typedef map<int,int>::iterator MI;
const int N=30005;
int t,tot,n,m,rt,s,ans,sz[N],ss[N];
bool vis[N];
struct edge{int vv,cc,ww;};
vector<edge> e[N];
void getrt(int x,int fa){
	ss[x]=0;
	for(int i=0;i<e[x].size();i++)
		if(y!=fa&&!vis[y]) {getrt(y,x);ss[x]=max(ss[x],sz[y]);}
	if((ss[x]=max(ss[x],s-sz[x]))<ss[rt]) rt=x;
}
void ins(map<int,int>&d,int p,int q){
	MI it=d.upper_bound(p);
	if((--it)->second<q){
		d[p]=q;it=d.upper_bound(p);
		while(it!=d.end()&&it->second<=q) d.erase(it++); 
	}
}
void getd(int x,int fa,int len,int val,map<int,int>&p){
	sz[x]=1;p[len]=val;
	for(int i=0;i<e[x].size();i++)
		if(y!=fa&&!vis[y]) {getd(y,x,len+w,val+l,p);sz[x]+=sz[y];}
}
int dfs(int x){
	vis[x]=1;map<int,int> d,p;d.clear();d[0]=0;
	for(int i=0;i<e[x].size();i++)
		if(!vis[y]){
			p.clear();getd(y,x,w,l,p);
			for(MI it=p.begin();it!=p.end();it++){
				MI now=d.upper_bound(m-it->first);
				if(now!=d.begin()) ans=max(ans,it->second+(--now)->second);
			}
			for(MI it=p.begin();it!=p.end();it++) ins(d,it->first,it->second);
		}
	for(int i=0;i<e[x].size();i++)
		if(!vis[y]) {ss[rt=0]=s=sz[y];getrt(y,x);dfs(rt);}
}
void solve(){
	scanf("%d%d",&n,&m);ans=0;
    for(int i=1;i<=n;i++) {e[i].clear();vis[i]=0;sz[i]=1;}
	for(int i=1,u,v,c,x;i<n;i++) {scanf("%d%d%d%d",&u,&v,&c,&x);e[u].push_back((edge){v,c,x});e[v].push_back((edge){u,c,x});}
	ss[rt]=s=n;getrt(1,0);dfs(rt);printf("Case %d: %d\n",++tot,ans);
}
signed main(){
	scanf("%d",&t);while(t--) solve();
	return 0;
}

爆栈什么的试过了,都改了14514次还是RE(难道要改19191810次吗)

2020/10/4 12:45
加载中...