萌新刚学树剖求教
  • 板块P4114 Qtree1
  • 楼主fzj2007
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/8/25 14:17
  • 上次更新2023/11/6 19:25:39
查看原帖
萌新刚学树剖求教
172370
fzj2007楼主2020/8/25 14:17

RT,不知道为啥,最后四个点T了...没调出来,求教....由于本人刚学树剖,所以请大佬明示错误..(前面是快读,建议跳过..)

//#include<bits/stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<stack>
#include<vector>
//#include<conio.h>
#include<string>
#include<map>
#include<cstdlib>
#include<queue>
#include<math.h>
#include<time.h>
#include<set>
#include<cstdio>
#include<stdio.h>
#include<algorithm>
using namespace std; 
using std::cin;
using std::cout;
using std::endl;
namespace IN{
    const int MAX_INPUT = 1000000;
    #define getc() (p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,MAX_INPUT),p1==p2)?EOF:*p1++)
    char buf[MAX_INPUT],*p1,*p2;
    template<typename T>inline bool read(T &x) {
        static std::streambuf *inbuf=cin.rdbuf();
        x=0;
        register int f=0,flag=false;
        register char ch=getc();
        while(!isdigit(ch)){
            if (ch=='-') f=1;
        	ch=getc();
        }
        if(isdigit(ch)) x=x*10+ch-'0',ch=getc(),flag=true;
        while(isdigit(ch)) {
            x=x*10+ch-48;
            ch=getc();
        }
        x=f?-x:x;
        return flag;
    }
    inline char getch(){
    	static std::streambuf *inbuf=cin.rdbuf();
    	char ch=getc();
		while(ch!='D'&&ch!='Q'&&ch!='C') ch=getc();
		return ch; 
	}
    template<typename T,typename ...Args>inline bool read(T& a,Args& ...args) {
       return read(a)&&read(args...);
    }
    #undef getc
}

namespace OUT{
    template<typename T>inline void put(T x){
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top=0;
        if(x<0){
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
            outbuf->sputc('0');
            outbuf->sputc('\n');
            return;
        }
        while(x){
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc('\n');
    }
    inline void putc(const char ch){
        static std::streambuf *outbuf=cout.rdbuf();
        outbuf->sputc(ch);
    }
    inline void putstr(string s){
    	for(register int i=0;i<s.length();i++) putc(s[i]);
	}
    template<typename T>inline void put(const char ch,T x){
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top = 0;
        if(x<0){
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
            outbuf->sputc('0');
            outbuf->sputc(ch);
            return;
        }
        while(x){
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc(ch);
    }
    template<typename T,typename ...Args> inline void put(T a,Args ...args){
        put(a);put(args...);
    }
    template<typename T,typename ...Args> inline void put(const char ch,T a,Args ...args){
        put(ch,a);put(ch,args...);
    }
}
using namespace IN;
using namespace OUT;
#define N 100005
#define int long long
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define mid (l+r>>1)
#define max(a,b) (a>b?a:b)
int n,a,b,head[N],dfn[N],rk[N],f[N],num,size[N],son[N],dep[N],top[N],w[N],cnt,t[N<<2]; 
char ch;
struct edge{
	int u,v,nxt,z;
}e[N<<1];
inline void add(int u,int v,int z){
	e[++cnt]=(edge){u,v,head[u],z},head[u]=cnt;
}
namespace ST{//线段树部分
	inline void debug(int x,int l,int r){
		if(l==r) return cout<<x<<" "<<l<<" "<<r<<" "<<t[x]<<endl,void();
		cout<<x<<" "<<l<<" "<<r<<" "<<t[x]<<endl;
		debug(lc(x),l,mid),debug(rc(x),mid+1,r); 
	}
	inline void push_up(int x){
		t[x]=max(t[lc(x)],t[rc(x)]);
	}
	inline void build(int x,int l,int r){
		if(l==r) return t[x]=w[rk[l]],void();
		build(lc(x),l,mid),build(rc(x),mid+1,r);
		push_up(x);
	}
	inline void update(int x,int l,int r,int k,int val){
		if(l==r) return t[x]=val,void();
		if(k<=mid) update(lc(x),l,mid,k,val);
		else update(rc(x),mid+1,r,k,val);
		push_up(x);
	}
	inline int query(int x,int l,int r,int ql,int qr){
		if(l>r) return 0;
		if(ql<=l&&r<=qr) return t[x];
		int ret=0;
		if(ql<=mid) ret=max(ret,query(lc(x),l,mid,ql,qr));
		if(qr>mid) ret=max(ret,query(rc(x),mid+1,r,ql,qr));
		return ret;
	}
}
using namespace ST;
namespace TCP{//树剖部分
	void dfs1(int x,int fath){
		size[x]=1,f[x]=fath,dep[x]=dep[fath]+1;
		for(int i=head[x];i;i=e[i].nxt){
			int v=e[i].v;
			if(v==fath) continue;
			w[v]=e[i].z;
			dfs1(v,x);
			size[x]+=size[v];
			if(!son[x]||size[v]>size[son[x]]) son[x]=v;
		}
	}
	void dfs2(int x,int ct){
		dfn[x]=++num,rk[num]=x,top[x]=ct;
		if(son[x]) dfs2(son[x],ct);
		for(int i=head[x];i;i=e[i].nxt){
			int v=e[i].v;
			if(v!=son[x]&&v!=f[x]) dfs2(v,v);
		}
	}
	inline void upd(int x,int val){
		int u=e[x<<1].u,v=e[x<<1].v;
		if(f[v]==u) swap(u,v);
		update(1,1,n,dfn[u],val);
	}
	inline int que(int x,int y){
		if(x==y) return 0;
		int res=-1;
		while(top[x]!=top[y]){
			if(dep[top[x]]<dep[top[y]]) swap(x,y);
			res=max(res,query(1,1,n,dfn[top[x]],dfn[x]));
			x=f[top[x]];
		}
		if(dep[x]>dep[y]) swap(x,y);
		return max(res,query(1,1,n,dfn[x]+1,dfn[y]));
	}
}
using namespace TCP;
signed main(signed argc, char const *argv[]){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    read(n);
    for(int i=1,u,v,z;i<n;i++) read(u,v,z),add(u,v,z),add(v,u,z);
    dfs1(1,0),dfs2(1,1),build(1,1,n);
    while(1){
    	ch=getch();//这里可以保证正确性
    	if(ch=='D') break;
    	read(a,b);
    	if(ch=='C') upd(a,b);
    	else put('\n',que(a,b));
	}
    return 0;
}
2020/8/25 14:17
加载中...