求助,玄学RE,但是开O2就过了???
查看原帖
求助,玄学RE,但是开O2就过了???
226423
SunshineBoyAnduin楼主2020/11/29 22:08

RT,不开O2 55分,其余RE,现在感到十分迷惑,代码思路基本是跟着第一篇题解学的

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000;
int n,m,root,MOD;

int read()
{
	int t=0,w=1;
	char c;
	while(c<'0'||c>'9')
	{
		if(c=='-')
		{
			w=-1;
		}
		c=getchar();
	}
	while(c<='9'&&c>='0')
	{
		t=t*10+c-'0';
		c=getchar();
	}
	return t*w;
}

struct Node{
	int v;
	int size,fatson;
	int deep,id;
	int fa,top;
}tr[MAXN+5];
int bk[MAXN+5];

struct Line{
	int to,next;
}LL[MAXN*5+5];
int head[MAXN+5],cnt;

void addline(int x,int y)
{
	LL[++cnt].to=y;
	LL[cnt].next=head[x];
	head[x]=cnt;	
}

struct Seg{
	int lv,rv,num,lz;
	int l,r;
}segtr[MAXN*5+5];

int X,Y,Z;
char bz; 
void dfs1(int x)
{
	//cout<<x<<endl;
	tr[x].size=1;
	int mx=0;
	for(int i=head[x];i;i=LL[i].next)
	{
		int y=LL[i].to;
		if(y==tr[x].fa)
		{
			continue;
		}
		tr[y].fa=x;
		tr[y].deep=tr[x].deep+1;
		dfs1(y);
		tr[x].size+=tr[y].size;
		if(tr[y].size>mx)
		{
			mx=tr[y].size;
			tr[x].fatson=y;
		}
	}
}
int ID;
void dfs2(int x,int top)
{
	tr[x].top=top;
	tr[x].id=++ID;
	bk[ID]=x;
	if(tr[x].fatson)
	{
		dfs2(tr[x].fatson,top);
	}
	for(int i=head[x];i;i=LL[i].next)
	{
		int y=LL[i].to;
		if(y==tr[x].fa||y==tr[x].fatson)
		{
			continue;
		}
		dfs2(y,y);
	}
}

void push_up(int o)
{
	segtr[o].lv=segtr[o*2].lv;
	segtr[o].rv=segtr[o*2+1].rv;
	segtr[o].num=segtr[o*2].num+segtr[o*2+1].num;
	if(segtr[o*2].rv==segtr[o*2+1].lv)
	{
		segtr[o].num--;
	}
}

void build(int l,int r,int o)
{
	segtr[o].l=l;segtr[o].r=r;
	if(l==r)
	{
		segtr[o].lv=segtr[o].rv=tr[bk[l]].v;
		segtr[o].num=1;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,o*2);
	build(mid+1,r,o*2+1);
	push_up(o);
}

void no_lz(int o)
{
	if(segtr[o].lz)
	{
		segtr[o*2].lv=segtr[o*2].rv=segtr[o].lz;
		segtr[o*2+1].lv=segtr[o*2+1].rv=segtr[o].lz;
		segtr[o*2].num=segtr[o*2+1].num=1;
		segtr[o*2].lz=segtr[o].lz;
		segtr[o*2+1].lz=segtr[o].lz;
		segtr[o].lz=0;
	}
		
}

void add_lot(int L,int R,int v,int o)
{
	if(segtr[o].l>R||segtr[o].r<L)
	{
		return;
	}
	if(segtr[o].l>=L&&segtr[o].r<=R)
	{
		segtr[o].lv=segtr[o].rv=segtr[o].lz=v;
		segtr[o].num=1;
		return;
	}
	no_lz(o);
	add_lot(L,R,v,o*2);
	add_lot(L,R,v,o*2+1);
	push_up(o);
}

int Lv,Rv;

long long get_lot(int L,int R,int o)
{
	if(segtr[o].l>R||segtr[o].r<L)
	{
		return 0;
	}
	if(segtr[o].l==L)
	{
		Lv=segtr[o].lv;
	}
	if(segtr[o].r==R)
	{
		Rv=segtr[o].rv;
	}
	if(segtr[o].l>=L&&segtr[o].r<=R)
	{
		return segtr[o].num;
	}
	no_lz(o);
	long long a1=get_lot(L,R,o*2),a2=get_lot(L,R,o*2+1);
	if(a1==0)
	{
		return a2;
	}
	else if(a2==0)
	{
		return a1;
	}
	else
	{
		if(segtr[o*2].rv==segtr[o*2+1].lv)
		{
			return a1+a2-1;
		}
		else
		{
			return a1+a2;
		}
	}
} 

void add_road(int x,int y,int v)
{
	while(tr[x].top!=tr[y].top)
	{
		if(tr[tr[x].top].deep<tr[tr[y].top].deep)
		{
			swap(x,y);
		}
		add_lot(tr[tr[x].top].id,tr[x].id,v,1);
		x=tr[tr[x].top].fa;
	}
	if(tr[x].deep>tr[y].deep)
	{
		swap(x,y);
	}
	add_lot(tr[x].id,tr[y].id,v,1);
}

long long get_road(int x,int y)
{
	long long ans=0;
	int lvx=-1,lvy=-1;
	while(tr[x].top!=tr[y].top)
	{
		if(tr[tr[x].top].deep<tr[tr[y].top].deep)
		{
			swap(x,y);swap(lvx,lvy);
		}
		ans+=get_lot(tr[tr[x].top].id,tr[x].id,1);
		if(lvx==Rv)
		{
			ans--;
		}
		lvx=Lv;
		x=tr[tr[x].top].fa;
	}
	if(tr[x].deep>tr[y].deep)
	{
		swap(x,y);swap(lvx,lvy);
	}
	ans+=get_lot(tr[x].id,tr[y].id,1);
	if(Rv==lvy)
	{
		ans--;
	}
	if(Lv==lvx)
	{
		ans--;
	}
	return ans;
}
int main()
{
	n=read();m=read();root=1;
	for(int i=1;i<=n;i++)
	{
		tr[i].v=read();
	}
	for(int i=1;i<=n-1;i++)
	{
		X=read();Y=read();
		addline(X,Y);
		addline(Y,X);
	}
	
	tr[root].fa=root;
	tr[root].deep=1;
	dfs1(root);//cout<<m;
	dfs2(root,root);
	build(1,n,1);
	
	for(int i=1;i<=m;i++)
	{
		//cout<<"A";
		cin>>bz;
		//scanf(" %c",&bz);
		if(bz=='C')
		{
			X=read();Y=read();Z=read();
			add_road(X,Y,Z);
		}
		else
		{
			X=read();Y=read();
			cout<<get_road(X,Y)<<endl;
		}
	}
	return 0;
}

不急,离线等。

2020/11/29 22:08
加载中...