代码的美妙

#include <bits/stdc++.h>
%:pragma GCC optimize(3)
using namespace std;
const int maxn=7e4+10;
int n,m;
int ans[maxn];
pair<int,int> tree[maxn]; struct Edge{
int from,to,nxt;
}e[maxn<<1]; inline int read(){
int x=0;bool fopt=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')fopt=0;
for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-48;
return fopt?x:-x;
} int head[maxn],cnt;
inline void add(int u,int v){
e[++cnt].from=u;
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
} namespace LinkCut{
int fa[maxn],dep[maxn],siz[maxn],son[maxn],dis[maxn];
void dfs1(int u){
dep[u]=dep[fa[u]]+1;siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
fa[v]=u;dfs1(v);
siz[u]+=siz[v];
if(!son[u]||siz[v]>siz[son[u]])son[u]=v;
}
} int top[maxn];
void dfs2(int u,int t){
top[u]=t;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
dfs2(v,v==son[u]?t:v);
}
} inline int lca(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
} inline int getdis(int u,int v){
int lcam=lca(u,v);
return dep[u]+dep[v]-(dep[lcam]<<1);
}
} using namespace LinkCut; namespace DSU{
int f[maxn],size[maxn]; int t=0;
struct Node{
int x,y,v;
pair<int,int> p;
}sta[maxn]; inline void Init(){
for(int i=1;i<=n;i++)
f[i]=i;
} int Find(int x){
return x==f[x]?x:Find(f[x]);
} inline void del(int x){
while(x<t){
Node u=sta[t--];
size[u.x]-=u.v;
f[u.y]=u.y;
tree[u.x]=u.p;
}
}
} using namespace DSU; namespace SEG{
#define lson (rt<<1)
#define rson (rt<<1|1)
vector<pair<int,int> > pos[maxn<<2]; inline pair<int,int> pushup(pair<int,int> A,pair<int,int> B,int &flag){
int p[4]={A.first,A.second,B.first,B.second};
int Max=-1;pair<int,int> res;
for(int i=0;i<4;i++)
for(int j=i+1;j<4;j++){
int w=getdis(p[i],p[j]);
if(w>Max){
Max=w;res=make_pair(p[i],p[j]);
}
}
flag=max(Max,flag);
return res;
} inline void build(){
for(int i=1;i<=n;i++)
tree[i]=make_pair(i,i);
} void modify(int rt,int l,int r,int s,int t,int u,int v){
if(r<s||t<l)return;
if(s<=l&&r<=t)return pos[rt].push_back(make_pair(u,v)),void();
int mid=(l+r)>>1;
modify(lson,l,mid,s,t,u,v);
modify(rson,mid+1,r,s,t,u,v);
} inline void Merge(int x,int y,int &res){
x=Find(x);y=Find(y);
pair<int,int> temp=pushup(tree[x],tree[y],res);
if(size[x]<size[y])swap(x,y);
sta[++t]=(Node){x,y,0,tree[x]};
if(size[x]==size[y]){
size[x]++;sta[t].v=1;
}
f[y]=x;tree[x]=temp;
} void Solve(int rt,int l,int r,int res){
int now=t;
for(int i=0;i<pos[rt].size();i++)
Merge(pos[rt][i].first,pos[rt][i].second,res);
if(l==r){
ans[l]=res;del(now);return;
}
int mid=(l+r)>>1;
Solve(lson,l,mid,res);
Solve(rson,mid+1,r,res);
del(now);
}
#undef lson
#undef rson
} using namespace SEG; int main(){
#ifndef LOCAL
freopen("ds.in","r",stdin);
freopen("ds.out","w",stdout);
#endif
n=read();m=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),l=read(),r=read();
add(u,v);add(v,u);
modify(1,1,n,l,r,u,v);
}
dfs1(1);dfs2(1,1);
Init();build();
Solve(1,1,n,0);
while(m--){
int q=read();
printf("%d\n",ans[q]);
}
return 0;
}

【线段树分治】Dash Speed的更多相关文章

  1. 联赛模拟测试8 Dash Speed 线段树分治

    题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ...

  2. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...

  3. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  4. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  5. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  6. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  7. BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)

    Description Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connec ...

  8. 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)

    Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...

  9. 【Luogu3733】[HAOI2017]八纵八横(线性基,线段树分治)

    [Luogu3733][HAOI2017]八纵八横(线性基,线段树分治) 题面 洛谷 题解 看到求异或最大值显然就是线性基了,所以只需要把所有环给找出来丢进线性基里就行了. 然后线性基不资磁撤销?线段 ...

  10. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

随机推荐

  1. 图解冒泡排序及算法优化(Java实现)

    冒牌排序 基本思想 定义:冒泡排序的英文是bubblesort,它是一种基础的交换排序 原理:每次比较两个相邻的元素,将较大的元素交换至右端 (升序排序) 思路:相邻的元素两两比较,当一个元素大于右侧 ...

  2. GaussDB(DWS)应用实战:对被视图引用的表进行DDL操作

    摘要:GaussDB(DWS)是从Postgres演进过来的,像Postgres一样,如果表被视图引用的话,特定场景下,部分DDL操作是不能直接执行的. 背景说明 GaussDB(DWS)是从Post ...

  3. linux基础一(目录结构)

    一.linux目录结构 1.根目录/下 bin:用户二进制文件,常用命令都在此目录下 sbin;这个目录下的linux命令通常由系统管理员使用 etc:包含所有程序所需的配置文件,以及服务的启动文件 ...

  4. Oracle数据库之表与表数据操作

    一.SQL语言 SQL语言分为四种,分别是:数据定义语言(DDL).数据操纵语言(DCL).事务控制语言(TCL).数据控制语言(DML). 1.1 数据定义语言(DDL) 建立.修改.删除数据库对象 ...

  5. xss中shellcode的调用

    shellcode就是利用漏洞所执行的代码 在完整的xss攻击之中,会将shellcode存放在一定的地方,然后触发漏洞,引发shellcode. 1.远程调用执行js 可将js代码单独放在一个js文 ...

  6. spring mvc(5) HandlerAdapter

    前面我们讲到了通过HandlerMapping可以获得不同类型的处理器,可以是Controller.HttpRequestHandler.Servlet.HandlerMethod甚至是我们自定义的处 ...

  7. vue中父子组件传值问题 通过props 和 $emit()方法

    (代码在最后) 1.父组件给子组件传值直接通过props,听着很简单,但是对于初学者来说还是比较难以理解的,今天小白通过自己的实践操作结合代码分析一下 案例  把模态框单独的抽离出来,当作一个组件 第 ...

  8. 【大数据】深入源码解析Map Reduce的架构

    这几天学习了MapReduce,我参照资料,自己又画了两张MapReduce的架构图. 这里我根据架构图以及对应的源码,来解释一次分布式MapReduce的计算到底是怎么工作的. ​话不多说,开始! ...

  9. 最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)

    1. 前言 前面两篇文章聊到了 Python 处理 Mysql.Sqlite 数据库常用方式,本篇文章继续说另外一种比较常用的数据存储方式:Redis Redis:Remote Dictionary ...

  10. Java随谈(三)如何创建好一个对象?

    本文推荐阅读时间30分钟 大家都知道,在编写Java程序里,一般就是处理各种各样的对象,那么,你知道一共有多少种创建对象的方式吗? 希望大家能稍微思考一下再往下翻. 答案是4种 new 一个对象 反射 ...