离离原上谱!关于字符输入的问题
  • 板块学术版
  • 楼主Mo默Sh笙
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/3/20 20:24
  • 上次更新2023/10/23 20:59:56
查看原帖
离离原上谱!关于字符输入的问题
189485
Mo默Sh笙楼主2023/3/20 20:24

RT,在输入一个字符的时候,我使用scanf("%c",&op)导致全WA(Too short),改成cin>>op变成了AC,想知道这是为什么

题目:P2846染色

评测记录

输入部分代码块

char op;
F(i,1,m)
{
	cin>>op;//AC
//	scanf("%c",&op);//WA:Too short 
	if(op=='C')
	{
		int x=read(),y=read(),z=read();
		mchain(x,y,z);
	}
	else if(op=='Q')
	{
		int x=read(),y=read();
		printf("%d\n",qchain(x,y));
	}
}

全代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define F(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define G(i,u) for(int (i)=head[(u)];(i);(i)=nxt[(i)])
inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}return x*f;}
const int N=1e5+10;
int n,root,p,tot,tim;
int in[N],sz[N],dep[N],fa[N],son[N],dfn[N],top[N],val[N];
int head[N],ver[2*N],nxt[2*N];
int ansl,ansr;
struct MS
{
	int cl,cr,val,lazy;
}tr[N<<2];
void add(int x,int y)
{
	ver[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
void init(int u,int f)
{
	fa[u]=f;
	dep[u]=dep[f]+1;
	sz[u]=1;
	int maxx=0;
	G(i,u)
	{
		int v=ver[i];
		if(v==f) continue;
		init(v,u);
		sz[u]+=sz[v];
		if(sz[v]>maxx)
		{
			maxx=sz[v];
			son[u]=v;
		}
	}
}
void dfs(int u,int r)
{
	dfn[u]=++tim;
	top[u]=r;
	val[tim]=in[u];
	if(son[u]==0) return ;
	dfs(son[u],r);
	G(i,u)
	{
		int v=ver[i];
		if(v!=fa[u]&&v!=son[u])
			dfs(v,v);
	}
}
void pushup(int rt)
{
	tr[rt].cl=tr[rt<<1].cl;
	tr[rt].cr=tr[rt<<1|1].cr;
	tr[rt].val=tr[rt<<1].val+tr[rt<<1|1].val;
	if(tr[rt<<1].cr==tr[rt<<1|1].cl) tr[rt].val--;
}
void pushdown(int rt)
{
	if(tr[rt].lazy)
	{
		tr[rt<<1].lazy=tr[rt].lazy;
		tr[rt<<1|1].lazy=tr[rt].lazy;
		tr[rt<<1].cl=tr[rt].lazy;
		tr[rt<<1].cr=tr[rt].lazy;
		tr[rt<<1|1].cl=tr[rt].lazy;
		tr[rt<<1|1].cr=tr[rt].lazy;
		tr[rt<<1].val=1;
		tr[rt<<1|1].val=1;
		tr[rt].lazy=0;
	}
}
void build(int l,int r,int rt)
{
	if(l==r)
	{
		tr[rt].lazy=0; 
		tr[rt].val=1;
		tr[rt].cl=val[l];
		tr[rt].cr=val[r];
		return;
	}
	int m=(l+r)>>1;
	build(l,m,rt<<1);
	build(m+1,r,rt<<1|1);
	pushup(rt);
}
void update(int L,int R,int C,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		tr[rt].cl=C;
		tr[rt].cr=C;
		tr[rt].lazy=C;
		tr[rt].val=1;
		return ;
	}
	int m=(l+r)>>1;
	pushdown(rt);
	if(L<=m) update(L,R,C,l,m,rt<<1);
	if(m+1<=R) update(L,R,C,m+1,r,rt<<1|1);
	pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		if(L==l) ansl=tr[rt].cl;
		if(R==r) ansr=tr[rt].cr;
		return tr[rt].val;
	}
	int m=(l+r)>>1,ANS=0;
	pushdown(rt);
	if(L<=m) ANS+=query(L,R,l,m,rt<<1);
	if(m+1<=R) ANS+=query(L,R,m+1,r,rt<<1|1);
	if(L<=m&&m+1<=R)
		if(tr[rt<<1].cr==tr[rt<<1|1].cl) ANS--;
	return ANS;
}
void mchain(int x,int y,int z)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		update(dfn[top[x]],dfn[x],z,1,n,1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])
		swap(x,y);
	update(dfn[x],dfn[y],z,1,n,1);
}
int qchain(int x,int y)
{
	int ANS=0;
	int lstl=0,lstr=0;//lst1表示左子树最浅颜色,lst2表示右子树最浅颜色 
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
			swap(x,y),swap(lstl,lstr);
		ANS+=query(dfn[top[x]],dfn[x],1,n,1);
		if(lstl==ansr) ANS--;//ansl为刚处理的区间的左节点,ansr为右节点 
		lstl=ansl;
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])
		swap(x,y),swap(lstl,lstr);
	ANS+=query(dfn[x],dfn[y],1,n,1);
	if(lstl==ansl) ANS--;
	if(lstr==ansr) ANS--;
	return ANS;
}
int main()
{
	int m;
	n=read(),m=read();
	F(i,1,n) in[i]=read();
	F(i,1,n-1)
	{
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	init(1,1);
	dfs(1,1);
	build(1,n,1);
	char op;
	F(i,1,m)
	{
//		cin>>op;//AC
		scanf("%c",&op);//WA:Too short 
		if(op=='C')
		{
			int x=read(),y=read(),z=read();
			mchain(x,y,z);
		}
		else if(op=='Q')
		{
			int x=read(),y=read();
			printf("%d\n",qchain(x,y));
		}
	}
	return 0;
}
2023/3/20 20:24
加载中...