社区讨论
【求调】过了样例,但RE了
P2486[SDOI2011] 染色参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mbudhogx
- 此快照首次捕获于
- 2025/06/13 13:34 8 个月前
- 此快照最后确认于
- 2025/06/13 20:11 8 个月前
CPP
#include<cstdio>
#include<vector>
typedef long long ll;
// IO
#define getchar_unlocked getchar
#define putchar_unlocked putchar
inline ll read(){
char c=getchar_unlocked();
int w=1;ll ret=0;
while(!(c>='0'&&c<='9')){if(c=='-')w=-1;c=getchar_unlocked();}
while(c>='0'&&c<='9'){ret=ret*10+(c^48);c=getchar_unlocked();}
return ret*w;
}
void write(ll x){
if(x<0){
putchar_unlocked('-');
x=-x;
}
if(x>9)write(x/10);
putchar_unlocked(48+(x%10));
}
// print
#include<cstring>
#include<iostream>
inline void print(std::string s){
std::cout<<"[system] "<<s<<"\n";
}
// Data
const int N=1e5+10;
int n,m,u,v,w;
char c;
ll col[N];
struct node{
ll lc,rc,tag;
int s;
bool empty(){return (lc==rc&&rc==tag&&tag==-1)&&(s==0);}
};
inline node merge(node a,node b){
if(a.empty())return b;
if(b.empty())return a;
node ret;
ret.tag=-1;
ret.lc=a.lc,ret.rc=b.rc;
ret.s=a.s+b.s;
if(a.rc==b.lc)--ret.s;
return ret;
}
// SGT
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
struct SGT{
ll data[N];
node tree[N<<2];
inline void pushup(int p){
tree[p].lc=tree[ls(p)].lc;
tree[p].rc=tree[rs(p)].rc;
tree[p].s=tree[ls(p)].s+tree[rs(p)].s;
if(tree[ls(p)].rc==tree[rs(p)].lc){
--tree[p].s;
}
}
void build(int p,int pl,int pr){
tree[p].tag=-1;
if(pl==pr){
tree[p].lc=tree[p].rc=data[pl];
tree[p].s=1;
return ;
}
int mid=pl+(pr-pl>>1);
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
pushup(p);
}
inline void addtag(int p,ll k){
tree[p].lc=tree[p].rc=k;
tree[p].s=1;
tree[p].tag=k;
}
inline void pushdown(int p){
if(tree[p].tag!=-1){
addtag(ls(p),tree[p].tag);
addtag(rs(p),tree[p].tag);
tree[p].tag=-1;
}
}
void modify(int p,int pl,int pr,int L,int R,ll k){
if(L<=pl&&pr<=R){
addtag(p,k);
return ;
}
pushdown(p);
int mid=pl+(pr-pl>>1);
if(L<=mid)modify(ls(p),pl,mid,L,R,k);
if(mid<R)modify(rs(p),mid+1,pr,L,R,k);
pushup(p);
}
node query(int p,int pl,int pr,int L,int R){
if(L<=pl&&pr<=R){
return tree[p];
}
pushdown(p);
int mid=pl+(pr-pl>>1);
node lt={-1,-1,-1,0},rt={-1,-1,-1,0};
if(L<=mid)lt=query(ls(p),pl,mid,L,R);
if(mid<R)rt=query(rs(p),mid+1,pr,L,R);
return merge(lt,rt);
}
}st;
// CTT
namespace CTT{
std::vector<int>G[N];
int dep[N],siz[N],son[N],fa[N],top[N],dfn[N],rnk[N],cnt;
void dfs1(int u,int fat){
dep[u]=dep[fat]+1;
fa[u]=fat;
siz[u]=1;
for(auto v:G[u]){
if(v==fat)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(!son[u]||(siz[v]>siz[son[u]])){
son[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t;
dfn[u]=++cnt;
rnk[cnt]=u;
if(!son[u])return ;
dfs2(son[u],t);
for(auto v:G[u]){
if(v==son[u])continue;
if(v==fa[u])continue;
dfs2(v,v);
}
}
inline void init(int root){
cnt=0;
for(int i=1;i<=n;++i)
dep[i]=siz[i]=son[i]=fa[i]=top[i]=dfn[i]=rnk[i]=0;
dep[root]=1;
dfs1(root,0);
// print("dfs1 done");
dfs2(root,root);
// print("dfs2 done");
return ;
}
inline node query(int x,int y){
int fx=top[x],fy=top[y];
node xt={-1,-1,-1,0},yt={-1,-1,-1,0},tmp;
while(fx!=fy){
if(dep[fx]>=dep[fy]){
tmp=st.query(1,1,n,dfn[fx],dfn[x]);
xt=merge(xt,tmp);
x=fa[fx];
}else{
tmp=st.query(1,1,n,dfn[fy],dfn[y]);
yt=merge(yt,tmp);
y=fa[fy];
}
fx=top[x];
fy=top[y];
}
if(dfn[x]<=dfn[y]){
tmp=st.query(1,1,n,dfn[x],dfn[y]);
xt=merge(xt,tmp);
return merge(xt,yt);
}else{
tmp=st.query(1,1,n,dfn[y],dfn[x]);
yt=merge(yt,tmp);
return merge(yt,xt);
}
}
inline void modify(int x,int y,ll k){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]>=dep[fy]){
st.modify(1,1,n,dfn[fx],dfn[x],k);
x=fa[fx];
}else{
st.modify(1,1,n,dfn[fy],dfn[y],k);
y=fa[fy];
}
fx=top[x];
fy=top[y];
}
if(dfn[x]<=dfn[y]){
st.modify(1,1,n,dfn[x],dfn[y],k);
}else{
st.modify(1,1,n,dfn[y],dfn[x],k);
}
return ;
}
};
using namespace CTT;
// Main
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)
col[i]=read();
for(int i=1;i<n;++i){
u=read(),v=read();
G[u].push_back(v);
G[v].push_back(u);
}
init(1);
// print("init done");
for(int i=1;i<=n;++i){
st.data[i]=col[rnk[i]];
}
st.build(1,1,n);
// print("st.build done");
for(int i=1;i<=m;++i){
c=getchar_unlocked();
u=read(),v=read();
if(c=='C'){
w=read();
modify(u,v,w);
}else{
write(query(u,v).s),putchar_unlocked('\n');
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...