【bzoj4154】[Ipsc2015]Generating Synergy KD-tree
题目描述
输入
输出
样例输入
1
4 3 7
1 2 2
3 0 0
2 1 3
3 0 0
1 0 2
2 0 0
4 1 1
4 0 0
样例输出
32
题解
KD-tree
“子树内”是dfs序限制,“距离不超过l”是深度限制。对满足两种限制的点的修改,可以将其看作平面上的点,修改相当于矩形修改,使用lazy标记+pushdown即可。
时间复杂度$O(n\sqrt n)$
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
int head[N] , to[N] , next[N] , cnt , deep[N] , pos[N] , last[N] , tot , d , root;
struct data
{
int p[2] , mx[2] , mn[2] , c[2] , w , tag;
bool operator<(const data &a)const {return p[d] == a.p[d] ? p[d ^ 1] < a.p[d ^ 1] : p[d] < a.p[d];}
}a[N];
inline void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x)
{
int i;
pos[x] = ++tot , a[x].p[0] = pos[x] , a[x].p[1] = deep[x];
for(i = head[x] ; i ; i = next[i])
deep[to[i]] = deep[x] + 1 , dfs(to[i]);
last[x] = tot;
}
inline void pushup(int x)
{
int l = a[x].c[0] , r = a[x].c[1];
a[x].mx[0] = max(a[x].p[0] , max(a[l].mx[0] , a[r].mx[0]));
a[x].mx[1] = max(a[x].p[1] , max(a[l].mx[1] , a[r].mx[1]));
a[x].mn[0] = min(a[x].p[0] , min(a[l].mn[0] , a[r].mn[0]));
a[x].mn[1] = min(a[x].p[1] , min(a[l].mn[1] , a[r].mn[1]));
}
int build(int l , int r , int now)
{
if(l > r) return 0;
int mid = (l + r) >> 1;
d = now , nth_element(a + l , a + mid , a + r + 1);
a[mid].w = 1 , a[mid].tag = 0;
a[mid].c[0] = build(l , mid - 1 , now ^ 1);
a[mid].c[1] = build(mid + 1 , r , now ^ 1);
pushup(mid);
return mid;
}
inline void pushdown(int x)
{
if(a[x].tag)
{
int l = a[x].c[0] , r = a[x].c[1];
a[l].w = a[l].tag = a[r].w = a[r].tag = a[x].tag;
a[x].tag = 0;
}
}
void update(int bx , int ex , int by , int ey , int v , int x)
{
if(!x || a[x].mx[0] < bx || a[x].mn[0] > ex || a[x].mx[1] < by || a[x].mn[1] > ey) return;
if(a[x].mn[0] >= bx && a[x].mx[0] <= ex && a[x].mn[1] >= by && a[x].mx[1] <= ey)
{
a[x].w = a[x].tag = v;
return;
}
pushdown(x);
if(a[x].p[0] >= bx && a[x].p[0] <= ex && a[x].p[1] >= by && a[x].p[1] <= ey) a[x].w = v;
update(bx , ex , by , ey , v , a[x].c[0]) , update(bx , ex , by , ey , v , a[x].c[1]);
}
int query(int px , int py , int x)
{
d ^= 1;
if(a[x].p[0] == px && a[x].p[1] == py) return a[x].w;
pushdown(x);
if(d)
{
if(py < a[x].p[1] || (py == a[x].p[1] && px < a[x].p[0])) return query(px , py , a[x].c[0]);
else return query(px , py , a[x].c[1]);
}
else
{
if(px < a[x].p[0] || (px == a[x].p[0] && py < a[x].p[1])) return query(px , py , a[x].c[0]);
else return query(px , py , a[x].c[1]);
}
}
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
memset(head , 0 , sizeof(head)) , cnt = 1;
a[0].mx[0] = a[0].mx[1] = -1 << 30 , a[0].mn[0] = a[0].mn[1] = 1 << 30;
int n , m , i , x , y , z , ans = 0;
scanf("%d%*d%d" , &n , &m);
for(i = 2 ; i <= n ; i ++ ) scanf("%d" , &x) , add(x , i);
dfs(1);
root = build(1 , n , 0);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d" , &x , &y , &z);
if(z) update(pos[x] , last[x] , deep[x] , deep[x] + y , z , root);
else d = 1 , ans = (ans + (long long)query(pos[x] , deep[x] , root) * i) % 1000000007;
}
printf("%d\n" , ans);
}
return 0;
}
【bzoj4154】[Ipsc2015]Generating Synergy KD-tree的更多相关文章
- 【BZOJ4154】[Ipsc2015]Generating Synergy KDtree
[BZOJ4154][Ipsc2015]Generating Synergy Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问 ...
- BZOJ4154:[Ipsc2015]Generating Synergy(K-D Tree)
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一行三 ...
- BZOJ4154:[IPSC2015]Generating Synergy
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- 【bzoj 4154】[Ipsc2015]Generating Synergy
题目 大概已经掌握熟练码出\(kdt\)的技能了 发现距离子树根节点\(x\)不超过\(l\)的点可以用两种方式来限制,首先\(dfs\)序在\([dfn_x,dfn_x+sum_x)\)中,深度自然 ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
- 【BZOJ2843】极地旅行社(Link-Cut Tree)
[BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include< ...
- 【BZOJ4530】大融合(Link-Cut Tree)
[BZOJ4530]大融合(Link-Cut Tree) 题面 讨厌权限题!!! Loj链接 题目描述 小强要在 N个孤立的星球上建立起一套通信系统.这套通信系统就是连接 N个点的一个树.这个树的边是 ...
- 【BZOJ1969】航线规划(Link-Cut Tree)
[BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...
- 【BZOJ4825】【HNOI2017】单旋(Link-Cut Tree)
[BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有 ...
随机推荐
- 通过ABAP程序创建透明表
最近在解决用户账号问题的时候,需要通过ABAP程序创建透明表,查询了相关资料,总结如下. 通过ABAP程序创建透明表,主要利用了4个函数: DDIF_TABL_ACTIVATE: 激活透明表 GOX_ ...
- Maven - 配置镜像仓库
默认仓库的配置(全球中央仓库): 可以打开maven的安装目录/conf/settings.xml文件,配置镜像,找到如下一段配置,这里默认没有配置任何镜像,但是有一个被注释的配置范例: id: 镜像 ...
- PHP siege 压测 QPS大小
1.使用 PHP-FPM SOCKET的形式通讯 2.配置 PHP-FPM配置 [root@bogon php-fpm.d]# ls -al 总用量 drwxr-xr-x. root root 8月 ...
- JZOJ 5913. 林下风气
Description 里口福因有林下风气,带领全国各地高校掀起了一股AK风,大家都十分痴迷于AK.里口福为了打击大家的自信心,出了一道自以为十分困难的题目.里口福有一棵树,第i个节点上有点权ai,他 ...
- [洛谷1156]垃圾陷阱(DP)
[Luogu1156] f[i]表示高度为i时的存活时间 Code #include <cstdio> #include <algorithm> #define N 110 u ...
- Apache服务配置
Apache 1.安装Apache服务 第1步:把光盘设备中的系统镜像挂载到/media/cdrom目录. [root@zhangjh ~]# mkdir -p /media/cdrom/ [root ...
- Android 网络通用类 NetUtil
1.整体分析 1.1.源代码如下,可以直接Copy. public class NetUtil { /** * 用户是否连接网络 * * @param context Context */ publi ...
- 9.5web service基础知识
Web服务基础 用户访问网站的基本流程 我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等. 当我们输入www.oldboyedu.com/时候,很快就能看到 ...
- LayoutInflater.Factory 妙用
LayoutInflater.Factory 可以调试 布局,你把下面的代码放到 onCreate里面,然后再里面的下面的onCreateView里面加上断点,然后你就可以知道所有的view构造,所有 ...
- FIFO页面淘汰算法
1.优异虚拟存储系统,若进程在内存中占3页(开始时内存为空),若采用先进先出(FIFO)页面淘汰算法,当执行以下访问页号序列后1,3,4,2,1,3,5,1,2,5,4,2,会产生多少次缺页(9) 在 ...