【树链剖分】春季大扫除(P6805)

正题

P6805


题目大意

给你一棵树,每次可选择两个叶子结点,然后覆盖路径上的边,代价为其长度,每个叶子结点只能选一次。

对于每次询问,加入若干新点(只会连接原树的点),问你覆盖所有边的最小代价。


解题思路

因为所有边都要覆盖,所以一个点至少连一条到父亲的边

不难发现,如果一个点的子树内有偶数各叶子结点,那么就要连出两条边,否则连一条边,因为所有点都要连向父亲,所以只计算多出来的

那么可以树链剖分,然后用线段树维护子树叶子结点的值

对于每次查询,相当于把若干链上的值异或1,然后查询整棵树的值


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100100
using namespace std;
int n,m,q,x,y,w,tot,a[N],s[N],h[N],p[N];
int sz[N],fa[N],hs[N],deg[N],low[N],dfn[N],dep[N],top[N],lsz[N];
struct rec
{int to,nx;
}e[N<<1];
void add(int x,int y)
{e[++tot].to=y;e[tot].nx=h[x];h[x]=tot;return;
}
struct Tree
{#define ls x*2#define rs x*2+1int v[N<<2],lazy[N<<2];void push_up(int x){v[x]=v[ls]+v[rs];return;}void get(int x,int l,int r){lazy[x]^=1;v[x]=r-l+1-v[x];return;}void push_down(int x,int l,int r){if(lazy[x]){int mid=l+r>>1;get(ls,l,mid);get(rs,mid+1,r);lazy[x]=0;}return;}void change(int x,int L,int R,int l,int r){if(L==l&&R==r){get(x,L,R);return;}push_down(x,L,R);int mid=L+R>>1;if(r<=mid)change(ls,L,mid,l,r);else if(l>mid)change(rs,mid+1,R,l,r);else change(ls,L,mid,l,mid),change(rs,mid+1,R,mid+1,r);push_up(x);return;}int ask(int x,int L,int R,int l,int r){if(L==l&&R==r)return v[x];push_down(x,L,R);int mid=L+R>>1;if(r<=mid)return ask(ls,L,mid,l,r);else if(l>mid)return ask(rs,mid+1,R,l,r);else return ask(ls,L,mid,l,mid)+ask(rs,mid+1,R,mid+1,r);}
}T;
void dfs1(int x)
{sz[x]=1;if(deg[x]==1)lsz[x]=1,p[x]=1;for(int i=h[x];i;i=e[i].nx){int y=e[i].to;if(y==fa[x])continue;fa[y]=x;dep[y]=dep[x]+1;dfs1(y);sz[x]+=sz[y];lsz[x]+=lsz[y];if(sz[y]>sz[hs[x]])hs[x]=y;}return;
}
void dfs2(int x,int anc)
{dfn[x]=++w;top[x]=anc;if(!(lsz[x]&1))T.change(1,1,n,dfn[x],dfn[x]);if(hs[x])dfs2(hs[x],anc);for(int i=h[x];i;i=e[i].nx){int y=e[i].to;if(y==fa[x]||y==hs[x])continue;dfs2(y,y);}low[x]=w;return;
}
void add(int x)
{while(top[x]!=1){T.change(1,1,n,dfn[top[x]],dfn[x]);x=fa[top[x]];}T.change(1,1,n,dfn[1],dfn[x]);return;
}
int main()
{scanf("%d%d",&n,&q);for(int i=1;i<n;++i){scanf("%d%d",&x,&y);add(x,y);add(y,x);deg[x]++;deg[y]++;}dep[1]=fa[1]=1;dfs1(1);dfs2(1,1);while(q--){scanf("%d",&m);for(int i=1;i<=m;++i){scanf("%d",&a[i]);s[i]=1;}a[m+1]=0;sort(a+1,a+1+m);for(int i=1;i<=m;++i)if(a[i]==a[i+1])s[i+1]+=s[i];else if(p[a[i]]){if(!(s[i]&1))add(a[i]);//修改一条链}else if(s[i]&1)add(a[i]);if(!T.ask(1,1,n,dfn[1],dfn[1]))puts("-1");//无法两两匹配else printf("%d\n",T.ask(1,1,n,dfn[1],low[1])+n+m-2);//加上没算的边,1没有连向父亲的边,但两边都会多算一次for(int i=1;i<=m;++i)if(a[i]!=a[i+1]){if(p[a[i]]){if(!(s[i]&1))add(a[i]);}else if(s[i]&1)add(a[i]);}}return 0;
}

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

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

相关文章

序列自动机

介绍 子串&#xff1a;串中任意个连续的字符组成的子序列称为该串的子串 子序列&#xff1a;子序列中的字符在字符串中不一定是连在一起的&#xff0c;而是删除其中若干个&#xff0c; 但子序列一定是单调的 简单说就是子序列不连续&#xff0c;子串连续 序列自动机可以在复杂…

基于gRPC服务发现与服务治理的方案

重温最少化集群搭建&#xff0c;我相信很多朋友都已经搭建出来&#xff0c;基于Watch机制也实现了出来&#xff0c;相信也有很多朋友有了自己的实现思路&#xff0c;但是&#xff0c;很多朋友有个疑问&#xff0c;我API和服务分离好了&#xff0c;怎么通过服务中心进行发现呢&a…

YbtOJ#723-欧拉之树【莫比乌斯反演,虚树】

正题 题目链接:http://www.ybtoj.com.cn/contest/121/problem/2 题目大意 给出nnn个点的一棵树&#xff0c;每个点有一个权值aia_iai​&#xff0c;求 ∑i1n∑j1ndis(i,j)φ(aiaj)\sum_{i1}^n\sum_{j1}^ndis(i,j)\times \varphi(a_i\times a_j)i1∑n​j1∑n​dis(i,j)φ(ai​…

拼凑 牛客练习赛70

来源&#xff1a;牛客网&#xff1a; 题目描述 牛牛还是很喜欢字符串"puleyaknoi"。 牛牛有T个超长超长的字符串&#xff0c;不过这次他更懒了&#xff0c;他希望直接在字符串中看见他喜欢的字符串。 如果一个子串中含有一个子序列是”puleyaknoi“&#xff0c;那么…

【kruskal】【倍增】严格次小生成树(P4180)

正题 P4180 题目大意 求严格次小生成树 解题思路 一定存在一种严格次小生成树&#xff0c;和最小生成树只差一条边&#xff0c;不然可以用一条最小生成树上的边代替&#xff0c;从而使边权和更小 那么可以先构造出最小生成树&#xff0c;然后枚举每一条不在最小生成树中的边…

ARC107——C - Shuffle Permutation

C - Shuffle Permutation 这几天遇到了很多&#xff08;2道&#xff09;并查集维护连通关系的题。 此题把能够相互交换的行或者列用并查集维护&#xff0c;不难发现一个连通块内的点个数时cntcntcnt连通块内的行或者列可以两两交换&#xff0c;那么对答案的贡献是cnt!cnt!cnt…

CentOS ASP.NET Core Runtime Jexus跨平台布署

.net core 开源和跨平台&#xff0c;能布署到当前主流的Windows&#xff0c;Linux&#xff0c;macOS 系统上。本篇我们将在 Linux 系统上使用 ASP.NET Core Runtime 和 Jexus 布署运行 ASP.NET Core 网站。Linux 系统选的是 CentOS 7.4 64位.NET Core 安装的是 ASP.NET Core Ru…

P1912-[NOI2009]诗人小G【四边形不等式,单调队列】

正题 题目链接:https://www.luogu.com.cn/problem/P1912 题目大意 给出nnn个字符串&#xff0c;把这些字符串依次用空格&#xff08;算一个长度&#xff09;连接分成若干段&#xff0c;若一段长度为xxx&#xff0c;那么代价是∣x−L∣P|x-L|^P∣x−L∣P 求代价和最小的方案&…

疾病预测和天气分析练习赛

肝了半天再加一个晚上。。 之前学了一小段时间的TensorFlow&#xff0c;但是今天练习赛时发现根本没啥用。。。第一阶段早就做完了&#xff0c;今天做的都是第二阶段&#xff0c;都是啥玩意题 又是偏度&#xff0c;又是求系数&#xff0c;又是拟合KNN&#xff0c;真的把人看吐…

Korney Korneevich and XOR(CF750F1/F2)

正题 CF750F1 CF750F2 题目大意 给你一个数列&#xff0c;问有多少个数可以由一个单调递增的子序列异或得到 解题思路 对于F1&#xff0c;可以用p存下得到一个数的最小值&#xff08;即当前子序列前缀的最后一个数&#xff09;&#xff0c;然后直接暴力转移 对于F2&#xf…

《信号与系统》期中总结

某高校的某专业于2020/11/8日进行《信号与系统》期中考试&#xff0c;而某同学这次考试直接爆炸&#xff0c;原因某同学也差不多知道&#xff1a;对待这门学科浅尝辄止&#xff0c;只达到了看着答案&#xff08;看答案看书&#xff09;能够把作业做出来的程度。虽然已经爆炸了&…

YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】

正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/3 题目大意 S(i)S(i)S(i)表示iii的约数个数&#xff0c;QQQ次询问给出n,mn,mn,m求 ∑a1n∑b1mS(a2)S(b2)S(ab)\sum_{a1}^n\sum_{b1}^mS(a^2)\times S(b^2)\times S(a\times b)a1∑n​b1∑m​S(a2)S(b2)S(ab) 1≤Q≤…

微软智能云三驾马车Azure、Office 365、Dynamics 365齐聚中国

Dynamics 365计划于2019年春落地中国&#xff1b;Windows Server 2019、Office 2019正式商用&#xff1b;SQL Server 2019、Azure Sphere 公开预览&#xff1b;Microsoft Azure 更新数十项云服务与功能&#xff0c;聚焦物联网与边缘。2018年10月25日&#xff0c;上海 —— 2018…

H - Holy Grail

H - Holy Grail 题意&#xff1a; 题干又臭又长 我简单说说 n个点&#xff0c;m条有向边&#xff0c;边权为负&#xff0c;然后给你六组起始点&#xff08;s点和t点&#xff09;&#xff0c;你要在s和t之间建一个有向边&#xff0c;要使得权值最小&#xff0c;问这六组边依次…

【LCT】魔法森林(P2387)

正题 P2387 题目大意 给你一个图&#xff0c;每条边有两个全职a,b&#xff0c;现在让你找一条从1到n的路径使得max(a)max(b)最小 解题思路 对a进行排序&#xff0c;枚举a的最大值&#xff0c;然后取b最小的边&#xff0c;找1到n的最短路径 找最短路径可以用LCT求&#xff0…

ASP.NET Core SignalR中的流式传输

什么是流式传输&#xff1f;流式传输是这一种以稳定持续流的形式传输数据的技术。流式传输的使用场景有些场景中&#xff0c;服务器返回的数据量较大&#xff0c;等待时间较长&#xff0c;客户端不得不等待服务器返回所有数据后&#xff0c;再进行相应的操作。这时候使用流式传…

codeforces1435 D. Shurikens

D. Shurikens 自己感觉差不多写了个模拟过了59组数据。 明显这题可能和栈扯上关系&#xff0c;因为很想括号匹配求卡特兰数的形式 看了大佬博客后发现真的和栈有关于是学习了一波。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) …

YbtOJ#662-交通运输【线段树合并,树状数组】

正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/2 题目大意 给出nnn个点的一棵有根树&#xff0c;对于每个xxx求&#xff0c;删除点xxx后修改某个点的父节点&#xff08;修改前该点必须有父节点&#xff09;后最小化最大联通块大小。 解题思路 删掉一个点后肯定…

EOJ Monthly 2020.9 Sponsored by TuSimple E. 加密的情书

E加密的情书 本人太菜&#xff0c;只会签到 题意&#xff1a; 一个多位数可以通过加密变成个位数&#xff0c;加密方式为&#xff1a;各个位数上的数相加&#xff0c;直到加成个位数 例如&#xff1a; 123 --》 1236 现在给出加密后的一串密文 问是否存在连续的自然数数列 l …

【线段树】Frog Traveler(CF751D)

正题 CF751D 题目大意 现在有n个点&#xff0c;当你在i时&#xff0c;可以向前跳 0∼ai0\sim a_i0∼ai​ 步&#xff0c;跳到j&#xff0c;然后向后走bjb_jbj​步&#xff0c;现在让你从n开始跳&#xff0c;回答跳到0的最少步数 解题思路 设fif_ifi​为跳到i的最少步数&…