当前位置: 首页 > news >正文

树链剖分+树状数组:ABC 460 G

https://atcoder.jp/contests/abc460/tasks/abc460_g

考虑直接树剖

单点权重修改是容易的

单点颜色修改,往上更新是容易的,但往下合并不容易,把下方值往上传亦不容易

但如果往下合并的值提前记录好了呢?

我们可以多定义一个懒标记,代表这个点所有与它本身颜色不同子节点的值的和

利用这个懒标记,我们即可实现颜色翻转时子节点信息的向上传递。

这个懒标记的维护,只需要我们每次往上修改时,先修改完所有同颜色的,然后再修改第一个不同颜色的即可

#include<bits/stdc++.h>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stdout,##__VA_ARGS__)#else#definedebug(...)void(0)#endif#defineintlonglonginlineintread(){intx=0,f=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}returnx*f;}#defineZ(x)(x)*(x)#definepbpush_back#definefifirst#definesesecond//#define M//#define mo#defineN300010intn,m,i,j,k,T;intc[N];inttot;vector<int>G[N];namespaceBin{intS[2][N];voidadd(intl,intr,intx,intco){autoAdd=[&](intx,intk,intco){if(!x)return;while(x<=tot){S[co][x]+=k;x+=x&-x;}};debug("ADD [%lld %lld] + %lld of (%lld)\n",l,r,x,co);Add(l,x,co);Add(r+1,-x,co);}intqry(intx,intco){intans=0;while(x){ans+=S[co][x];x-=x&-x;}returnans;}}namespaceBinC{intS[N];voidAdd(intx,intk){if(!x)return;// debug("BinCCCCCC %lld + %lld\n", x, k);while(x<=tot){S[x]+=k;x+=x&-x;}}intqry(intl,intr){autoQry=[&](intx)->int{intans=0;while(x){ans+=S[x];x-=x&-x;}returnans;};returnQry(r)-Qry(l-1);}boolcheck(intl,intr){intans=qry(l,r);// debug("Ans of [%lld %lld] is %lld\n", l, r, ans);if(ans==0||ans==r-l+1)returntrue;returnfalse;}}namespaceTree{intw[N],F[N],son[N],a[N],dfn[N];inttop[N];voiddfs1(intx,intfa){w[x]=1;F[x]=fa;for(inty:G[x])if(y!=fa){dfs1(y,x);w[x]+=w[y];if(!son[x]||w[y]>w[son[x]])son[x]=y;}}voiddfs2(intx,intfa){dfn[x]=++tot;a[tot]=x;if(son[x])top[son[x]]=top[x],dfs2(son[x],x);for(inty:G[x])if(y!=fa&&y!=son[x]){top[y]=y;dfs2(y,x);}// debug("top[%lld] = %lld\n", x, top[x]);}intFa(intx){if(!BinC::check(dfn[top[x]],dfn[x])){intl,r,mid;l=dfn[top[x]];r=dfn[x];while(l<r){mid=(l+r)>>1;if(BinC::check(mid,dfn[x]))r=mid;elsel=mid+1;}returna[l];}if(c[F[top[x]]]==c[x])returnFa(F[top[x]]);elsereturntop[x];}voidadd(intx,intk,intcol){debug("Tree add %lld [%lld] %lld\n",x,k,col);if(c[x]!=col)return;if(!BinC::check(dfn[top[x]],dfn[x])){intl,r,mid;l=mid=dfn[top[x]];r=dfn[x];while(l<r){mid=(l+r)>>1;if(BinC::check(mid,dfn[x]))r=mid;elsel=mid+1;}// debug("Now [%lld %lld] %lld %lld\n", dfn[top[x]], dfn[x], mid, (int)BinC :: check(mid, dfn[x]));Bin::add(l,dfn[x],k,col);Bin::add(l-1,l-1,k,col);}else{Bin::add(dfn[top[x]],dfn[x],k,col);if(c[F[top[x]]]==c[x])add(F[top[x]],k,col);elseBin::add(dfn[F[top[x]]],dfn[F[top[x]]],k,col);}}voidop2(intx,intk){debug("OP2 %lld(%lld) += %lld\n",x,Fa(x),k);add(x,k,c[x]);Bin::add(dfn[x],dfn[x],k,1-c[x]);}intop3(intx){intpare=Fa(x);debug("OP3 %lld : %lld == %lld\n",x,pare,Bin::qry(dfn[pare],c[x]));returnBin::qry(dfn[pare],c[x]);}voidop1(intx){intk=Bin::qry(dfn[x],c[x]);if(c[F[x]]==c[x])add(F[x],-k,c[x]);elseBin::add(dfn[F[x]],dfn[F[x]],-k,c[x]);BinC::Add(dfn[x],-c[x]+(1-c[x]));c[x]=1-c[x];k=Bin::qry(dfn[x],c[x]);if(c[F[x]]==c[x])add(F[x],k,c[x]);elseBin::add(dfn[F[x]],dfn[F[x]],k,c[x]);}}signedmain(){#ifdefLOCALfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endif// srand(time(NULL));// T = read();// while(T--) {//// }intq,u,v;n=read();q=read();vector<int>w(n+10);for(i=1;i<=n;++i)w[i]=read();for(i=1;i<=n;++i)c[i]=read();c[0]=n<<2;G[0].pb(1);for(i=1;i<n;++i){u=read();v=read();G[u].pb(v);G[v].pb(u);}Tree::dfs1(0,0);Tree::dfs2(0,0);// for(i = 1; i <= tot; ++i) debug("%lld ", Tree :: a[i]); debug("\n");for(i=0;i<=n;++i)BinC::Add(Tree::dfn[i],c[i]);for(i=1;i<=n;++i)Tree::op2(i,w[i]);while(q--){intop,x;op=read();x=read();if(op==1)Tree::op1(x);if(op==2){k=read();Tree::op2(x,k);}if(op==3){printf("%lld\n",Tree::op3(x));}for(i=1;i<=n;++i)debug("%lld ",Bin::qry(Tree::dfn[i],0));debug("\n");for(i=1;i<=n;++i)debug("%lld ",Bin::qry(Tree::dfn[i],1));debug("\n");debug("-------------------------------\n");}return0;}
http://www.jsqmd.com/news/1102954/

相关文章:

  • 【仅限首批200名开发者】解锁Claude 3.5隐藏API模式:对比ChatGPT,实现2.7倍更快的结构化输出+零额外token消耗——实测代码+配置模板限时放送
  • 高性能C++ Excel处理库OpenXLSX架构解析与最佳实践
  • Skill :project-structure(目录结构)
  • 终极免费AI背景移除插件:OBS Background Removal完整使用指南
  • 为什么92%的国内AI团队在6月悄悄切换至DeepSeek?——ChatGPT-4o中文语义理解盲区与DeepSeek-VL视觉-语言协同优势(独家内测数据首曝)
  • ChatGPT生成代码上线即崩?:从LLM幻觉到生产级交付的7步校验流水线(附Checklist模板)
  • AIDC 数据中心电源测试全解析——BBU 电池备份单元到 HVDC 高压直流,一套完整的测试方案怎么搭?
  • Cursor配置CheatEngine MCP自动化逆向分析详细教程
  • 基于STM32与KMX63的空间手势识别系统设计
  • 从网页曝光到AI心智占领:2026年企业GEO发稿选型指南与趋势预判
  • 终极教程:用OpenCore Legacy Patcher让旧款Mac焕发新生
  • 跨语言与跨平台Agent互操作:统一API网关与协议适配实战
  • 终极指南:3分钟破解QQ音乐加密格式,让QMC文件自由播放
  • 工业4-20mA电流环设计:DAC161S997与PIC18F47K42实战解析
  • IT爱学堂-SpringAI Alibaba+RAG+Milvus 传统应用升级项目实战
  • 2026餐饮SAAS收银系统维护商哪家好?凤梨收银系统适配服务商深度解析
  • ChatGPT vs 通义千问 vs 文心一言 vs 混元:谁真正适配中国企业级场景?——基于36家客户POC数据的硬核拆解
  • 5个关键步骤掌握dnSpy:免费开源.NET程序集调试与编辑终极指南
  • 2026门店SAAS系统开发公司哪家好?专业服务商选型指南与适配解析
  • 功率预测的精度困局与破局之道:从数值天气预报到AI智能体
  • 用PIC单片机驱动RGB灯带实现智能灯光控制
  • 赛事数据分析核心指标大全,AI助力赛事高效复盘
  • 终极免费AI背景移除插件:obs-backgroundremoval完整使用指南
  • 热处理与炉管工艺:从传统扩散炉到现代RTP
  • 【全球AI模型实力图谱2024】:深度拆解GPT-4o、Claude 3.5、Qwen2.5与GLM-4的推理精度、中文NLU得分及企业级部署TCO对比(附Benchmark原始数据)
  • 深圳周末去哪里玩?
  • 模板驱动型文档自动化:零代码实现精准批量生成
  • 家里有台TS3380,报错P07,电源灯和警告灯交替闪烁7次,维修店竟然要收费180元,我不同意就拿回来了,找人买了一个原版清零软件,2分钟不到给我修好了。直接省了180元的维修费,维修店太坑了。
  • Midscene.js架构深度解析:纯视觉驱动的跨平台AI自动化技术实现
  • DesktopNaotu:离线思维导图工具的全新工作流解决方案