TLE#8,本地测试答案正确但跑42s
  • 板块P5649 Sone1
  • 楼主lrx___
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/6 23:12
  • 上次更新2025/2/7 11:00:53
查看原帖
TLE#8,本地测试答案正确但跑42s
989792
lrx___楼主2025/2/6 23:12
#include <bits/stdc++.h>
using namespace std;using namespace chrono;typedef signed char i8;typedef short i16;typedef int i32;typedef long long i64;typedef unsigned char u8;typedef unsigned short u16;typedef unsigned u32;typedef unsigned long long u64;typedef float f32;typedef double f64;typedef long double f96;template<typename A,typename B>void to_MAX(A& a,B b){if(a<b)a=b;}template<typename A,typename B>void to_MIN(A& a,B b){if(b<a)a=b;}template<typename... args>auto MAX(args... a){return max({a...});}template<typename... args>auto MIN(args... a){return min({a...});}
#ifndef ONLINE_JUDGE
#define debug(...) fprintf(stderr,__VA_ARGS__)
#else
#define debug(...)
#endif
#define __use_fast_io
namespace fast_io{
#ifndef __cplusplus
#define __cplusplus 201402L
#endif
const unsigned is(1<<21),os(1<<14);bool ne;char i[is],o[os],*ib(i),*ie(i),*ob(o),*oe(o+os),a[20],&c(*a),*b;void f(){ob-=fwrite(o,1,ob-o,stdout);}void p(char c){if(ob==oe)f();*ob++=c;}template<typename T>void _write(T&r){if(r==0)return p('0');if(r<0)p('-'),r=~(r-1);for(b=a;r;r/=10)*++b=(r%10)^'0';while(b!=a)p(*b--);}
#define g (ib==ie&&(ie=(ib=i)+fread(i,1,is,stdin),ib==ie)?-1:*ib++)
void reads(char*s){for(c=g;~c&&isspace(c);c=g);for(*s++=c,c=g;~c&&!isspace(c);c=g)*s++=c;*s=0;}template<typename T>void read(T&r){ne=false;for(c=g;~c&&(c<'0'||c>'9');c=g)ne=(c=='-');for(r=c^'0',c=g;isdigit(c);c=g)r=(r<<3)+(r<<1)+(c^'0');if(ne)r=~(r-1);}template<>void read<char>(char&r){for(c=g;~c&&isspace(c);c=g);r=c;}template<>void read<string>(string&r){r.clear();for(c=g;~c&&isspace(c);c=g);for(r.push_back(c),c=g;~c&&!isspace(c);c=g)r.push_back(c);}
#undef g
#if(__cplusplus>=201703L)
template<typename...Args>void read(Args&...args){(read(args),...);}template<typename...Args>void _write(Args&...args){(_write(args),...);}
#else
template<typename T,typename...args>void read(T&a,args&...b){read(a);read(b...);}template<typename T,typename...args>void _write(T&a,args&...b){_write(a);_write(b...);}
#endif
template<>void _write<char>(char&r){p(r);}template<>void _write<char*>(char*&r){for(;*r;p(*r++));}template<>void _write<const char*>(const char*&r){for(;*r;p(*r++));}template<>void _write<string>(string&r){const char*s(r.data());_write(s);}template<typename...args>void write(args...a){_write(a...);}struct _des{~_des(){f();}}d;}using fast_io::read;using fast_io::reads;using fast_io::write;

const int N(1e5+5),NC(1391857646),INF(INT_MAX);
// 0:链 1:子树
int root,n,m;
namespace SATT{
	void Debug();
	int sta[N<<1],top;
	struct node{
		bool re;
		int ch[3],fa,sz[3],co[2],va,lz[2],su[3],mi[3],ma[3];
	}t[N<<1];
	#define re(u) t[u].re
	#define ls(u) t[u].ch[0]
	#define rs(u) t[u].ch[1]
	#define ms(u) t[u].ch[2]
	#define son(u,k) t[u].ch[k]
	#define fa(u) t[u].fa
	#define va(u) t[u].va
	#define sz(u,k) t[u].sz[k]
	#define co(u,k) t[u].co[k]
	#define mi(u,k) t[u].mi[k]
	#define ma(u,k) t[u].ma[k]
	#define lz(u,k) t[u].lz[k]
	#define su(u,k) t[u].su[k]
	
	void push_up(int u,bool rake){
		// if(u==5){
		// 	debug("push_up ch=[%d,%d,%d]\n",ls(u),rs(u),ms(u));
		// }
		if(rake){
			sz(u,0)=sz(ls(u),0)+sz(rs(u),0)+sz(ms(u),0)+sz(ms(u),2);
			mi(u,0)=MIN(mi(ls(u),0),mi(rs(u),0),mi(ms(u),0),mi(ms(u),2));
			ma(u,0)=MAX(ma(ls(u),0),ma(rs(u),0),ma(ms(u),0),ma(ms(u),2));
			su(u,0)=su(ls(u),0)+su(rs(u),0)+su(ms(u),0)+su(ms(u),2);
		}else{
			sz(u,0)=sz(ls(u),0)+sz(rs(u),0)+1;
			sz(u,1)=sz(ms(u),0);
			sz(u,2)=sz(ls(u),2)+sz(rs(u),2)+sz(ms(u),0);
			
			mi(u,0)=MIN(mi(ls(u),0),mi(rs(u),0),va(u));
			mi(u,1)=mi(ms(u),0);
			mi(u,2)=MIN(mi(ls(u),2),mi(rs(u),2),mi(ms(u),0));
			ma(u,0)=MAX(ma(ls(u),0),ma(rs(u),0),va(u));
			ma(u,1)=ma(ms(u),0);
			ma(u,2)=MAX(ma(ls(u),2),ma(rs(u),2),ma(ms(u),0));
			
			su(u,0)=su(ls(u),0)+su(rs(u),0)+va(u);
			su(u,1)=su(ms(u),0);
			su(u,2)=su(ls(u),2)+su(rs(u),2)+su(ms(u),0);
		}
	}
	bool n_rt(int u){
		return ls(fa(u))==u||rs(fa(u))==u;
	}
	int dir(int u){
		return ms(fa(u))==u?2:rs(fa(u))==u;
	}
	void rotate(int u,bool rake){
		int f(fa(u)),g(fa(f)),d(dir(u));
		son(f,d)=son(u,d^1);
		if(son(f,d)){
			fa(son(f,d))=f;
		}
		son(u,d^1)=f;
		if(g){
			son(g,dir(f))=u;
		}
		fa(f)=u;fa(u)=g;
		push_up(f,rake);
		push_up(u,rake);
	}
	void tag(int u){
		if(u){
			re(u)^=true;
			swap(ls(u),rs(u));
		}
	}
	void tag0(int u,int k){
		if(u){
			va(u)+=k;
			lz(u,0)+=k;
			ma(u,0)+=k;
			mi(u,0)+=k;
			su(u,0)+=sz(u,0)*k;
		}
	}
	void tag1(int u,int k,bool rake){
		if(u){
			lz(u,1)+=k;
			mi(u,0)+=k;
			ma(u,0)+=k;
			su(u,0)+=sz(u,0)*k;
			if(!rake){
				va(u)+=k;
				if(sz(u,1)){
					mi(u,1)+=k;ma(u,1)+=k;su(u,1)+=sz(u,1)*k;
				}
				if(sz(u,2)){
					mi(u,2)+=k;ma(u,2)+=k;su(u,2)+=sz(u,2)*k;
				}
			}
		}
	}
	void tag2(int u,int k){
		if(u){
			co(u,0)=va(u)=ma(u,0)=mi(u,0)=k;
			lz(u,0)=-lz(u,1);
			su(u,0)=sz(u,0)*k;
			va(u)=k;
		}
	}
	void tag3(int u,int k,bool rake){
		if(u){
			// if(u==5){
			// 	debug("tag3 %d\n",k);
			// }
			co(u,1)=ma(u,0)=mi(u,0)=k;
			co(u,0)=NC;
			lz(u,0)=lz(u,1)=0;
			su(u,0)=sz(u,0)*k;
			if(!rake){
				va(u)=k;
				if(sz(u,1)){
					mi(u,1)=ma(u,1)=k;
					su(u,1)=sz(u,1)*k;
				}
				if(sz(u,2)){
					mi(u,2)=ma(u,2)=k;
					su(u,2)=sz(u,2)*k;
				}
			}
		}
	}
	void push_down(int u,bool rake){
		if(re(u)){
			tag(ls(u));
			tag(rs(u));
			re(u)=false;
		}
		if(co(u,1)!=NC){
			tag3(ls(u),co(u,1),rake);
			tag3(rs(u),co(u,1),rake);
			tag3(ms(u),co(u,1),!rake);
			co(u,1)=NC;
		}
		if(co(u,0)!=NC){
			tag2(ls(u),co(u,0));
			tag2(rs(u),co(u,0));
			co(u,0)=NC;
		}
		if(lz(u,0)){
			tag0(ls(u),lz(u,0));
			tag0(rs(u),lz(u,0));
			lz(u,0)=0;
		}
		if(lz(u,1)){
			tag1(ls(u),lz(u,1),rake);
			tag1(rs(u),lz(u,1),rake);
			tag1(ms(u),lz(u,1),!rake);
			lz(u,1)=0;
		}
	}
	void push(int u,bool rake){
		if(fa(u)){
			push(fa(u),rake^(dir(u)==2));
		}
		push_down(u,rake);
	}
	void splay(int u,bool rake,int p=0){
		push(u,rake);
		for(int f;n_rt(u)&&fa(u)!=p;rotate(u,rake)){
			f=fa(u);
			if(n_rt(f)&&fa(f)!=p){
				rotate(dir(u)^dir(f)?u:f,rake);
			}
		}
	}
	int new_node(){
		int u(sta[--top]);
		ls(u)=rs(u)=ms(u)=fa(u)=su(u,0)=sz(u,0)=lz(u,0)=lz(u,1)=re(u)=false;
		ma(u,0)=INT_MIN;
		mi(u,0)=INT_MAX;
		co(u,0)=co(u,1)=NC;
		return u;
	}
	void set_fa(int u,int f,int d){
		if(u){
			fa(u)=f;
		}
		son(f,d)=u;
	}
	void splice(int u){
		splay(u,true);
		int f(fa(u));
		splay(f,false);
		push_down(u,true);
		if(rs(f)){
			swap(fa(ms(u)),fa(rs(f)));
			swap(ms(u),rs(f));
			push_up(u,true);
		}else{
			set_fa(ms(u),f,1);
			if(ls(u)){
				int v(ls(u));
				while(push_down(v,true),rs(v)){
					v=rs(v);
				}
				splay(v,true,u);
				set_fa(rs(u),v,1);
				push_up(v,true);
				set_fa(v,f,2);
			}else{
				set_fa(rs(u),f,2);
			}
			sta[top++]=u;
		}
		push_up(f,false);
	}
	void access(int u){
		int old_u(u);
		splay(u,false);
		if(rs(u)){
			int v(new_node());
			set_fa(rs(u),v,2);
			rs(u)=0;
			set_fa(ms(u),v,0);
			push_up(v,true);
			set_fa(v,u,2);
			push_up(u,false);
		}
		while(fa(u)){
			splice(fa(u));
			u=fa(u);
		}
		splay(old_u,false);
	}
	void make_root(int u){
		access(u);
		tag(u);
	}
	void split(int u,int v){
		make_root(u);
		// if(u==3&&v==10){
		// 	Debug();
		// }
		access(v);
	}
	int find_root(int u){
		access(u);
		while(push_down(u,false),ls(u)){
			u=ls(u);
		}
		return u;
	}
	void link(int u,int v){
		make_root(u);
		access(v);
		set_fa(u,v,1);
		push_up(v,false);
	}
	void cut(int u,int v){
		split(u,v);
		fa(u)=ls(v)=0;
		push_up(v,false);
	}
	void op0(int x,int y){
		split(root,x);
		va(x)=y;
		tag3(ms(x),y,true);
		push_up(x,false);
	}
	void op1(int x){
		root=x;
	}
	void op2(int x,int y,int z){
		split(x,y);
		tag2(y,z);
	}
	int op3(int x){
		split(root,x);
		return MIN(mi(x,1),va(x));
	}
	int op4(int x){
		split(root,x);
		return MAX(ma(x,1),va(x));
	}
	void op5(int x,int y){
		split(root,x);
		va(x)+=y;
		tag1(ms(x),y,true);
		push_up(x,false);
	}
	void op6(int x,int y,int z){
		split(x,y);
		tag0(y,z);
	}
	int op7(int x,int y){
		split(x,y);
		return mi(y,0);
	}
	int op8(int x,int y){
		split(x,y);
		return ma(y,0);
	}
	void op9(int x,int y){
		if(x==y){
			return;
		}
		split(root,y);
		splay(x,false);
		if(fa(y)){
			return;
		}
		split(root,x);
		int v(ls(x));
		while(push_down(v,false),rs(v)){
			v=rs(v);
		}
		cut(v,x);
		link(x,y);
	}
	int op10(int x,int y){
		split(x,y);
		return su(y,0);
	}
	int op11(int x){
		split(root,x);
		return su(x,1)+va(x);
	}
	void change_val(int u,int v){
		make_root(u);
		va(u)=v;
		push_up(u,false);
	}
	void reset_nodes(){
		int i;
		for(i=(N<<1)-1;i>n;--i){
			sta[top++]=i;
		}
		for(i=1;i<=n;++i){
			push_up(i,false);
		}
		mi(0,0)=mi(0,1)=mi(0,2)=INF;
		ma(0,0)=ma(0,1)=ma(0,2)=-INF;
	}
	void Debug(){
		for(int i=1;i<=19;++i){
			debug("ch=[%d,%d,%d],fa=%d,va=%d,ma=[%d,%d,%d],co1=%d\n",ls(i),rs(i),ms(i),fa(i),va(i),ma(i,0),ma(i,1),ma(i,2),co(i,1));
		}
		debug("\n");
	}
}

int main(){
	freopen("8.in","r",stdin);
	freopen("out.txt","w",stdout);
	system_clock::time_point b_t(system_clock::now());
	int i,op,u,v,w;
	read(n,m);
	SATT::reset_nodes();
	for(i=1;i<n;++i){
		// debug("0 i=%d\n",i);
		read(u,v);
		SATT::link(u,v);
	}
	for(i=1;i<=n;++i){
		// debug("1 i=%d\n",i);
		read(u);
		SATT::change_val(i,u);
	}
	read(root);
	for(i=1;i<=m;++i){
		// debug("2 i=%d\n",i);
		read(op,u);
		switch(op){
			case 0:
				read(v);
				SATT::op0(u,v);
				break;
			case 1:
				SATT::op1(u);
				break;
			case 2:
				read(v,w);
				SATT::op2(u,v,w);
				break;
			case 3:
				write(SATT::op3(u),'\n');
				break;
			case 4:
				write(SATT::op4(u),'\n');
				break;
			case 5:
				read(v);
				SATT::op5(u,v);
				break;
			case 6:
				read(v,w);
				SATT::op6(u,v,w);
				break;
			case 7:
				read(v);
				write(SATT::op7(u,v),'\n');
				break;
			case 8:
				read(v);
				write(SATT::op8(u,v),'\n');
				break;
			case 9:
				read(v);
				SATT::op9(u,v);
				break;
			case 10:
				read(v);
				write(SATT::op10(u,v),'\n');
				break;
			case 11:
				write(SATT::op11(u),'\n');
				break;
		}
		// if(i<=3)
		// SATT::Debug();
	}
	system_clock::time_point e_t(system_clock::now());
	debug("%lldms\n",duration_cast<milliseconds>(e_t-b_t).count());
	return 0;
}

在第 386 行赋权时,每隔 10001 个数就卡几秒。

2025/2/6 23:12
加载中...