Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 293  Solved: 144
[
Submit][Status][Discuss]

Description

给定一棵有n个节点的树,相邻两点之间的距离为1。

请找到一个点x,使其满足所有m条限制,其中第i条限制为dist(x,a[i])+dist(x,b[i])<=d[i]。

Input

第一行包含一个正整数t(1<=t<=1000),表示数据组数。

对于每组数据,第一行包含两个正整数n,m(2<=n,m<=300000),表示点数、限制数。

接下来n-1行,每行两个正整数x,y(1<=x,y<=n),表示树上的一条边。

接下来m行,每行三个正整数a[i],b[i],d[i](1<=a[i],b[i]<=n,1<=d[i]<=600000),描述一条限制。

输入数据保证所有n之和不超过300000,所有m之和也不超过300000。

Output

输出t行。第i行输出第i组数据的答案,如果无解输出NIE,否则输出TAK,

然后输出x,如有多组解,输出任意一组。

Sample Input

2
5 3
1 2
2 3
2 4
3 5
1 4 2
5 5 5
3 2 1
3 2
1 2
2 3
1 1 2
3 3 1

Sample Output

TAK 2
NIE

HINT

Source

鸣谢Claris上传

题解:

        ①首先呢要搞懂:(设1为根)

               满足第i个限制条件:dist(x,a[i])+dist(x,b[i])<=d[i] 的所有点中,

               离根节点最近的点的到达根的距离D是有一个公式的: 

                D=max(   0   ,   (dis(a[i],1) + dis(b[i],1) - d[i]) / 2    )

                [温馨提示:画个图走一波就可以懂]

        ②然后呢,根据上文结论呢,设 D 值 最大的点时 P。

               有一个更高级的结论:如果P都不能合法,那么没有什么点会合法了。

        ③插几句,怎么找到P点:

                      根据P点必须满足最苛刻的条件,可以从对应的a[i],b[i]为根遍历树得到dis[],

                      然后呢找到满足最苛刻条件,且到1最近的那个点就是我们D对应的P点了。

        ④我是这样理解这个结论的:

                      (1)P点的位置是由最苛刻的限制条件得出的(即离根最远)

                      (2)对于和它统一棵子树的限制条件,肯定他可以满足所有(因为他是最苛刻的)

                      (3)对于和它不在同一子树的限制条件,也必须想办法满足它才可以。

#include<cstdio>
#include<cstring>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define mem(a,b) memset(a,b,sizeof(a))
#define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
const int N=400010;
struct E{int v,next;}e[N<<1];
int T,n,m,i,x,y,t,ed,a[N],b[N],d[N],D[3][N],k,head[N];
void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
void dfs(int u,int fa,int z,int p)
{
D[p][x]=z++;
fo(i,head,u)if(v!=fa)dfs(v,u,z,p);
}
int main()
{
scanf("%d",&T);
while(T--&&scanf("%d%d",&n,&m))
{
go(i,1,n)head[i]=0;k=1;
go(i,2,n){int u,v;scanf("%d%d",&u,&v),ADD(u,v),ADD(v,u);}
go(i,1,m)scanf("%d%d%d",a+i,b+i,d+i);
dfs(1,0,0,0);x=0;
go(i,1,m)
{
t=D[0][a[i]]+D[0][b[i]]-d[i];
if(!x||t>y)x=i,y=t;
}
dfs(a[x],0,0,1),dfs(b[x],0,0,2);t=0;
go(i,1,n)if(D[1][i]+D[2][i]<=d[x])if(!t||D[0][i]<y)t=i,y=D[0][i];
if(!t){puts("NIE");continue;}dfs(t,0,0,0);
go(i,1,m)if(D[0][a[i]]+D[0][b[i]]>d[i]){t=0;break;}
if(t)printf("TAK %d\n",t);else puts("NIE");
}
return 0;
}//Paul_Guderian

外面下起了小雨,雨滴轻飘飘得像我的年轻岁月,

我脸上蒙着雨水就像蒙着幸福……——————————汪峰《青春》

【BZOJ 4151 The Cave】的更多相关文章

  1. 【Bzoj 1835 基站选址】

    基站选址的区间里隐藏着DP优化的机密…… 分析:       不论是做过乘积最大还是石子合并,或者是其他的入门级别的区间DP题目的人呐,大米并认为读题后就能够轻松得出一个简洁明了的Dp转移方程.    ...

  2. 【BZOJ 2744 朋友圈】

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1570  Solved: 532[Submit][Status][Discuss] Descripti ...

  3. 【BZOJ 5038 不打兔子】

    Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 22  Solved: 8[Submit][Status][Discuss] Description 勤 ...

  4. 【BZOJ 1088 扫雷Mine】模拟

    http://www.lydsy.com/JudgeOnline/problem.php?id=1088 2*N的扫雷棋盘,第二列的值a[i]记录第 i 个格子和它8连通的格子里面雷的数目. 第一列的 ...

  5. 【BZOJ做题记录】07.07~?

    在NOI一周前重开一个坑 最后更新时间:7.08 07:38 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后 ...

  6. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  7. 【BZOJ 2458 最小三角形】

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1551  Solved: 549[Submit][Status][Discuss] Descripti ...

  8. 【BZOJ 5000 OI树】

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 107  Solved: 64[Submit][Status][Discuss] Description ...

  9. 【BZOJ 5047 空间传送装置】

    Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 282  Solved: 121[Submit][Status][Discuss] Descriptio ...

随机推荐

  1. BZOJ1008: [HNOI2008]越狱(组合数)

    题目描述 监狱有连续编号为 1…N1…N 的 NN 个房间,每个房间关押一个犯人,有 MM 种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱. ...

  2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [spring/applicationContext-service.xml]: Cannot resolve refer

    <!-- aop --> <aop:config> <aop:pointcut expression="execution(* com.zsn.Service. ...

  3. 1、spring boot入门

    1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,martin fowler 微服务: ...

  4. python-2函数

    http://docs.python.org/3/library/functions.html 或者菜鸟中文资料 1-使用函数 abs(-20)#求绝对值 max(1,4,200,3,2) #求最大的 ...

  5. python基础之生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...

  6. scala高级特性-01

    目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...

  7. PHP.34-TP框架商城应用实例-后台10-商品分类-需求分析、创建无限级商品分类,递归

    商品管理需求分析 1.实现商品无限级分类管理[类似京东三级分类] 2.添加商品时要指定商品属于一个主分类和多个扩展分类[扩展分类可以是其他主分类] 3.商品列表中可以根据分类搜索商品 a) 搜索一个分 ...

  8. Javascript Step by Step - 03

    前言 ajax 即“Asynchronous JavaScript and XML”(异步的JavaScript和XML).现在这个词的覆盖面有所扩展,把允许浏览器与服务器通信而无需刷新当前页面的技术 ...

  9. 洛谷P1451 求细胞数量

    求细胞数量 题目链接 这道题大概是一个最简单的联通块的题了qwq 注意枚举起点的时候 一定不要从0开始不然你就会从0进入到了其他联通块中从而多查. 一定看清题意这道题不是同色为联通块!!! AC代码如 ...

  10. 10.bootstrap分页,点击哪个分页号,哪个分页号就active

    1.分页,点击哪个分页号,哪个分页号就active <nav> <ul class="pagination"> <li><a href=& ...