TLE求求求求求求救
  • 板块CF487E Tourists
  • 楼主2020wty
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/23 11:56
  • 上次更新2024/3/23 14:13:54
查看原帖
TLE求求求求求求救
380950
2020wty楼主2024/3/23 11:56

佬们看看罢蒟蒻调了几年了就是过不了(大哭)

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<set>
#include<cmath>
#define re register int
#define il inline
using namespace std;
typedef long long ll;
const int N=100010;
multiset<ll> s[N<<1];
int n,x,y,m,tot,tot1,head[N<<1],Head[N<<1],Top[N<<1],fa[N<<1],top,stk[N<<1],low[N<<1],cnt,dfn[N<<1],num,dep[N<<1],son[N<<1],size[N<<1],Q,DFN[N<<1];
ll tree[N<<5];
ll a[N<<1];
int to[N<<3][2],Next[N<<3][2];
il int read(){
	char ch=getchar();
	int x=0,f=1;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch-'0');
		ch=getchar();
	}
	return f*x;
}
il ll Read(){
	char ch=getchar();
	ll x=0,f=1ll;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1ll;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch-'0');
		ch=getchar();
	}
	return f*x;
}
il void add(int u,int v){
	tot++;
	Next[tot][0]=head[u];
	to[tot][0]=v;
	head[u]=tot;
}
il void Add(int u,int v){
	tot1++;
	Next[tot1][1]=Head[u];
	to[tot1][1]=v;
	Head[u]=tot1;
}
il void tarjan(int now){
	top++;
	stk[top]=now;
	num++;
	dfn[now]=num;
	low[now]=dfn[now];
	for(int i=head[now];i;i=Next[i][0]){
		int To=to[i][0];
		if(!dfn[To]){
			tarjan(To);
			low[now]=min(low[now],low[To]);
			if(low[To]==dfn[now]){
				cnt++;
				int xx=0;
				while(xx!=To){
					xx=stk[top];
					top--;
					Add(cnt,xx);
					Add(xx,cnt);
				}
				Add(cnt,now);
				Add(now,cnt);
			}
		}
		else low[now]=min(low[now],dfn[To]);
	}
}
il void dfs(int now,int Fa){
	size[now]=1;
	for(int i=Head[now];i;i=Next[i][1]){
		int To=to[i][1];
		if(To!=Fa){
			fa[To]=now;
			dep[To]=dep[now]+1;
			dfs(To,now);
			size[now]+=size[To];
			if(size[To]>size[son[now]])son[now]=To; 
		}
	}
}
il void dfs1(int now,int tp){
	num++;
	dfn[now]=num;
	DFN[num]=now;
	Top[now]=tp;
	if(son[now])dfs1(son[now],tp);
	for(int i=Head[now];i;i=Next[i][1]){
		int To=to[i][1];
		if(To!=son[now]&&dep[To]==dep[now]+1)
			dfs1(To,To);
	}
}
il void build(int k,int l,int r){
	if(l==r){
		tree[k]=a[DFN[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	tree[k]=min(tree[k<<1],tree[k<<1|1]);
}
il void modify(int k,int l,int r,int x,ll v){
	if(l==r){
		tree[k]=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)modify(k<<1,l,mid,x,v);
	else modify(k<<1|1,mid+1,r,x,v);
	tree[k]=min(tree[k<<1],tree[k<<1|1]);
}
il ll ask(int k,int l,int r,int L,int R){
	if(l>R||r<L)return 1e18;
	if(l>=r&&r<=R)return tree[k];
	int mid=(l+r)>>1;
	ll res=1e18;
	if(L<=mid)res=min(res,ask(k<<1,l,mid,L,R));
	if(R>mid)res=min(res,ask(k<<1|1,mid+1,r,L,R));
	return res;
}
il ll Ask(int u,int v){
	ll res=1e18;
	while(Top[u]!=Top[v]){
		if(dep[Top[u]]<dep[Top[v]])swap(u,v);
		res=min(res,ask(1,1,cnt,dfn[Top[u]],dfn[u]));
		u=fa[Top[u]];
	}
	if(dfn[u]>dfn[v])swap(u,v);
	res=min(res,ask(1,1,cnt,dfn[u],dfn[v]));
	if(u>n)res=min(res,a[fa[u]]);
	return res;
}
int main(){
	n=read();m=read();Q=read();
	cnt=n;
	for(re i=1;i<=n;i++)a[i]=Read();
	for(re i=1;i<=m;i++){
		x=read();
		y=read();
		add(x,y);
		add(y,x);
	}
	tarjan(1);
	num=0;
	memset(dep,0,sizeof(dep));
	dep[1]=1;
	dfs(1,1);
	for(re i=2;i<=n;i++)s[fa[i]].insert(a[i]);
	dfs1(1,1);
	for(re i=n+1;i<=cnt;i++)a[i]=*s[i].begin();
	build(1,1,cnt);
	int sss=0;
	while(Q--){
		sss++;
		char op=getchar();
		while(op!='A'&&op!='C')op=getchar();
		if(op=='C'){
			ll kk;
			scanf("%d%lld",&x,&kk);
			modify(1,1,cnt,dfn[x],kk);
			if(fa[x]){
				s[fa[x]].erase(s[fa[x]].find(a[x]));
				s[fa[x]].insert(kk);
				if(a[fa[x]]!=*s[fa[x]].begin()){
					a[fa[x]]=*s[fa[x]].begin();
					modify(1,1,cnt,dfn[fa[x]],a[fa[x]]);
				}
			}
			a[x]=kk;
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",Ask(x,y));
		}
	}
	return 0;
}
2024/3/23 11:56
加载中...