社区讨论
TLE on #13,求卡常
P2680[NOIP 2015 提高组] 运输计划参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lzu0ipnh
- 此快照首次捕获于
- 2024/08/14 23:34 2 年前
- 此快照最后确认于
- 2024/08/15 09:49 2 年前
CPP
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const long long Max=3e5+1;
long long ans=0,hole=0;
long long n,m;
long long fa[20][Max],tot,Head[Max],Next[2*Max],ver[2*Max],edge[2*Max],cnt[Max],dep[Max],path[Max],sum1[Max];
long long LCA[Max];
pair<long long,long long> line[Max];
long long lca(long long x,long long y){
if(dep[x]<dep[y]){
swap(x,y);
}
long long c=dep[x]-dep[y];
for(long long i=19;i>=0;i--){
if(c&(1<<i)){
x=fa[i][x];
}
}
// cout<<dep[x]<<" "<<dep[y]<<endl;
if(x==y){
return x;
}
for(long long i=19;i>=0;i--){
if(fa[i][x]!=fa[i][y]){
x=fa[i][x];
y=fa[i][y];
}
}
return fa[0][x];
}
void add(long long x,long long y,long long z){
ver[++tot]=y;edge[tot]=z;
Next[tot]=Head[x];Head[x]=tot;
}
void dfs1(long long x,long long f,long long d){
// cout<<"dfs"<<x<<" "<<d<<endl;
fa[0][x]=f;dep[x]=d;
for(long long i=1;i<=19;i++){
fa[i][x]=fa[i-1][fa[i-1][x]];
}
for(long long i=Head[x];i;i=Next[i]){
long long y=ver[i];
if(y==f){
continue;
}
sum1[y]=sum1[x]+edge[i];
dfs1(y,x,d+1);
// cout<<"sum"<<y<<" "<<x<<" "<<sum1[x]<<" "<<sum1[y]<<endl;
}
}
bool flag=0;
long long me=0;
long long dfs2(long long x,long long f,long long z){
long long sum=0;
for(long long i=Head[x];i;i=Next[i]){
long long y=ver[i];
if(y==f){
continue;
}
long long z1=dfs2(y,x,z),w=edge[i];
if(z1==z){
flag=1;
me=max(me,w);
}
sum+=z1;
}
sum+=cnt[x];
return sum;
}
bool check(long long x){
long long mp=0;
flag=0;me=0;
long long num=0;
memset(cnt,0,sizeof(cnt));
for(long long i=1;i<=m;i++){
if(path[i]>x){
num++;
long long a=line[i].first,b=line[i].second;
cnt[a]++;cnt[b]++;cnt[LCA[i]]-=2;
// cout<<"check"<<a<<" "<<b<<endl;
mp=max(path[i],mp);
}
}
dfs2(1,0,num);
// cout<<mp<<" "<<me<<" "<<x<<endl;
if(flag&&mp-me<=x){
return 1;
}
return 0;
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>m;
long long mp=0;
for(long long i=1;i<=n-1;i++){
long long x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dfs1(1,0,1);
for(long long i=1;i<=m;i++){
long long x,y;
cin>>x>>y;
line[i]=make_pair(x,y);
long long z=lca(x,y);LCA[i]=z;
// cout<<z<<endl;
path[i]=sum1[x]+sum1[y]-2*sum1[z];
// cout<<sum1[x]<<" "<<sum1[y]<<endl;
mp=max(mp,path[i]);
// cout<<"p"<<" "<<path[i]<<" "<<x<<" "<<y<<" "<<z<<endl;
}
long long l=0,r=mp;
while(l<r){
long long mid=(l+r)>>1;
if(check(mid)){
r=mid;
}else{
l=mid+1;
}
}
cout<<l;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...