T_T为毛会这样子,我的写就是过不了,。。。。。。。

其实这题不难,很容易想到吧,我一开始也想着用枚举这类方法,但复杂度实在不敢想,没想到,真的是用这种方法。。

今天学了一个叫树的重心,可以使分治的子树点数大致相等,降低了递归的层次吧。。。

嗯,这题的复杂度,怎么的也有o(n^2)以上,而且n=40000,竟然。。。。不敢细想了。。。。

代码复制:http://blog.csdn.net/acm_cxlove/article/details/9222999

我自己锉代码就算了T_T,搞不懂了。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N = 40005;
struct Edge{
int v,next,w;
}e[N<<1];
int tot,start[N],n,m,k,del[N],ans=0;
int size[N];
void _add(int u,int v,int w){
e[tot].v=v;e[tot].w=w;
e[tot].next=start[u];start[u]=tot++;
}
void add(int u,int v,int w){
_add(u,v,w);
_add(v,u,w);
}
void cal(int u,int pre){
size[u]=1;
for(int i=start[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==pre||del[v]) continue;
cal(v,u);
size[u]+=size[v];
}
}
int newroot,maxsize,totalsize;
void dfs(int u,int pre){
int mx=0,sum=1;
for(int i=start[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==pre||del[v]) continue;
dfs(v,u);
mx=max(mx,size[v]);
sum+=size[v];
}
mx=max(mx,totalsize-sum);
if(mx<maxsize){
maxsize=mx;
newroot=u;
}
}
int search(int r){
newroot=-1;maxsize=1<<30;
cal(r,-1);
totalsize=size[r];
dfs(r,-1);
return newroot;
}
int dist[N],idx;
vector<int>sub[N],all;
void gao(int u,int pre){
all.push_back(dist[u]);
sub[idx].push_back(dist[u]);
for(int i=start[u];i!=-1;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(v==pre||del[v]) continue;
dist[v]=dist[u]+w;
gao(v,u);
}
}
void solve(int root){
root=search(root);
del[root]=1;
if(totalsize==1) return ;
idx=0;all.clear();
for(int i=start[root];i!=-1;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(del[v]) continue;
sub[idx].clear();
dist[v]=w;
gao(v,-1);
sort(sub[idx].begin(),sub[idx].end());
idx++;
}
for(int i=0;i<idx;i++){
int pos;
for(int j=0;j<sub[i].size();j++){
pos=upper_bound(sub[i].begin(),sub[i].end(),k-sub[i][j])-sub[i].begin()-1;
if(pos>j) ans-=pos-j;
}
pos=upper_bound(sub[i].begin(),sub[i].end(),k)-sub[i].begin()-1;
if(pos>=0) ans+=pos+1;
}
sort(all.begin(),all.end());
for(int i=0;i<all.size();i++){
int pos=upper_bound(all.begin(),all.end(),k-all[i])-all.begin()-1;
if(pos>i) ans+=pos-i;
}
for(int i=start[root];i!=-1;i=e[i].next){
int v=e[i].v;
if(del[v]) continue;
solve(v);
}
}
int main(){
tot=0;memset(start,-1,sizeof(start));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v,w;char str[5];
scanf("%d%d%d%s",&u,&v,&w,str);
add(u,v,w);
}
scanf("%d",&k);
solve(1);
printf("%d\n",ans);
return 0;
}

  

POJ 1987的更多相关文章

  1. POJ 1987 Distance Statistics

    http://poj.org/problem?id=1987 题意:给一棵树,求树上有多少对节点满足距离<=K 思路:点分治,我们考虑把每个距离都存起来,然后排序,一遍扫描计算一下,注意还要减掉 ...

  2. POJ 1987 Distance Statistics(树的点分治)

      转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 上场CF的C题是一个树的分治... 今天刚好又 ...

  3. POJ 1987 Distance Statistics 树分治

    Distance Statistics     Description Frustrated at the number of distance queries required to find a ...

  4. poj 1987 节点距离小于等于K(树DP)

    这题和poj 1741是一模一样的 但是1741能AC的代码,在这里却是TLE,暂时没看出哪里出现了问题.. AC代码: #include <iostream> #include < ...

  5. poj 1987 树的分治

    思路:1741的A1送 1. #include<iostream> #include<cstring> #include<algorithm> #include&l ...

  6. POJ 1987 BZOJ 3365 Distance Statistics 树的分治(点分治)

    题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream& ...

  7. [SinGuLaRiTy] 分治题目复习

    [SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...

  8. POJ 1741/1987 树的点分治

    树的点分治,主要思想是每次找子树的重心,计算经过根节点的情况数,再减去点对属于同一子树的情况. #include <iostream> #include <vector> #i ...

  9. UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)

    传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS     Memory Limit: ...

随机推荐

  1. 第2章 安装Nodejs 2-4 Linux下安装Nodejs

    linux下编译安装Nodejs  GCC和G++分别是GNU的C和C++编译器.它们在执行编译工作的时候把源代码通过预处理转化成汇编语言生成.i后缀的文件,再由汇编变成目标机器代码,最后连接目标代码 ...

  2. (Go)06. Printf格式化输出、Scanf格式化输入详解

    Print.Println .Printf .Sprintf .Fprintf都是fmt 包中的公共方法,在需要打印信息时需要用到这些函数,那么这些函数有什么区别呢? Print: 输出到控制台(不接 ...

  3. Java压缩技术(一) ZLib

    原文:http://snowolf.iteye.com/blog/465433 有关ZLib可参见官方主页 http://www.zlib.net/ ZLib可以简单的理解为压缩/解压缩算法,它与ZI ...

  4. Python 40 数据库-外键约束 、多对一与多对多的处理

    mysql提供了 foreign key,专门用于为表和表之间 建立物理关联 思考 表里存储的是一条条的记录,两个表之间能产生的关系有哪些? 现有 A B两张表 1.多对一         2.一对一 ...

  5. 深入理解Redis——(总纲)

    前言 Redis这个东西,我来来回回的也搞了好几遍,之前更偏向于实战,很多时候只知其然而不知其所以然,最近借阅了一本<深入理解Redis>,就系统的整理一下. 为何选择Redis 开源免费 ...

  6. B - Bit++

    Problem description The classic programming language of Bitland is Bit++. This language is so peculi ...

  7. C# html生成PDF遇到的问题,从iTextSharp到wkhtmltopdf

    我们的网站业务会生成一个报告,用网页展示出来,要有生成pdf并下载的功能,关键是生成pdf. 用内容一段段去拼pdf,想想就很崩溃,所以就去网上找直接把html生成pdf的方法. 网上资料大部分都是用 ...

  8. input表单(02)

    01.表单的代码实现 <!DOCTYPE html> <html> <head> <title>世纪佳缘,你在我也在</title> < ...

  9. 查找索引/ie滤镜/动态背景/属性attr和prop

    1. 查找索引 查找当前元素在指定范围内的索引序号,示例: $('.right_newestState_con').find('em').index($(this)); 2. ie滤镜 利用ie的私有 ...

  10. 【sqli-labs】 less15 POST - Blind- Boolian/time Based - Single quotes (基于bool/时间的单引号POST型盲注)

    错误不回显了 构造永真登陆 登陆成功了 虽然登陆成功了,但是数据库的数据还么有爆出来 构造一下用户名 ' or length(database())=8# 如果数据库名的长度不等于8,登陆会失败 猜测 ...