关于 CE
  • 板块学术版
  • 楼主Spasmodic
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/9/4 21:30
  • 上次更新2023/11/5 13:44:22
查看原帖
关于 CE
121027
Spasmodic楼主2020/9/4 21:30
#include<bits/stdc++.h>
using namespace std;
const int N=300005;
int n,m,tot,max_len,hd[N],totQ,hdQ[N];
struct query{int u,v,lca,dist;bool operator<(const query&x)const{return dist>x.dist;}}q[N];
struct edge{int t,w,nxt;}es[N<<1],esQ[N<<1];
inline void add(register int u,register int v,register int w){es[++tot]=(edge){v,w,hd[u]};hd[u]=tot;}
inline void addQ(register int u,register int v,register int id){
	esQ[++totQ]=(edge){v,id,hdQ[u]},hdQ[u]=totQ;
}
struct IO_Tp {
    const static int _I_Buffer_Size = 2 << 20;
    char _I_Buffer[_I_Buffer_Size], *_I_pos = _I_Buffer;

    const static int _O_Buffer_Size = 2 << 20;
    char _O_Buffer[_O_Buffer_Size], *_O_pos = _O_Buffer;

    IO_Tp() { fread(_I_Buffer, 1, _I_Buffer_Size, stdin); }
    ~IO_Tp() { fwrite(_O_Buffer, 1, _O_pos - _O_Buffer, stdout); }

    IO_Tp &operator>>(int &res) {
        while (!isdigit(*_I_pos)) ++_I_pos;
        res = *_I_pos++ - '0';
        while (isdigit(*_I_pos)) res = res * 10 + (*_I_pos++ - '0');
        return *this;
    }

	IO_Tp &operator<<(int n) {
        static char _buf[10];
        char *_pos = _buf;
        do
            *_pos++ = '0' + n % 10;
        while (n /= 10);
        while (_pos != _buf) *_O_pos++ = *--_pos;
        return *this;
    }

    IO_Tp &operator<<(char ch) {
        *_O_pos++ = ch;
        return *this;
    }
} IO;
int id[N],d[N],dist[N];
int s[N],cnt,ma;
bool vst[N];
int find(register int x){return x==id[x]?x:id[x]=find(id[x]);}
void unite(register int x,register int y){register int a=find(x),b=find(y);d[a]>d[b]?id[a]=b:id[b]=a;}
void tarjan(register int x){
	id[x]=x;vst[x]=true;
	for(register int i=hd[x],y;i;i=es[i].nxt)
		if(!vst[y=es[i].t]){
			d[y]=d[x]+1,dist[y]=dist[x]+es[i].w;
			tarjan(y);
			unite(y,x);
		} 
	for(register int i=hdQ[x];i;i=esQ[i].nxt)
		if(vst[esQ[i].t]) 
			q[esQ[i].w].lca=find(esQ[i].t);
}
void dfs(register int u,register int fa){
	for(register int i=hd[u],v;i;i=es[i].nxt)
		if((v=es[i].t)!=fa)
			dfs(v,u),s[u]+=s[v];
	if(s[u]==cnt)ma=max(ma,dist[u]-dist[fa]);
} 
inline bool ok(register int len){
	memset(s,0,sizeof(s));
	cnt=ma=0;
	for(register int i=1;i<=m;i++)if(q[i].dist>len)cnt++,s[q[i].u]++,s[q[i].v]++,s[q[i].lca]-=2;
	dfs(1,0);
	if(max_len-ma>len)return 0;
	else return 1;
}
int main(){
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	IO>>n>>m;
	for(register int i=1,a,b,t;i<n;i++)IO>>a>>b>>t,add(a,b,t),add(b,a,t);
	register int l=0,r=0,ans=0;
	for(register int i=1;i<=m;i++){
		IO>>q[i].u>>q[i].v;
		addQ(q[i].u,q[i].v,i),addQ(q[i].v,q[i].u,i);
	}
	tarjan(1);
	for(register int i=1;i<=m;i++)r=max(r,q[i].dist=dist[q[i].u]+dist[q[i].v]-dist[q[i].lca]*2);
	ans=max_len=r;
	sort(q+1,q+m+1);
	while(l<=r){
		register int mid=l+r>>1;
		if(ok(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	IO<<ans;
	return 0;
}

这玩意为啥选 C++ 的时候 CE 了啊

咋改啊/yun

2020/9/4 21:30
加载中...