树上的询问 bzoj-1316

题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No.

注释:$1\le n\le 10^4$,$1\le p\le 100$,长度$\le 10^6$。

想法:有根树tm是啥意思?根在jb哪呢?老子我瞅tm这么半天也没看见根在哪呢??这题点分治即可。我们用点分治的第二种:分别计算子树,然后用之前的信息更新答案。对于此题,我们可以直接维护一个set就行。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#define N 10010
using namespace std;
set<int>s;
int n,m,sum,root,cnt;
int a[N],dic[N<<1],size[N],mx[N],deep[N];
bool vis[N],ans[N];
int to[N<<1],head[N],val[N<<1],nxt[N<<1],tot;
inline void add(int x,int y,int z)
{
to[++tot]=y;
val[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
void getroot(int pos,int fa)
{
mx[pos]=0,size[pos]=1;
for(int i=head[pos];i;i=nxt[i])
{
if(to[i]==fa||vis[to[i]]) continue;
getroot(to[i],pos);
size[pos]+=size[to[i]];
mx[pos]=max(mx[pos],size[to[i]]);
}
mx[pos]=max(mx[pos],sum-size[pos]);
if(mx[root]>mx[pos]) root=pos;
}
void getdeep(int pos,int fa)
{
size[pos]=1;
dic[++cnt]=deep[pos];
for(int i=head[pos];i;i=nxt[i])
{
if(to[i]==fa||vis[to[i]]) continue;
deep[to[i]]=deep[pos]+val[i];
getdeep(to[i],pos);
size[pos]+=size[to[i]];
}
}
void dispose(int pos)
{
// cout << " Fuck && Shit " << endl ;
vis[pos]=true;
s.clear();
s.insert(0);
for(int i=head[pos];i;i=nxt[i])
{
// cout << " Fuck 2" << endl ;
if(vis[to[i]]) continue;
cnt=0; deep[to[i]]=val[i],getdeep(to[i],0);
for(int j=1;j<=cnt;j++)
{
for(int k=1;k<=m;k++)
{
if(s.find(a[k]-dic[j])!=s.end()) ans[k]=1;
}
}
for(int j=1;j<=cnt;j++) s.insert(dic[j]);
}
for(int i=head[pos];i;i=nxt[i])
{
if(vis[to[i]]) continue;
sum=size[to[i]];
root=0;
getroot(to[i],0);
dispose(root);
// cout << " Fuck " << endl ;
}
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,c;
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&c);
add(x,y,c),add(y,x,c);
}
// cout << "Fuck1" << endl ;
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
if(!a[i]) ans[i]=1;
}
mx[0]=1<<30;
sum=n;
// cout << "Fuck1" << endl ;
getroot(1,0);
// cout << "Fuck1" << endl ;
dispose(root);
// cout << "Fuck : " << m << endl ;
for(int i=1;i<=m;i++)
{
printf("%s\n",ans[i]?"Yes":"No");
}
return 0;
}

小结:这种题更适合入门题。

[bzoj1316]树上的询问_点分治的更多相关文章

  1. BZOJ_1316_树上的询问_点分治

    BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...

  2. [BZOJ1316]树上的询问 点分治

    1316: 树上的询问 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1017  Solved: 287[Submit][Status][Discus ...

  3. 【点分治】bzoj1316 树上的询问

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #defin ...

  4. [bzoj1316] 树上的询问

    裸的点分治.. 及时把已经确定的询问清掉就能快不少.时间复杂度O(nlogn*p) #include<cstdio> #include<iostream> #include&l ...

  5. BZOJ 1316: 树上的询问 (点分治+set)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1316 因为只要求存在某条路径长度为K,所以点分,然后用set判断差值是否在set中就可以了. ...

  6. 【BZOJ1316】树上的询问 点分治+set

    [BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...

  7. BZOJ 1316: 树上的询问( 点分治 + 平衡树 )

    直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...

  8. BZOJ_3697_采药人的路径_点分治

    BZOJ_3697_采药人的路径_点分治 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性 ...

  9. BZOJ_2152_聪聪可可_点分治

    BZOJ_2152_聪聪可可_点分治 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)…… ...

随机推荐

  1. bzoj4034 [HAOI2015]树上操作——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4034 树剖裸题: 一定要注意 long long !!! update 的时候别忘了 pus ...

  2. 更新svn时出错,大概的意思是项目被锁定了

  3. 知识总结1:debug命令汇总(一)

    -r 得到当前寄存器状态或修改寄存器状态 -d 跳到默认(CS:IP指定的地址)区间 -d 段地址:偏移地址 跳到(段地址*+偏移地址)区间 -d 段地址:起始偏移地址 终止偏移地址 跳到(段地址*+ ...

  4. BZOJ 4753 二分+树形DP

    思路: 先二分答案 f[x][j]表示在x的子树里选j个点 f[x][j+k]=max(f[x][j+k],f[x][j]+f[v[i]][k]); 初始化 x!=0 -> f[x][1]=p[ ...

  5. hbase无法启动,The node /hbase is not in ZooKeeper

    问题详细描述如下: 2016-12-09 15:10:39,160 ERROR [org.apache.hadoop.hbase.client.ConnectionManager$HConnectio ...

  6. JavaScript 判断手机端操作系统(Andorid/IOS)

    androidURL = "http://xxx/xxx.apk"; var browser = { versions: function() { var u = navigato ...

  7. Python yield解析

    Pyhton generators and the yield keyword At a glance,the yield statement is used to define generators ...

  8. less 安装和webstorm的使用

    1.less 的安装 npm install -g less 2.less安装成功 3.less安装成功后,在webstorm中进行配置.file——>settings:弹出settings框, ...

  9. OpenCv: 二维坐标的旋转方程

    1. 可以写成一个矩阵的形式,也可以写成向量的形式: b 为选转角度加pi/2 x1 = x cos(b) - ysin(b) ;  y1 = x sin(b) + y cos(b).

  10. webpack学习(三)

    前篇:webpack学习(二) jquery不需要在项目中自己下载,而是作为一个模块引入.jquery的存放路径是在 node_modules目录下.1.首先给项目安装jquery,npm insta ...