TLE on #29
查看原帖
TLE on #29
347086
Powerless233楼主2022/8/12 20:53
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
#define MAXN 200005
#define LL long long
#define inf 9187201950435737471
#define int long long
using namespace std;
inline LL read(){
	LL res=0,fl=1;
	char ch=getchar();
	while(!(ch>='0' && ch<='9')){if(ch=='-')fl=-1;ch=getchar();}
	while(ch>='0' && ch<='9')res=res*10+ch-'0',ch=getchar();
	return res*fl;
}
inline LL max(LL a,LL b){return a>b?a:b;}
inline LL min(LL a,LL b){return a<b?a:b;}
inline void swap(int &a,int &b){int c;c=a;a=b;b=c;}
int n,m,q,tot,cnt=0,tp=0,idt=0,rt;
int a[MAXN],dfn[MAXN],low[MAXN],st[MAXN];
int si[MAXN],fa[MAXN],dep[MAXN],son[MAXN],id[MAXN],w[MAXN],top[MAXN];
vector<int> e[MAXN],ne[MAXN];
multiset<int> s[MAXN];
#define IT multiset<int>::iterator
struct Segment_Tree{
	int l,r,val;
	#define ls (k<<1)
	#define rs (k<<1|1)
	#define l(k) tr[k].l
	#define r(k) tr[k].r
	#define val(k) tr[k].val
	#define mid(k) ((tr[k].l+tr[k].r)>>1)
}tr[MAXN<<2];

inline void pushup(int k){
	val(k)=min(val(ls),val(rs));
}

inline void build(int k,int l,int r){
	l(k)=l,r(k)=r;
	if(l==r){
		val(k)=a[w[l]];
		return;
	}
	build(ls,l,mid(k));
	build(rs,mid(k)+1,r);
	pushup(k);
}

inline void update(int k,int x,int z){
	if(l(k)==r(k)){
		val(k)=z;
		return;
	}
	if(x<=mid(k))update(ls,x,z);
	else update(rs,x,z);
	pushup(k);
}

inline int query(int k,int l,int r){
	if(l(k)>=l && r(k)<=r)
		return val(k);
	int res=inf;
	if(l<=mid(k))res=min(res,query(ls,l,r));
	if(r>mid(k))res=min(res,query(rs,l,r));
	return res;
}

inline void Tarjan(int x){
	dfn[x]=low[x]=++cnt;
	st[++tp]=x;
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		if(!dfn[y]){
			Tarjan(y);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x]){
				int z;
				tot++;
				ne[x].push_back(tot);
				ne[tot].push_back(x);
				while(z=st[tp--]){
					ne[z].push_back(tot);
					ne[tot].push_back(z);
					if(z==y)break;
				}
			}
		}
		else low[x]=min(low[x],dfn[y]);
	}
}

inline void dfs_son(int x,int f,int d){
	si[x]=1;
	fa[x]=f;
	dep[x]=d;
	int maxson=0;
	for(int i=0;i<ne[x].size();i++){
		int y=ne[x][i];
		if(y!=f){
			dfs_son(y,x,d+1);
			if(si[y]>maxson)maxson=si[y],son[x]=y;
		}
	}
}

inline void dfs_chain(int x,int topf){
	id[x]=++idt;
	w[idt]=x;
	top[x]=topf;
	if(!son[x])return;
	dfs_chain(son[x],topf);
	for(int i=0;i<ne[x].size();i++){
		int y=ne[x][i];
		if(y!=fa[x] && y!=son[x])
			dfs_chain(y,y);
	}
}

inline int range_query(int x,int y){
	int res=inf;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		res=min(res,query(1,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	res=min(res,query(1,id[x],id[y]));
	rt=x;
	return res;
}

signed main() {
	char opt;
	int x,y,res;
	tot=n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++){
		x=read(),y=read();
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])Tarjan(i);
	dfs_son(1,1,1);
	dfs_chain(1,1);
	for(int i=2;i<=n;i++)
		s[fa[i]].insert(a[i]);
	for(int i=n+1;i<=tot;i++)
		a[i]=s[i].empty()?inf:*s[i].begin();
	build(1,1,tot);
	for(int i=1;i<=q;i++){
		cin>>opt;
		x=read(),y=read();
		if(opt=='C'){
			if(x==1){
				a[x]=y;
				update(1,id[x],y);
				continue;
			}
			update(1,id[x],y);
			IT it=s[fa[x]].lower_bound(a[x]);
			s[fa[x]].erase(it);
			s[fa[x]].insert(y);
			a[x]=y;
			a[fa[x]]=*s[fa[x]].begin();
			update(1,id[fa[x]],a[fa[x]]);
			
		}
		else {
			res=inf;
			res=min(res,range_query(x,y));
			if(rt>n)res=min(res,a[fa[rt]]);
			cout<<res<<'\n';
		}
	}
	return 0;
}

2022/8/12 20:53
加载中...