Mn Zn求助二分の奇怪现象
查看原帖
Mn Zn求助二分の奇怪现象
341034
abcde777楼主2021/10/25 14:43

关于

int l=0,r=50000000000000,ans=-1;

如果把二分上界设成5e13,wa7

设成5e16,wa5

设成5e12,wa10

设成5e15,wa5和7

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define I inline
#define noe noelle
#define nnq nanachi
#define int __int128
using namespace std;

const int N = 1001000;
struct node {
	int to,val;
	node(int tt=0,int vv=0) {
		to=tt; val=vv;
	}
};
struct jd {
	int rev,num;
	jd(int rr=0,int nn=0) {
		rev=rr; num=nn;
	}
};
bool vis[N],cant[N];
jd ok[N];
int ned[N];
int n,m,lcnt,dis[N],leaf[N],leafhav[N],leafok[N],top[N],pos[N],f[N][21],mkval[N];
vector<node> q[N];

I bool cmp(int n1,int n2) {
	return mkval[n1]>mkval[n2];
}
I bool cmp2(jd j1,jd j2) {
	return j1.rev>j2.rev;
}
void dfs(int x,int fa) {
	if(fa&&q[x].size()==1) leaf[++lcnt]=x;
	f[x][0]=fa;
	for(int i=0;i<=19;++i) f[x][i+1]=f[f[x][i]][i];
	for(int i=0;i<q[x].size();++i) {
		int to=q[x][i].to,val=q[x][i].val;
		if(to==fa) continue;
		dis[to]=dis[x]+val;
		dfs(to,x);
	}
}
I int find(int x,int ndis) {
	int mk=x;
	for(int i=20;i>=0;--i) {
		if(!f[x][i]||dis[mk]-dis[f[x][i]]>ndis) continue;
		x=f[x][i];
	}
//	cout<<mk<<' '<<x<<' '<<ndis<<"nsnschi"<<endl;
	return x;
}
void dealtop(int x,int fa,int tp) {
	top[x]=tp;
	for(int i=0;i<q[x].size();++i) {
		int to=q[x][i].to;
		if(to==fa) continue;
		dealtop(to,x,tp);
	}
}
void trans(int x) {	
	if(q[x].size()==1&&x!=1&&!vis[x]) leafok[top[x]]++;
	vis[x]=1;
	for(int i=0;i<q[x].size();++i) {
		int to=q[x][i].to; 
		if(to==f[x][0]) continue;
		if(!vis[to]) trans(to);
	}
}
I bool check(int t) {
	memset(vis,0,sizeof(vis));
	memset(cant,0,sizeof(cant));
	memset(leafok,0,sizeof(leafok));
	int nedcnt=0,okcnt=0;
	for(int i=1;i<=m;++i) {
		int now=pos[i];
		if(leafok[now]==leafhav[now]&&dis[now]<t) ok[++okcnt]=jd(t-dis[now],now); //ok[++okcnt]=jd(t-dis[now],top[now]);
		else if(leafok[now]!=leafhav[now]&&dis[now]+mkval[top[now]]<=t) ok[++okcnt]=jd(t-dis[now],now);
		else {
			int mk=find(now,t);
			if(mk==1) mk=top[now];
			trans(mk);
		}
	}
	for(int i=1;i<=lcnt;++i) {
		if(vis[leaf[i]]) continue;
		if(!cant[top[leaf[i]]]) cant[top[leaf[i]]]=1,ned[++nedcnt]=top[leaf[i]];
	}
	sort(ok+1,ok+1+okcnt,cmp2);
	sort(ned+1,ned+1+nedcnt,cmp);
//	cout<<"tim:"<<t<<endl;
//	for(int i=1;i<=n;++i) cout<<leafok[i]<<' '; cout<<endl;
//	for(int i=1;i<=okcnt;++i) cout<<ok[i].rev<<' '; cout<<endl;
//	for(int i=1;i<=nedcnt;++i) cout<<"aa"<<ned[i]<<' '; cout<<endl;
	int j=1;
	for(int i=1;i<=nedcnt;++i) {
		while(j<=okcnt&&ok[j].rev<mkval[ned[i]]) j++;
		if(j>=okcnt+1) return false;
		j++;
	}
	return true;
}
void print(int x) {
	if(x>=10) print(x/10);
	putchar(x%10+'0');
}
I int read() {
   int ret=0,w=1; char ch;
   while((ch=getchar())>'9'||ch<'0'&&ch!='-'); if(ch=='-')  w=-1; else ret=ch-'0';
   while((ch=getchar())>='0'&&ch<='9') ret=ret*10+ch-'0';
   return ret*w;
}

signed main()
{
	n=read();
	for(int i=1;i<n;++i) {
		int x,y,z; x=read(); y=read(); z=read();
		q[x].push_back(node(y,z));
		q[y].push_back(node(x,z));
	}
	m=read(); dfs(1,0);
	for(int i=1;i<=m;++i) pos[i]=read();
	for(int i=0;i<q[1].size();++i) dealtop(q[1][i].to,1,q[1][i].to),mkval[q[1][i].to]=q[1][i].val;
	for(int i=1;i<=lcnt;++i) leafhav[top[leaf[i]]]++;
	int l=0,r=50000000000000,ans=-1;
	while(l<=r) {
		int mid=l+r>>1;
//		cout<<l<<' '<<r<<' '<<mid<<endl;
		if(check(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	if(ans<0) cout<<"-1"<<endl;
	else print(ans),putchar('\n');
//	for(int i=1;i<=lcnt;++i) cout<<leaf[i]<<' '; cout<<endl;
//	for(int i=1;i<=n;++i) cout<<leafhav[i]<<' '; cout<<endl;
//	for(int i=1;i<=n;++i) cout<<mkval[i]<<' ';   cout<<endl;
	return 0;
}
 

这是为什么呢QAQ

2021/10/25 14:43
加载中...