编译环境
  • 板块灌水区
  • 楼主Eterna
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/6 13:34
  • 上次更新2025/1/6 21:35:46
查看原帖
编译环境
1348260
Eterna楼主2025/1/6 13:34

正当我在庆幸一发就A掉了P3313时,去学校OJ交了原题,结果全RE了。

学校OJ的编译配置为c++14 o2(不可更改)

希望有人帮我看看有啥原因会导致RE

分块写法,复杂度 O(qnlogn)O(q \sqrt {n \log n})

#include<bits/stdc++.h>
#define gc getchar()
#define rd read()
#define N 100005
#define K 1405
using namespace std;
inline int read()
{
	unsigned int x=0,s=gc;
	while(!isdigit(s))s=gc;
	while(isdigit(s))x=(x<<1)+(x<<3)+(s^48),s=gc;
	return x;
}
inline void chkmax(int &x,int y){x=(x>y?x:y);}
int n,m,cnt;
int dep[N],fa[N],dfn[N],siz[N];
int son[N],seg[N],rev[N],top[N];
int a[N],col[N],val[N],block;
int _col[N],_val[N];
int sumv[N][K],maxx[N][K];
int bl[N],L[K],R[K],tot;
vector<int> v[N];
void dfs(int x,int f,int deep)
{
	dep[x]=deep;
	fa[x]=f;
	siz[x]=1;
	int maxx=0;
	for(auto j:v[x])
		if(fa[x]!=j)
		{
			dfs(j,x,deep+1);
			if(maxx<siz[j])son[x]=j,maxx=siz[j];
			siz[x]+=siz[j];
		}
}
void dfs2(int x,int y)
{
	seg[x]=++cnt;
	rev[cnt]=x,top[x]=y;
	if(!son[x])return;
	dfs2(son[x],y);
	for(auto j:v[x])
		if(j!=fa[x]&&j!=son[x])
			dfs2(j,j);
}
void ccol(int x,int y)
{
	int c=col[x],k=bl[x];
	col[x]=y,maxx[c][k]=maxx[y][k]=INT_MIN,sumv[c][k]=sumv[y][k]=0;
	for(int i=L[k];i<=R[k];i++)
	{
		if(col[i]==y)chkmax(maxx[y][k],val[i]),sumv[y][k]+=val[i];
		if(col[i]==c)chkmax(maxx[c][k],val[i]),sumv[c][k]+=val[i];
	}
}
void cval(int x,int y)
{
	val[x]=y;
	int k=bl[x];maxx[col[x]][k]=INT_MIN,sumv[col[x]][k]=0;
	for(int i=L[k];i<=R[k];i++) 
		if(col[i]==col[x])sumv[col[x]][k]+=val[i],chkmax(maxx[col[x]][k],val[i]);
}
int ask1(int c,int l,int r)
{
	int ans=0;
	if(bl[l]==bl[r])
	{
		for(int i=l;i<=r;i++)if(col[i]==c)ans+=val[i];
		return ans;
	}
	for(int i=bl[l]+1;i<bl[r];i++)ans+=sumv[c][i];
	for(int i=l;bl[i]==bl[l];i++)if(col[i]==c)ans+=val[i];
	for(int i=r;bl[i]==bl[r];i--)if(col[i]==c)ans+=val[i];
	return ans;
}
int ask2(int c,int l,int r)
{
	int ans=INT_MIN;
	if(bl[l]==bl[r])
	{
		for(int i=l;i<=r;i++)if(col[i]==c)chkmax(ans,val[i]);
		return ans;
	}
	for(int i=bl[l]+1;i<bl[r];i++)chkmax(ans,maxx[c][i]);
	for(int i=l;bl[i]==bl[l];i++)if(col[i]==c)chkmax(ans,val[i]);
	for(int i=r;bl[i]==bl[r];i--)if(col[i]==c)chkmax(ans,val[i]);
	return ans;
}
int asum(int c,int x,int y)
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans+=ask1(c,seg[top[x]],seg[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans+=ask1(c,seg[x],seg[y]);
	return ans;
}
int amax(int c,int x,int y)
{
	int ans=INT_MIN;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		chkmax(ans,ask2(c,seg[top[x]],seg[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	chkmax(ans,ask2(c,seg[x],seg[y]));
	return ans;
}
signed main()
{
	n=rd,m=rd,block=sqrt(n/log2(n)),tot=(n/block+(n%block?1:0));
	for(int i=1;i<=n;bl[i]=(i-1)/block+1,i++)_val[i]=rd,_col[i]=rd;
	for(int i=1;i<=tot;i++)L[i]=R[i-1]+1,R[i]=i*block;R[tot]=n;
	for(int i=1;i<n;i++)
	{
		int x=rd,y=rd;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(1,0,1),dfs2(1,1);
	for(int i=1;i<=n;i++)col[i]=_col[rev[i]],val[i]=_val[rev[i]];
	for(int i=1;i<=n;i++)
	{
		sumv[col[i]][bl[i]]+=val[i];
		chkmax(maxx[col[i]][bl[i]],val[i]);
	}
	while(m--)
	{
		string op;int x,y;
		cin>>op;x=rd,y=rd;
		if(op=="CC")ccol(seg[x],y);
		if(op=="CW")cval(seg[x],y);
		if(op=="QS")cout<<asum(col[seg[x]],x,y)<<'\n';
		if(op=="QM")cout<<amax(col[seg[x]],x,y)<<'\n';
	}
	return 0;
}
2025/1/6 13:34
加载中...