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;
}