题目描述

给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白

有两种操作:

0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑)

1 v : 询问1到v的路径上的第一个黑点,若无,输出-1

输入输出格式

输入格式:

第一行 N,Q,表示N个点和Q个操作

第二行到第N行N-1条无向边

再之后Q行,每行一个操作"0 i" 或者"1 v" (1 ≤ i, v ≤ N).

输出格式:

对每个1 v操作输出结果

输入输出样例

输入样例#1:

9 8
1 2
1 3
2 4
2 9
5 9
7 9
8 9
6 8
1 3
0 8
1 6
1 7
0 2
1 9
0 2
1 9
输出样例#1:

-1
8
-1
2
-1

说明

For 1/3 of the test cases, N=5000, Q=400000.

For 1/3 of the test cases, N=10000, Q=300000.

For 1/3 of the test cases, N=100000, Q=100000.

(假装我是在spoj上做的一样hhh)

贼裸的树剖+线段树,,,练手题(今天建模能力为0,全在码模板hhh)

#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
#define pb push_back
using namespace std;
vector<int> g[maxn];
int dfn[maxn],dy[maxn],pos;
int siz[maxn],f[maxn],opt;
int cl[maxn],n,m,son[maxn],dc=;
int sum[maxn<<|],mxp[maxn<<|];
int le,ri; void dfs1(int x,int fa){
f[x]=fa,siz[x]=;
int to;
for(int i=g[x].size()-;i>=;i--){
to=g[x][i];
if(to==fa) continue;
dfs1(to,x),siz[x]+=siz[to];
if(!son[x]||siz[to]>siz[son[x]]) son[x]=to;
}
} void dfs2(int x,int tp){
dfn[x]=++dc,dy[dc]=x,cl[x]=tp;
if(son[x]) dfs2(son[x],tp);
int to;
for(int i=g[x].size()-;i>=;i--){
to=g[x][i];
if(to==f[x]||to==son[x]) continue;
dfs2(to,to);
}
} void update(int o,int l,int r){
if(l==r){
sum[o]^=;
if(sum[o]) mxp[o]=dy[l];
else mxp[o]=;
return;
} int mid=l+r>>,lc=o<<,rc=(o<<)|;
if(le<=mid) update(lc,l,mid);
else update(rc,mid+,r);
if(sum[lc]) mxp[o]=mxp[lc];
else mxp[o]=mxp[rc];
sum[o]=sum[lc]+sum[rc];
} int query(int o,int l,int r){
if(l>=le&&r<=ri) return mxp[o];
int mid=l+r>>,lc=o<<,rc=(o<<)|,an=;
if(le<=mid) an=query(lc,l,mid);
if(!an&&ri>mid) an=query(rc,mid+,r);
return an;
} inline void tolt(int x){
le=dfn[x],update(,,n);
} inline int answer(int x){
int an=-,po;
while(x){
le=dfn[cl[x]],ri=dfn[x];
po=query(,,n);
if(po) an=po;
x=f[cl[x]];
}
return an;
} int main(){
int uu,vv;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
scanf("%d%d",&uu,&vv);
g[uu].pb(vv),g[vv].pb(uu);
} dfs1(,);
dfs2(,); while(m--){
scanf("%d%d",&opt,&pos);
if(opt) printf("%d\n",answer(pos));
else tolt(pos);
} return ;
}

Spoj Query on a tree III的更多相关文章

  1. SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)

    You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...

  2. SPOJ PT07J - Query on a tree III(划分树)

    PT07J - Query on a tree III #tree You are given a node-labeled rooted tree with n nodes. Define the ...

  3. SP1487 PT07J - Query on a tree III (主席树)

    SP1487 PT07J - Query on a tree III 题意翻译 你被给定一棵带点权的n个点的有根数,点从1到n编号. 定义查询 query(x,k): 寻找以x为根的k大点的编号(从小 ...

  4. 【BZOJ1803】Spoj1487 Query on a tree III 主席树+DFS序

    [BZOJ1803]Spoj1487 Query on a tree III Description You are given a node-labeled rooted tree with n n ...

  5. 「SPOJ1487」Query on a tree III

    「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ...

  6. SPOJ 1487 Query on a tree III(划分树)

    题目链接:http://www.spoj.com/problems/PT07J/ 题意:给出一个有根树,1为根节点,每个节点有权值.若干询问,询问以u为根的子树中权值第K小的节点编号. 思路:DFS一 ...

  7. [ SPOJ PT07J ] Query on a tree III

    \(\\\) Description 其实这题才是正版的 Qtree3...... 给定 \(n\) 个点,以 \(1\) 号节点为根的树,点有点权. \(m\) 次询问 以 \(x\) 为根的子树内 ...

  8. bzoj1803: Spoj1487 Query on a tree III

    Description You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the ...

  9. SPOJ Query on a tree 树链剖分 水题

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

随机推荐

  1. HttpClient测试类请求端和服务端即可能出现乱码的解决

    junit HttpClient 请求端 代码: package com.taotao.httpclient; import java.util.ArrayList; import java.util ...

  2. 1040: [ZJOI2008]骑士~基环外向树dp

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...

  3. mysql修改表中某个字段的默认值

    Mysql中用SQL增加.删除字段,修改字段名.字段类型.注释,调整字段顺序总结   在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改 ...

  4. 单个回调函数中返回多个Request以及Item

    import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'example.com' ...

  5. POST提交数据太大

    2018.4.8号更新 其实后来最终的解决方案是修改服务器的配置文件. POST数据按道理说是没有大小限制的,只是取决于浏览器或服务器的配置,tomcat的解决方式参考方案2. ----------- ...

  6. threadlocal作用

    理解:通过thread创建局部变量,每个线程可以获得该变量的副本,再每个线程中操作该副本相互之间不产生影响. 解决:数据库连接 常规一个线程连接一个数据库是没有问题的,但是在高并发的情况下,可能线程一 ...

  7. codevs 3305 水果姐逛水果街Ⅱ&&codevs3006

    题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...

  8. 关于k Line Chart (k线图)

    K Line Chart python实现k线图的代码,之前找过matplotlib中文文档但是画k线图的finance方法已经弃用了.所以自己在网上搜寻一下加上改编,很好的实现出k线图, 代码如下: ...

  9. java List排序 顺序 倒序 随机

    List list = new LinkedList(); for ( int i = 0 ; i < 9 ; i ++ ) { list.add( " a " + i); ...

  10. DDCTF - evil 一个伪装成docx的exe

    0x01 题目描述 题目比较简单,不过这种题感觉比单纯的逆向算法来有意思的多,所以记录一下~ 0x02 脱壳 先拖到IDA瞅一眼,发现加壳了 用PEID查一下是什么壳,但是没有查出来.使用String ...