[洛谷P4556][BZOJ3307]雨天的尾巴-T3订正
线段树合并+树上差分
题目链接(···) 「简单」「一般」——其实「一般」也只多一个离散化
考试时想法看>这里<
总思路:先存所有的操作,离散化,然后用树上差分解决修改,用权值线段树维护每个值的个数,最后dfs合并处理答案(先处理儿子,再合并自己和儿子,递归解决)
简单版当然不用离散话辣。
做了好几天,感觉自己傻了。
但是好像也不是这样的
事实上,这道题确实扩充了我对线段树的认识。
它它它还可以不存左右区间的啊?——一定是我太蒻了
先附样例以示敬意
Sample Input
Sample Output
我还是第一次见这么恐怖的样例
不过它也是我的救命稻草,让我骗了5分,这是之前的事
样例以1为根的巨树
还是能看下的
树上差分就是通过修改树上某些节点的值来修改一段区间值的方法,比较常用
比如我们需要加树上一个区间
想这样,加从3到4的区间,每个加1(加N也一样)
那么我们按照差分法,3++,4++,1--,2--
「公式」其实是 x+n ,y+n ,lca(x,y)-n ,father[lca(x,y)]-n
别告诉我你不会lca,虽然我也是刚学了实用的版本
结果是这样的
这一步很快的···
我们要的结果当然不是±1什么的,要的是1或0
所以下面就是dfs统计结果(‘=’号前是过程,‘=’后是结果)
仿佛得到了结果
这样我们就能够离线处理树上的区间加减
注意:只能是离线,N个修改,一次输出
线段树合并前面已经说过,这里不再细讲。
这个题仿佛对内存的限制很苛刻(我MLE 22 次,数过,想哭),所以线段树的节点一定要节约开空,只开最大值和左右儿子指针
//鬼知道我调了几天的是这个傻点
左右区间可以递归维护,不必要一定存在节点里,
也不必须在维护最大值时捆绑维护下标,查询时的O(NlogN)还是可以接受的
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
#define N 200001
#define B 2*N
#define logN 31
using namespace std;
struct ST{
int f,t,next;
};ST rs[B];
int tot=,fl[N],n,m,len;
void add(int f,int t){
rs[tot].f=f;
rs[tot].t=t;
rs[tot].next=fl[f];
fl[f]=tot;
tot++;
}
struct XDS{
XDS *lid,*rid;
int maxn;
XDS(){
lid=rid=NULL;
maxn=;
}
};XDS *root[N];
struct CON{
int x,y,z;
};CON q[N];
int val[N];
int fvind(int i){
return lower_bound(val,val+len,i)-val+;
}
inline void build(XDS *&n){
n=new XDS();
}
void add(XDS *&rt,int v,int k,int l,int r){
if(rt==NULL)build(rt);
if(l==r){
rt->maxn+=k;
return ;
}
int mid=(l+r)>>;
if(mid>=v){
add(rt->lid,v,k,l,mid);
}
else{
add(rt->rid,v,k,mid+,r);
}
if(rt->lid!=NULL){
rt->maxn = rt->lid->maxn;
}
if(rt->rid!=NULL&&
rt->maxn < rt->rid->maxn)
rt->maxn = rt->rid->maxn;
}
int dep[N],fa[N][logN],ln;
bool is_v[N];
struct Myqu{
int f,e;
int Q[N*];
void push(int k){
e++;
Q[e]=k;
}
int front(){
f++;
return Q[f];
}
bool empty(){
if(e==f)return true;
return false;
}
}qu;
void bfs(int k){
qu.push(k);
is_v[k]=;
while(!qu.empty()){
int f=qu.front();
for(int i=fl[f];i!=-;i=rs[i].next){
if(!is_v[rs[i].t]){
qu.push(rs[i].t);
is_v[rs[i].t]=;
fa[rs[i].t][]=f;
dep[rs[i].t]=dep[f]+;
for(int j=;j<=ln;j++) fa[rs[i].t][j]=fa[fa[rs[i].t][j-]][j-];
}
}
}
}
int lca(int a,int b){//cout<<a<<SP<<b<<endl;
if(dep[a]>dep[b])swap(a,b);
for(int i=ln;i>=;i--)
if(dep[fa[b][i]]>=dep[a]){
b=fa[b][i];
//cout<<" "<<b<<" Dep"<<dep[b]<<endl;
}
if(a==b) return b;
for(int i=ln;i>=;i--)
if(fa[a][i]!=fa[b][i]){
a=fa[a][i],b=fa[b][i];
}
return fa[a][];
}
XDS* merge(int l,int r,XDS *&a,XDS *&b){
if(a==NULL)return b;
if(b==NULL)return a;
if(l==r){
a->maxn =a->maxn+b->maxn;
delete b;
b=NULL;
return a;
}
int mid=(l+r)>>;//puts("midgot");
a->lid=merge(l,mid,a->lid,b->lid);//puts("Lid merge end");
a->rid=merge(mid+,r,a->rid,b->rid);
if(a->lid!=NULL){
a->maxn = a->lid->maxn;
}
if(a->rid!=NULL&&
a->rid->maxn > a->maxn)
a->maxn =a->rid->maxn;
return a;
}
int ffind(XDS *rt,int l,int r){
int mid=(l+r)>>;
if(rt==NULL)return -;
if(l==r)return l;
if(rt->lid==NULL&&rt->rid==NULL)return -;
if(rt->lid==NULL)return ffind(rt->rid,mid+,r);
if(rt->rid==NULL)return ffind(rt->lid,l,mid);
if(rt->lid->maxn>=rt->rid->maxn){
return ffind(rt->lid,l,mid);
}
else return ffind(rt->rid,mid+,r);
}
void getans(int k){
is_v[k]=;
for(int i=fl[k];i!=-;i=rs[i].next){
if(is_v[rs[i].t]){
getans(rs[i].t);
root[k]=merge(,len,root[k],root[rs[i].t]);
}
}
int q=ffind(root[k],,len);
if(q==-)dep[k]=;
else dep[k]=val[q-];
}
int du[N];
int main(){
int a,b,c,ro;
memset(fl ,-,sizeof fl);
scanf("%d%d",&n,&m);
ln=log2(n)+;
for(int i=;i<n;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
for(int i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
q[i].x=a ,q[i].y=b ,q[i].z=val[i-]=c;
du[a]++,du[b]++;
}
int maxn=-;
for(int i=;i<=n;i++){
if(du[i]>maxn){
ro=i;
maxn=du[i];
}
}
sort(val+,val+m);
len=unique(val,val+m)-val;
dep[ro]=;
bfs(ro);
for(int i=;i<=m;i++){
int Lca=lca(q[i].x,q[i].y),val=fvind(q[i].z);
add(root[Lca], val,-,,len);
add(root[fa[Lca][]],val,-,,len);
add(root[q[i].x] ,val, ,,len);
add(root[q[i].y] ,val, ,,len);
}
getans(ro);
for(int i=;i<=n;i++){
printf("%d\n",dep[i]);
}
return ;
}
Total Code
[洛谷P4556][BZOJ3307]雨天的尾巴-T3订正的更多相关文章
- 【洛谷P4556】 雨天的尾巴
题面 题解 线段树合并 我们看到这道题目首先可以想到树上差分,然后\(dfs\)合并 发现题目让我们求的东西很好用线段树维护 于是可以想到线段树合并 全世界只有我写指针版动态开点线段树(大雾 如果你要 ...
- 洛谷P4556 雨天的尾巴(线段树合并)
洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...
- [洛谷P4556] 雨天的尾巴
这道题可以用线段树合并做,网上的题解基本上都是线段树合并的. 但是为什么我就偏偏要用dsu on tree...... 题目传送门 dsu on tree的方法类似[CF1009F] Dominant ...
- [BZOJ3307] 雨天的尾巴(树上差分+线段树合并)
[BZOJ3307] 雨天的尾巴(树上差分+线段树合并) 题面 给出一棵N个点的树,M次操作在链上加上某一种类别的物品,完成所有操作后,要求询问每个点上最多物品的类型. N, M≤100000 分析 ...
- 洛谷 P4556 [Vani有约会]雨天的尾巴 解题报告
P4556 [Vani有约会]雨天的尾巴 题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒 ...
- [bzoj3307]雨天的尾巴_线段树合并
雨天的尾巴 bzoj-3307 题目大意:N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. ...
- 洛谷P4556 [Vani有约会]雨天的尾巴(线段树合并)
题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地 ...
- 洛谷P4556 雨天的尾巴 线段树
正解:线段树合并 解题报告: 传送门! 考虑对树上的每个节点开一棵权值线段树,动态开点,记录一个max(num,id)(这儿的id,define了一下,,,指的是从小到大排QAQ 然后修改操作可以考虑 ...
- 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)
传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...
随机推荐
- FLINK源代码调试方式
此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 第一种,直接通过IDEA WINDOWS调试 前提是Flink所有依赖已经导入,直接在Test中打断点,然后直 ...
- HDU - 1019 - Least Common Multiple - 质因数分解
http://acm.hdu.edu.cn/showproblem.php?pid=1019 LCM即各数各质因数的最大值,搞个map乱弄一下就可以了. #include<bits/stdc++ ...
- C#异步调用的应用实践浅谈
C#异步调用的应用实践最经公司工作需要调用一个外部的webservice,同时要将传出的数据进行保存,以自己以前的习惯,就打算逐步操作,失败啊,完全没考虑过用户体验效果,在同事指点下,意识到使用C#异 ...
- 洛谷P4884 多少个1?(BSGS)
传送门 模数好大……__int128好麻烦……而且BSGS第一次写有点写蒙了…… $11...1(N个1)\equiv k(mod m)$很难算,那么考虑转化一下 先把$11...1(N个1)$写成$ ...
- 33、JSONP跨域
跨域请求数据也是可以的,只不过Ajax这技术不行,而JSONP这种数据格式可以进行跨域.很多年前,浏览器是没有跨域限制的,可以正常跨域,浏览器为了安全和隐私限制了Ajax跨域 JSONP原理就是:将函 ...
- 11-1模拟赛 By cellur925
期望得分:70+100+60 实际得分:70+20+60 \(qwq\). T1:有一个 \(n\) × \(n\) 的 \(01\) 方格, 图图要从中选出一个面积最大的矩形区域, 要求这个矩形区域 ...
- android 通知(android 8.0可用)
final String CHANNEL_ID = "com.chao.channel.id"; final String CHANNEL_NAME = "com.c ...
- 2017 Multi-University Training Contest - Team 1 Balala Power!
Talented Mr.Tang has n strings consisting of only lower case characters. He wants to charge them wit ...
- 【aspnetcore】让aspnetcore支持less文件
第一步:新建文件 CustomerFileExtensionContentTypeProvider namespace xxx { public class CustomerFileExtension ...
- ArrayList简单学习
类声明: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomA ...