Qtree系列第三题

我是题面

读完题大概不难判断是一道树剖的题

这道题的关键是记录两种状态,以及黑点的序号(不是编号)

线段树啊当然

定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表示区间内是否含有黑点,有为1,无为0

那么,怎么才能取当前路径距离根节点最近的黑点的呢?线段树更新时,优先取左子区间的黑点,后取右子区间,更新答案时,优先取后出现的答案

那么直接看程序吧

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc() getchar()
#define maxn 100005
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}
void write(ll a){
if(a>9)write(a/10);
putchar(a%10+'0');
}
int n,m; struct ahaha1{ //前向星存边
int to,next;
}e[maxn<<1];int head[maxn],tot;
inline void add(int u,int v){
e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
} int sz[maxn],dep[maxn],f[maxn],son[maxn];
void dfs(int u,int fa){
sz[u]=1;int maxa=0;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
f[v]=u;dep[v]=dep[u]+1;
dfs(v,u);sz[u]+=sz[v];
if(maxa<sz[v]){maxa=sz[v];son[u]=v;}
}
}
int top[maxn],in[maxn],b[maxn];
void dfs(int u,int fa,int topf){
in[u]=++tot;top[u]=topf;b[tot]=u;
if(!son[u])return;
dfs(son[u],u,topf);
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa||v==son[u])continue;
dfs(v,u,v);
}
} #define lc p<<1
#define rc p<<1|1
struct ahaha2{
int v;bool f;
ahaha2(){v=-1;} //v的初始值为-1
}t[maxn<<2];
inline void pushup(int p){
t[p].f=t[lc].f|t[rc].f; //若左右子区间中含有黑点,则当前区间含有黑点
t[p].v=t[lc].f?t[lc].v:(t[rc].f?t[rc].v:-1); //优先取左子区间的黑点,使距离根节点尽可能近
}
void update(int p,int l,int r,int L){
if(l==r){t[p].f^=1;t[p].v=t[p].f?b[l]:-1;return;} //若改变后为黑点,则赋值为节点序号,否则重置
int m=l+r>>1;
if(L<=m)update(lc,l,m,L);
else update(rc,m+1,r,L);
pushup(p);
}
int query(int p,int l,int r,int L,int R){
if(l>R||r<L)return -1;
if(L<=l&&r<=R)return t[p].v;
int m=l+r>>1,l1=query(lc,l,m,L,R),r1=query(rc,m+1,r,L,R); //优先取左子区间
return l1==-1?r1:l1;
} inline void solve_1(){
int x=read();
update(1,1,n,in[x]);
}
inline void solve_2(){
int x=read(),ans=-1,p; //ans优先取后出现的的答案
while(top[x]!=1){
p=query(1,1,n,in[top[x]],in[x]);
ans=(p==-1?ans:p);
x=f[top[x]];
}
p=query(1,1,n,1,in[x]);
ans=(p==-1?ans:p);
if(ans<0)putchar('-'),ans=-ans;
write(ans);putchar('\n');
} int main(){memset(head,-1,sizeof head);
n=read();m=read();
for(int i=1;i<n;++i){
int x=read(),y=read();
add(x,y);add(y,x);
}
tot=0;dfs(1,-1);dfs(1,-1,1);
for(int i=1;i<=m;++i){
int z=read();
switch(z){
case 0:solve_1();break;
case 1:solve_2();break;
}
}
return 0;
}

洛谷 P4116 Qtree3的更多相关文章

  1. 洛谷P4116 Qtree3

    题目描述 给出\(N\)个点的一棵树(\(N-1\)条边),节点有白有黑,初始全为白 有两种操作: \(0\) \(i\) : 改变某点的颜色(原来是黑的变白,原来是白的变黑) \(1\) \(v\) ...

  2. 洛谷P4116 Qtree3(树剖+线段树)

    传送门 LCT秒天秒地 树剖比较裸的题了 用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近) 然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅 / ...

  3. 【洛谷 P4116】 Qtree3 (树链剖分)

    题目链接 树剖练手题,想复习下树剖. 第一次提交\(T\)成QQC 看我 ??? 看了数据范围的确挺恶心的,我的复杂度是\(O(Mlog^2N)\)的,数据范围有三段 For 1/3 of the t ...

  4. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  5. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  6. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  7. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  8. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  9. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

随机推荐

  1. tkinter界面卡死的解决办法

    0.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, i): time.sleep(3) t ...

  2. DSP5509的USB协议开发

    1. 使用的板子 2. 原理图相关,这个1.5K的上拉电阻,全速和高速上拉在D+,低速上拉在D- 3. 中断处理函数没有搞明白是什么意思?这个工程我怎么基本看不懂? interrupt void US ...

  3. 洛谷P2464 [SDOJ2008]郁闷的小J

    洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...

  4. 八、Django之Models(译)

    模型(Models) 模型是你的数据的唯一的.确定的信息源. 它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是一个Python类,它们都是djang ...

  5. 学习HTML 第三节.接近正题:HTML样式-CSS级联样式表

    CSS (Cascading Style Sheets)级联样式表 内联样式 内联样式- 在HTML元素中使用"style" 属性 使用内联样式的方法是在相关的标签中使用样式属性. ...

  6. 搭建RTSP服务器时nginx的nginx.conf文件配置

    worker_processes 1; events { worker_connections 1024;} http { include mime.types; default_type appli ...

  7. 换Mac了,迈入了终端的大门

    多终端其实本质和多线程一样,所有终端其实都共享着同一个内存只不过不同终端对共享内存不同部分的权限不同罢了所以对终端的数量必须要有限制 我这里开启了四个线程,很明显四个线程都在跑同一个内存而且四个线程都 ...

  8. dede 后台登录以后一片空白

    网上说的是 找到:include/common.inc.php文件,打开,查找程序代码: //error_reporting(E_ALL);  error_reporting(E_ALL || ~E_ ...

  9. Nginx连载

    一. nginx变量(用户变量.内建变量) 用户变量 又称用户自定义变量 Nginx用户变量的可见范围是整个配置文件,甚至可以跨越不通虚拟主机的server配置,但是变量适用范围是不可以跨越自己的容器 ...

  10. 2017年软件工程第八次作业-每周PSP例行报告

    1.PSP表格 2.进度条 3.博文字数累积折线图 4.代码行数累积折线图 5.PSP饼图