P6805-[CEOI2020]春季大扫除【贪心,树链剖分,线段树】

正题

题目链接:https://www.luogu.com.cn/problem/P6805


题目大意

给出nnn个点的一棵树,qqq次独立的询问。每次询问会在一些节点上新增一些子节点,然后你每次可以选择两个为选择过的叶子节点然后覆盖它们的路径,要求在覆盖所有边的情况下使得每次的路径长度和最小。

1≤n,q,∑di≤1051\leq n,q,\sum d_i\leq 10^51n,q,di105


解题思路

先考虑暴力怎么做,我们可以把所有叶子去掉然后每个点的权值就是它原来子节点中的叶子数。

然后由于一个节点之间的权值可以两两匹配,贪心的话一个节点只有可能有1/21/21/2条路径延伸到父节点,这样就可以统计了。

然后考虑多个询问如何处理,根据上面的方法,每条边只有可能统计1/21/21/2次,而统计两次时当且仅当子树内能够两两配对,此时因为不能有边没有覆盖,所以就只能拆开一个配对分两个上来。

具体地当一个点的子树中叶子数为偶数时它到其父节点的边会被统计两次。

这个用树链剖分维护即可。

时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int N=1e5+10;
struct node{int to,next;
}a[N<<1];
int n,m,tot,cnt,ls[N],leaf[N],lsz[N];
int dep[N],fa[N],siz[N],son[N],top[N],id[N];
int w[N<<2],v[N<<2],lazy[N<<2];stack<int> s;
void Downdata(int x){if(!lazy[x])return;lazy[x*2]^=1;lazy[x*2+1]^=1;swap(w[x*2],v[x*2]);swap(w[x*2+1],v[x*2+1]);lazy[x]=0;return;
}
void Build(int x,int L,int R){if(L==R){w[x]=(L>1);return;}int mid=(L+R)>>1;Build(x*2,L,mid);Build(x*2+1,mid+1,R);w[x]=w[x*2]+w[x*2+1];
}
void Change(int x,int L,int R,int l,int r){if(L==l&&R==r){swap(w[x],v[x]);lazy[x]^=1;return;}int mid=(L+R)>>1;Downdata(x);if(r<=mid)Change(x*2,L,mid,l,r);else if(l>mid) Change(x*2+1,mid+1,R,l,r);else Change(x*2,L,mid,l,mid),Change(x*2+1,mid+1,R,mid+1,r);w[x]=w[x*2]+w[x*2+1];v[x]=v[x*2]+v[x*2+1];return;
}
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x){leaf[x]=(a[ls[x]].next==0);siz[x]=1;dep[x]=dep[fa[x]]+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x])continue;fa[y]=x;dfs(y);lsz[x]+=lsz[y];siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}lsz[x]+=leaf[x];return;
}
void dfs2(int x){id[x]=++cnt;if(lsz[x]&1)Change(1,1,n,cnt,cnt); if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]||y==son[x])continue;top[y]=y;dfs2(y);}return;
}
void Updata(int x){while(x){Change(1,1,n,id[top[x]],id[x]);x=fa[top[x]];}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}Build(1,1,n);dfs(1);top[1]=1;dfs2(1);while(m--){int k,x,sum=lsz[1];scanf("%d",&k);for(int i=1;i<=k;i++){scanf("%d",&x);if(leaf[x]==1)leaf[x]=2;else sum++,Updata(x);s.push(x);}if(sum&1)puts("-1");else printf("%d\n",n-1+k+w[1]);while(!s.empty()){int x=s.top();if(leaf[x]==2)leaf[x]=1;else Updata(x);s.pop();} }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

导弹防御系统

导弹防御系统 题意&#xff1a; 最少可以找到一直 严格单调 上升或者一直 严格单调 下降 题解&#xff1a; 第一反应是LIS&#xff0c;但是本题要求找一直上升或者一直下降的&#xff0c;LIS不能实现 但是我们还是从LIS下手&#xff0c;LIS中最核心的思想是能否将一个元素加…

STL:bitset用法详解

文章目录前言声明输入输出访问与修改位运算所谓bitset&#xff0c;就是bit组成的set &#xff08;逃&#xff09; 前言 bitset的诸多好处&#xff1a; 1.节约空间 2.增加一些新的功能 3.几乎没有副作用 4.有了123还不够吗&#xff01;&#xff1f; 当然&#xff0c;还有一个决…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

P6846-[CEOI2019]Amusement Park【状压dp,FWT】

正题 题目链接:https://www.luogu.com.cn/problem/P6846 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;保证两个点之间最多只有一条边。现在你可以取反一些边使得图变为一张DAGDAGDAG&#xff0c;求所有方案的取反的边数和。 1≤n≤181\leq n\leq 181≤n≤18 解题思路…

CDQ 分治与整体二分

CDQ 分治与整体二分 CDQ 分治 主要是一种分治思想&#xff0c;常用于解决偏序问题。 例如三维偏序问题&#xff0c;我们采用的方法是先处理以第一关键字为区分的左区间、右区间内的答案&#xff0c;再处理左右区间互不干涉的答案。 四维偏序呢&#xff1f; 咕咕咕 整体二分 主要…

[树链剖分][SDOI 2011]染色,Housewife Wind

文章目录T1&#xff1a;Housewife Wind题目题解codeT2&#xff1a;染色题目题解code今天选择写这篇博客主要是为了告诉大家一个道理&#xff0c;数组比vectorvectorvector快太多了&#xff0c;我这两道题第一次都因为vectorvectorvector&#xff0c;TTT到飞起 T1&#xff1a;…

最长上升子序列模型

有两个模板&#xff1a; 最长上升子序列这类题目都是这俩变形而来 最长上升子序列模型 AcWing 1017. 怪盗基德的滑翔翼1120人打卡 AcWing 1014. 登山1094人打卡 AcWing 482. 合唱队形1069人打卡 AcWing 1012. 友好城市1040人打卡 AcWing 1016. 最大上升子序列和1048人打卡 AcWi…

YBTOJ:向量问题(线段树分治、凸包)

文章目录题目描述数据范围解析代码题目描述 你要维护一个向量集合&#xff0c;支持以下操作&#xff1a; 插入一个向量 。 删除插入的第 x 个向量。 查询当前集合与(x,y)(x,y)(x,y) 点积的最大值是多少。如果当前是空集输出0。 数据范围 n<2e5,x、y∈[1,2e6]n<2e5,x、y∈…

ASP.NET Core 网站运行时修改设置如何自动生效

点击蓝字关注我在ASP.NET Core中&#xff0c;如果修改了appsettings.json中的设置&#xff0c;那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢&#xff1f;背景首先&#xff0c;我们看看默认模板建出来的 ASP.NET Core 网站&#xff0c;配置文件…

AGC004(A~E)

前言 FFF不会做&#xff0c;正解好神仙&#xff0c;爬了 正题 AT2041 [AGC004A] Divide a Cuboid https://www.luogu.com.cn/problem/AT2041 题目大意 一个A∗B∗CA*B*CA∗B∗C的立方体&#xff0c;分成两个长方体使得边长都是整数而且体积差最小。 1≤A,B,C≤1091\leq A,B…

1022. 宠物小精灵之收服

1022. 宠物小精灵之收服 题意&#xff1a; 现在有n个胶囊&#xff0c;m个生命值&#xff0c;k个怪物&#xff0c;每个怪物需要a[i]个胶囊&#xff0c;且会造成b[i]个伤害后才能捕获&#xff0c;问在活着的前提下&#xff0c;最多捕获多少怪物&#xff0c;在怪物最多的情况下剩…

平衡树 - FHQ 学习笔记

平衡树 - FHQ 学习笔记 主要参考万万没想到 的 FHQ-Treap学习笔记。 本片文章的姊妹篇&#xff1a;平衡树 - Splay 学习笔记。 感觉完全不会平衡树&#xff0c;又重新学习了一遍 FHQ&#xff0c;一口气把常见套路都学完了。 一、大致内容及分类 FHQ(???)&#xff0c;全称非旋…

【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

文章目录T1&#xff1a;单峰排列题目题解codeT2&#xff1a;历史研究题目题解codeT3&#xff1a;大魔法师题目题解code我可能这辈子都更不出来狂欢赛5了&#xff0c;先咕咕 T1&#xff1a;单峰排列 题目 一个n的全排列A[i]是单峰的&#xff0c;当且仅当存在某个x使得A[1]<…

YBTOJ:圈套问题(分治法、鸽笼原理)

文章目录题目描述数据范围解析代码图片转载自&#xff1a; https://blog.csdn.net/weixin_43346722/article/details/118435430题目描述 平面上有 n个点&#xff0c;用n个大小相同的圆分别将一个点作为圆心&#xff0c;同时满足圆圈不相交&#xff0c;求圆的最大半径。 数据范…

CF1598E-Staircases【计数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1598E 题目大意 给出一个nmn\times mnm的网格图&#xff0c;开始所有都是黑色的&#xff0c;qqq次取反一个格子的颜色&#xff0c;然后求楼梯的数量。 楼梯定义为全黑色的下/右交替的格子集。 1≤n,m≤1000,1≤q≤1041\le…

ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

一、前言在项目开发中&#xff0c;日志系统是系统的一个重要组成模块&#xff0c;通过在程序中记录运行日志、错误日志&#xff0c;可以让我们对于系统的运行情况做到很好的掌控。同时&#xff0c;收集日志不仅仅可以用于诊断排查错误&#xff0c;由于日志同样也是大量的数据&a…

532. 货币系统

532. 货币系统 题意&#xff1a; 有 n 种不同面额的货币&#xff0c;第 i 种货币的面额为 a[i]&#xff0c;每一种货币都有无穷多张&#xff0c;货币之间可以彼此代替&#xff0c;比如6等于两张3&#xff0c;问有多少种货币是不可替代的 题解&#xff1a; 我们换一个问…

概率期望题(期望 DP)做题记录

概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问&#xff1a;生成树的期望深度。 不 wei zhuo 捏&#xff0c;设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结点&#xff0c;深度大于 \(j\) 的概率。 考虑枚举一棵子树的大小&#xff0c;转移方程如下&#x…

[学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

文章目录引入概念全套模板变量声明updaterotate旋转splay操作insert插入delete删除查找x的位置查找第k大前驱/后继极小值-inf和极大值inf的作用例题&#xff1a;P3369 【模板】普通平衡树题目code声明一下&#xff0c;许多代码的注解都在模板代码里面写了的&#xff0c;所以正文…