钉子精神
查看原帖
钉子精神
100325
peterwuyihong楼主2020/9/12 11:06
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cerr<<#x<<' '<<x<<endl
#ifndef ONLINE_JUDGE
	#define fuck getchar
#else
	#define fuck getchar
#endif
char nc(){
  	static char buf[1<<25],*p=buf,*q=buf;
  	if(p==q&&(q=(p=buf)+fread(buf,1,1<<25,stdin),p==q))return EOF;
  	return *p++;
}
template<class T>void read(T&x){
	short f=1;x=0;
	char ch=fuck();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=fuck();
	}while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=fuck();
	}x*=f;
}
template<class T>void write(T x){
	if(x<0)putchar('-'),x=-x;
	if(x>=10)write(x/10);
	putchar(x%10+48);
}

#define maxn 100010
int n,x,y,z;
char op[10];
struct point{
    int l,r;
    mutable int v;
    point(int ll,int rr,int vv):l(ll),r(rr),v(vv) {}
    inline bool operator<(point x)const{return l<x.l;}
};
set<point>s;
#define Iter set<point>::iterator
Iter split(int x){
    if(x>n)return s.end();
    Iter it=--s.upper_bound(point(x,0,0));
    if(it->l==x)return it;
    int l=it->l,r=it->r,v=it->v;
    s.erase(it);
    s.insert(point(l,x-1,v));
    return s.insert(point(x,r,v)).first;
}
void ASSIGN(int l,int r,int v){
    Iter itr=split(r+1),itl=split(l);
    s.erase(itl,itr);
    s.insert(point(l,r,v));
}
int MAX(int l,int r){
    Iter itr=split(r+1),itl=split(l);
    int ans=0;
    for(;itl!=itr;++itl)ans=max(ans,itl->v);
    return ans;
}
void ADD(int l,int r,int v){
    Iter itr=split(r+1),itl=split(l);
    for(;itl!=itr;++itl)itl->v+=v;
}
int head[maxn],Next[maxn<<1],ver[maxn<<1],edge[maxn<<1],tot=1;
void add(int x,int y,int z){
    ver[++tot]=y;
    edge[tot]=z;
    Next[tot]=head[x];
    head[x]=tot;
}
int dep[maxn],fa[maxn],siz[maxn],son[maxn],top[maxn],dfn[maxn],cnt;
void dfs1(int x){
    siz[x]=1;
    for(int i=head[x];i;i=Next[i]){
        int y=ver[i];
        if(dep[y])continue;
        dep[y]=dep[x]+1;
        fa[y]=x;
        dfs1(y);
        siz[x]+=siz[y];
        if(siz[y]>siz[son[x]])son[x]=y;
    }
}
void dfs2(int x,int t){
    dfn[x]=++cnt;
    top[x]=t;
    if(!son[x])return;
    dfs2(son[x],t);
    for(int i=head[x];i;i=Next[i])
    if(ver[i]!=fa[x]&&ver[i]!=son[x])dfs2(ver[i],ver[i]);
}
void modify(int x,int y,int z){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ASSIGN(dfn[top[x]],dfn[x],z);
        x=fa[top[x]];
    }
    if(x==y)return;
    if(dep[x]>dep[y])swap(x,y);
    ASSIGN(dfn[son[x]],dfn[y],z);
}
void Modify(int x,int y,int z){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ADD(dfn[top[x]],dfn[x],z);
        x=fa[top[x]];
    }
    if(x==y)return;
    if(dep[x]>dep[y])swap(x,y);
    ADD(dfn[son[x]],dfn[y],z);
}
int ask(int x,int y){
    int ans=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ans=max(ans,MAX(dfn[top[x]],dfn[x]));
        x=fa[top[x]];
    }
    if(x==y)return ans;
    if(dep[x]>dep[y])swap(x,y);
    return max(ans,MAX(dfn[son[x]],dfn[y]));
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("P4315_1.in","r",stdin);
    freopen("Cindy.txt","w",stdout);
#endif
    read(n);
    for(int i=1;i<n;i++){
        read(x),read(y),read(z);
        add(x,y,z),add(y,x,z);
    }
    dep[1]=1;
    dfs1(1);
    dfs2(1,1);
    for(int i=2;i<tot;i+=2){
        x=ver[i],y=ver[i^1],z=edge[i];
        if(dep[x]<dep[y])swap(x,y);
        s.insert(point(dfn[x],dfn[x],z));
    }
    s.insert(point(1,1,0));
    while(scanf("%s",op),op[1]!='t'){
        read(x),read(y);
        if(op[1]=='h'){
            int fx=ver[x<<1],fy=ver[x<<1|1];
            if(dep[fx]<dep[fy])swap(fx,fy);
            ASSIGN(dfn[fx],dfn[fx],y);
        //    s.erase(s.lower_bound(point(dfn[fx],dfn[fx],0)));
        //    s.insert(point(dfn[fx],dfn[fx],y));
        }
        if(op[1]=='o')read(z),modify(x,y,z);
        if(op[1]=='d')read(z),Modify(x,y,z);
        if(op[1]=='a')write(ask(x,y)),putchar('\n');
    }
}

这是ACAC代码

其中

            ASSIGN(dfn[fx],dfn[fx],y);
        //    s.erase(s.lower_bound(point(dfn[fx],dfn[fx],0)));
        //    s.insert(point(dfn[fx],dfn[fx],y));

用这个也会WAWA

        //    s.insert(point(dfn[fx],dfn[fx],y));

如果用下面两句就会WAWA,好奇怪

望珂学大神解答

2020/9/12 11:06
加载中...