NEERC 17 L Laminar Family (树链剖分)

Codeforces Gym 101630L Laminar Family 树链剖分 Problem L. Laminar Family Input file: standard input Output file: standard output Time limit: 3 seconds Memory limit: 512 mebibytes While studying combinatorial optimization, Lucas came across th... 阅读详情

题意:

     给你一颗树,每次选取一个路径,把路径上的所有点加入到一个集合里面,问最后的集合是否两两之间满足 A∈BA∈B或者B∈AB∈A或者A∪B=∅A∪B=∅

思路:

    我们发现,如果最后是符合条件的,那么必定是一个集合被另一个集合套的这样的形式,也就是说一个集合是完全套在另一个集合上面的。这个很明显可以利用线段树维护,那么我们开始把所有集合按集合大小从大到小排序,然后一个一个放进去染色,如果是符合条件的,那么每个我们扔进去的颜色段之前的位置必定只有一种颜色(多种就不符合了)。
    那么现在只剩下一个问题了,如何把树上的一段区间变成数组上的一段区间,这很明显就是树剖的事情了

错误及反思:

    开始的时候可以把线段树当作都被0染了一次,这样以后操作也非常方便

代码:

#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N =100010;

int segtree[N*4],lazy[N*4];
struct EDGE{
    int to,next;
}e[N*2];
int tot,tid,n,q;

struct ques{
    int len,l,r;
};
vector<ques> v;
bool cmp(ques a,ques b){
    return a.len>b.len;
}

bool judge=true;
int top[N],si[N],fa[N],first[N],son[N],depth[N],id[N],num,bef;

void addedge(int x,int y){
    e[tot].to=y;
    e[tot].next=first[x];
    first[x]=tot++;
    e[tot].to=x;
    e[tot].next=first[y];
    first[y]=tot++;
}

void dfs1(int now,int bef,int dep){
    fa[now]=bef;
    depth[now]=dep;
    si[now]=1;
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=bef){
            dfs1(e[i].to,now,dep+1);
            si[now]+=si[e[i].to];
            if(son[now]==-1) son[now]=e[i].to;
            else son[now]=si[e[i].to]>si[son[now]]?e[i].to:son[now];
        }
}

void dfs2(int now,int tp){
    top[now]=tp;
    id[now]=tid++;
    if(son[now]!=-1) dfs2(son[now],tp);
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa[now]&&e[i].to!=son[now])
            dfs2(e[i].to,e[i].to);
}

void init(){
    memset(segtree,0,sizeof(segtree));
    memset(lazy,0,sizeof(lazy));
    tot=0; tid=1;
    memset(first,-1,sizeof(first));
    memset(son,-1,sizeof(son));
}

int getlen(int L,int R){
    int dep=depth[L]+depth[R];
    int f1=top[L],f2=top[R];
    while(f1!=f2){
        if(depth[f1]<depth[f2]){
            swap(f1,f2);
            swap(L,R);
        }
        L=fa[f1];
        f1=top[L];
    }
    if(depth[L]>depth[R]) swap(L,R);
    return dep-depth[L]-depth[L]+1;
}

void pushdown(int l,int r,int rt){
    if(lazy[rt]){
        segtree[rt<<1]=segtree[rt<<1|1]=lazy[rt];
        lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
        lazy[rt]=0;
    }
}

void pushup(int l,int r,int rt){
    if(segtree[rt<<1]==segtree[rt<<1|1]) segtree[rt]=segtree[rt<<1];
   // else if(segtree[rt<<1]==0||segtree[rt<<1|1]==0) segtree[rt]=segtree[rt<<1]?segtree[rt<<1]:segtree[rt<<1|1];
    else segtree[rt]=-1;
}

void color(int L,int R,int col,int l,int r,int rt){
    if(L<=l&&R>=r){
        if(segtree[rt]==-1){
            judge=false;
        }
        else{
            if(segtree[rt]!=bef){
                num++;
                bef=segtree[rt];
            }
            lazy[rt]=col;
            segtree[rt]=col;
        }
        return ;
    }
    pushdown(l,r,rt);
    int m=l+r>>1;
    if(L<=m) color(L,R,col,lson);
    if(R>m) color(L,R,col,rson);
    pushup(l,r,rt);
    return ;
}

void modify(int L,int R,int col){
    num=0,bef=-1;
    int f1=top[L],f2=top[R];
    while(f1!=f2){
        if(depth[f1]<depth[f2]){
            swap(f1,f2);
            swap(L,R);
        }
        color(id[f1],id[L],col,1,tid-1,1);
        L=fa[f1];
        f1=top[L];
    }
    if(depth[L]>depth[R]) swap(L,R);
    color(id[L],id[R],col,1,tid-1,1);
    if(num>1) judge=false;
    return ;
}

int main(){
    init();
    scanf("%d%d",&n,&q);
    for(int i=0,u,v;i<n-1;i++){
        scanf("%d%d",&u,&v);
        addedge(u,v);
    }
    dfs1(1,1,1);
    dfs2(1,1);
    for(int i=0,l,r;i<q;i++){
        scanf("%d%d",&l,&r);
        v.push_back({getlen(l,r),l,r});
    }
    sort(v.begin(),v.end(),cmp);
    for(int i=0;i<v.size();i++)
        modify(v[i].l,v[i].r,i+1);
    if(judge) printf("Yes\n");
    else printf("No\n");
}
网络流题目合集 属实狠活 HDU 2883 kebab还是区间k重覆盖的变形,然而每想到 就这? HDU 3315 My Brute HDU 3947 River Problem 区间k重覆盖的变形 拉了 阅读详情

相关推荐

从真题到策略:浙江工业大学计算机转专业机试全解析与备考指南

本文全面解析浙江工业大学计算机转专业机试的考试概况、典型真题和高频考点,提供详细的备考策略和面试准备建议。从机试题目类型到解题技巧,帮助考生高效备考,顺利通过这一竞争激烈的转专业关卡。

weixin_42524824的博客 421

gym 101630 L - Laminar Family(树上区间染色 + 树链剖分)

题目大意:有一棵 nnn 个结点的树,有 fff 条简单路径,判断这 fff 条路径任意两条是否满足: 1.两条路径不相交 2.其中一条包含另外一条 先预处理每条路径的长度,按它们的长度从大到小排序,这样处理的作用是当前枚举的路径不会包含其它路径,如果路径所在区间有其它路径,那么必然是被包含在其它路径内或者相交。 对路径区间进行染色,对每一条路径判断区间内是否只有一种颜色:即max==minma...

qq_41997978的博客 328

多电平双向DC/DC直流变换器的工作原理(以三电平为例子)

多电平双向DCDC变换器的工作原理一、所用论文和参考文献1.1 主要是中文的文献二、工作原理和重要概念2.1 飞跨电容的作用2.2 三电平的工作原理1.3 多电平的优点二,一些注意点2.1 电感电流的变化2.2 多飞跨电容 多余三个电平的时候的解释(截图居多) 一、所用论文和参考文献 1.1 主要是中文的文献 用于超级电容储能系统的三电平双向直流变换器及其控制 (期刊) 多电平直流变换器及其控制...

qq_32419593的博客 2万+

NEERC2017 Laminar Family 树链剖分+LCA

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 给出一棵树和一组操作,操作的格式是给出u、vu、vu、v两个节点,并将该节点所确定的路径上的节点全部加入到一个新...

SUNSET 831

【学习路线】 游戏客户端开发入门到进阶

游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。

hhw_hhw的博客 2130

OpenAI Codex 桌面端国内使用全坑解決指南(2026 Windows 实测)

本地文件报错:SQLite 初始化失败、启动闪退、卡加载页 → 本地缓存/数据库损坏,和网络无关网络地区报错→ 网络IP/地区被拦截,和本地软件文件无关Codex 桌面端的大部分报错,都不是软件故障,而是海外软件适配国内网络、国内模型协议不兼容导致的适配问题。不用盲目重装、换网络、改系统设置,只要区分「本地文件问题」和「网络地区问题」,搭配国内大模型 API 替代方案,就能完美解决所有痛点。(注:部分内容可能由 AI 生成)

ups_hxc的博客 1126

Laminar Family Gym - 101630L

http://codeforces.com/gym/101630/attachments 按链长度降序排序 一条条的向树上着色 每次着色之前先看当前链上是不是同一种颜色 线段树维护一下 是的话就更新 不是一种颜色 那就说明有冲突   #include &lt;bits/stdc++.h&gt; using namespace std; typedef pair&lt;int,int&gt;...

sunyutian1998的博客 297

SimMechanics二连杆仿真避坑指南:Solid模块坐标系设置与Rigid Transform常见错误

本文详细解析了SimMechanics中二连杆平面臂仿真的常见问题,重点探讨Solid模块坐标系设置与Rigid Transform模块的配置陷阱。通过实战案例和MATLAB代码示例,揭示多体系统仿真中的关键错误点,包括坐标系方向定义、参数匹配、端口连接规则等,帮助工程师有效规避仿真风险,提升建模效率。

weixin_29309213的博客 413

NEERC2017:L - Laminar Family

传送门 很容易想到,离线按路径长度从大到小排个序,用树链剖分加颗支持区间cover的线段树就好了 代码: #include<cstdio> #include<iostream> #include<algorithm> using namespace std; void read(int &x){ char ch; bool ok; for...

weixin_30485799的博客 304

别再手动抓波形了!用Synopsys AXI VIP的Port Monitor自动收集事务数据(附完整连接Scoreboard代码)

当标准Port Monitor无法满足需求时,Synopsys提供的callback机制就像一套精密的手术工具,允许你深入VIP内部进行定制化改造。创建自定义监控点的四步法继承基类// 其他自定义字段...endclass重写目标phase方法// 克隆事务并发送到自定义端口在env中注册callbackcustom_cb);连接自定义端口到分析组件经典应用场景地址phase特定检查数据beat级监控自定义性能统计异常注入检测。

weixin_28716181的博客 397

Gym - 101630L Laminar Family (树链剖分维护区间出现的段数)

  解题思路:先把每个查询的距离从大到小排序,然后我们再枚举查询,这样就不用考虑包含的情况了,因为小的肯定可以被大的包含,因此我们就只用考虑相交的情况了,关于相交,我们用区间染色的思想,然后查询区间出现的颜色个数即可,我这里用的是区间查询颜色段数。 #include&lt;iostream&gt; #include&lt;deque&gt; #include&lt;memory.h&gt...

LP_Cong 761

13. MIC配置

恒玄BES2700,支持3个MIC。

雪飞_海 927

gym101630 Laminar Family

https://codeforces.com/gym/101630/attachments 一开始写了个假算法没了。。。然后发现假了以后没写完。 先按照路径长度排序,路径长的先染色。 问题的关键是每段区间染色前,这段区间必须只有一种颜色。 我们可以对线段树每一段区间维护一个左端点颜色,右端点颜色和颜色段数。 对于树链剖分,我们先把路径对应的区间全部存在vector里,然后按照线段树中的节...

binarycopycode 244

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Gym101630L Laminar Family

题目链接:https://cn.vjudge.net/problem/Gym-101630L 题目大意:   对于一个集合的集合,若其中任意两个集合 \(A\) 和 \(B\) 都满足下述三个条件之一:\(A \subset B\) 或 \(B \subset A\) 或 \(A \cap B = \varnothing\),则称这个集合 \(laminar\).   给定一棵有 ...

dielie6462的博客 401

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2017 NEERC A Archery Tournamen(离散化+分块)

题目链接:http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意: 两种操作,一种是增加一个圆心为(x,y),半径为y的圆; 另一种是打出一颗击中(x,y)的子弹并要求输出打中的圆的是...

qq_38515845的博客 279

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NEERC 17 H. Palindromic Cut 暴力(回文)

Problem H 题意:给出n个字符.问把n个字符分成k个字符串 要求:这k个字符串的长度都相同,这k个字符串都为回文. n k组字符串 每组中最多只能有一个出现奇数次的字符. 如何输出方案:先把g个奇数字符仍到每组中间,剩下的2个相同的一对,有c对 如果能平均分给每组 即c为g的倍数 则退出.否则拆掉一个偶数 增加组数后继续判定.O(127*|S|) #include us

noone0的博客 510

2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A

传送门 训练时候没有考虑到这样一个性质,得到栗子大佬的点拨才看出来:打到的圆一定是左边或右边第一个直径高出射击高度的圆。 如上图,如果点A不落在圆C内却落在圆D内,显然线段AB在圆D内且线段AB与圆C相交,则圆D与圆C相交,不符合题意描述。 再用线段树维护一下即可。#include <bits/stdc++.h> using namespace std; const int maxn=20

ACM, deep love 900

2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17)

2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A 题意:有 n 个时刻,第 i 个时刻要么会在 (xi,yi) 生成一个半径为 yi 的圆,要么射击 (xi,yi) 这个点,如果该点在某个圆内则把对应圆删除并输出该圆的标号,否则输出 -1 。任意时刻圆之间不会相交(可以...

weixin_30675967的博客 267

NEERC 2017

E:Equal numbers题目大意 :n个数,选择0-n个数乘任意的倍数,使得n个数中不同的数的个数最少。题解:对于一个数只有两种操作。1. 把它变成所有数的倍数。 2. 把它变成原数列中存在的一个数。并且对于给定的操作数,只能选择一种操作进行多次操作。所以预处理每个数是否在原数列中存在它的倍数。然后每次比较这两个操作谁更优,就是答案。#include &lt;bits/stdc++.h&gt...

NGWZ的博客 635

2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17)题解+补题

文章目录C - ConnectionsD - Designing the ToyA - Archery TournamentL. Laminar Family总结 C - Connections 题目链接 思维 题意:给你一张能到达任意点的图,m>2∗n,m<100000m>2*n, m<100000m>2∗n,m<100000,删掉m−2∗nm-2*nm−2∗n条路使这张图仍然能到达任意点 本来就考虑这张图找一个环,后来发现会有很多环。题目留下2∗n2*n2∗n..

quinn18的博客 1246

NEERC 17 Problem I. Interactive Sort

NEERC 17 Problem I. Interactive Sort Solution 当写了两倍正解的代码使用了两倍于正解的操作步数…… 刚开始的想法是求出一个bbb,再求出一个aaa,依次轮换,分别维护当前知道确定值的a,ba,ba,b的有序序列,然后求aaa就在bbb的有序序列里二分,确定大致范围,再暴力求出当前数的大小并更新bbb中每个数的上下界,求bbb同理。 这样操作次数应该是O(nlgn)O(nlgn)O(nlgn)的,然而常数太大了……,需要接近40W40W40W次操作。 而正解则是上一

xmr_pursue_dreams的博客 267

NEERC 17 I Interactive Sort (交互题)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;给出1到n这n个数的任意一个排列,然后奇数按顺序分到o数组,偶数按顺序分到e数组,你每次可以询问e数组中第i个和o数组中第j个的大小情况,查询结束后输出结果,查询次数最多30 000次,n≥1000n≥1000n\ge1000 思路: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;我...

Roll_Keyboard的博客 706

2017-2018 ACM-ICPC, NEERC解题报告

A. Union of Doubly Linked Lists   模拟链表的合并,注意收尾相接的问题,不少队都A了 B. Preparing for Merge Sort   动态规划,优化才能水过,否则会无情TLE C. Sum of Nestings   dfs递归搜索,字符串操作 D. Dog Show   贪心&&模拟 E. Packmen   二

Welcome to yjjr's blog! 3489

NEERC 17 G The Great Wall (treap)

题意: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 给你一个数列,每个点有abc三个值,现在让你画两个区间x,y,区间大小为r,区间不可以完全重合,当一个点没有被区间覆盖时值为a,被一个区间覆盖时值为b,两个区间为c,问第k小的数列数值总和为多少 思路: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp

Roll_Keyboard的博客 694

Codeforces 85D. Sum of Medians (线段树)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 三种操作,1.加入一个数,2,删除一个数,3,询问经过排序以后,所有下标mod5mod5mod5余3的数的和 思路: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 注意到,当我们加入一个数以后,会让所有后面的数后移一位,删除会使得后面全部前移一位,每次移动都使得下标变化1,所以我...

Roll_Keyboard的博客 652
上一篇: SPOJ FTOUR2 Free tour II (点分治+启发式合并)
下一篇: NEERC 17 I Interactive Sort (交互题)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值