POJ 1987
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的更多相关文章
- POJ 1987 Distance Statistics
http://poj.org/problem?id=1987 题意:给一棵树,求树上有多少对节点满足距离<=K 思路:点分治,我们考虑把每个距离都存起来,然后排序,一遍扫描计算一下,注意还要减掉 ...
- POJ 1987 Distance Statistics(树的点分治)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 上场CF的C题是一个树的分治... 今天刚好又 ...
- POJ 1987 Distance Statistics 树分治
Distance Statistics Description Frustrated at the number of distance queries required to find a ...
- poj 1987 节点距离小于等于K(树DP)
这题和poj 1741是一模一样的 但是1741能AC的代码,在这里却是TLE,暂时没看出哪里出现了问题.. AC代码: #include <iostream> #include < ...
- poj 1987 树的分治
思路:1741的A1送 1. #include<iostream> #include<cstring> #include<algorithm> #include&l ...
- POJ 1987 BZOJ 3365 Distance Statistics 树的分治(点分治)
题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream& ...
- [SinGuLaRiTy] 分治题目复习
[SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...
- POJ 1741/1987 树的点分治
树的点分治,主要思想是每次找子树的重心,计算经过根节点的情况数,再减去点对属于同一子树的情况. #include <iostream> #include <vector> #i ...
- UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)
传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS Memory Limit: ...
随机推荐
- B2568 比特集合 树状数组
啊啊啊,跳题坑死人.抽了一道国集的题,自己瞎编了一个算法,好像过不了而半途而废.转去看题解,发现用二维树状数组维护一下,偏移量我倒是想对了,但是维护的东西和我的完全不一样.还是有很大差距啊... 题解 ...
- linux 编译安装TRMPdump(libRTMP)
需要编译libRTMP,首先需要安装配置编译环境.网上能够找到的资料多是在Windows环境编译.这里介绍一下在Linux系统中编译安装libRTMP,一来给后来者一个参考,二来也给自己做一个备忘录. ...
- (Go)07.strings与strconv的示例
package main import ( "strconv" "fmt" "strings" ) func main() { str := ...
- bzoj3211: 花神游历各国(线段树) 同codevs2492
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 1326[Submit][Status][Discu ...
- 树莓派-基于raspistill实现定时拍照
raspistill 经过上一篇<<树莓派-安装摄像头模块>>之后 raspistill 是树莓派基于摄像头拍照命令 比如我要截取一张宽1024px,高768px,旋转180度 ...
- C#接入第三方支付一些小问题
13年第一次接入支付宝的时候,支付宝的api还不是很好用,费了些劲才完成,本月再次接入的时候发现已经很好用了,接入过程非常顺畅,只出现了一个小问题,我的金额默认是保留了4位小数,支付宝api只接受最多 ...
- css3中的box-sizing属性的使用
box-sizing属性用来定义元素的width和height所表示的区域,该属性一般有三种值:content-box.border-box.inherit. 其中inherit表示box-sizin ...
- WEB笔记-让HTML5向下兼容的策略
//给新标签增加块级元素声明 article,aside,dialog,figure,fotter,header,legend,nav,section{display:block} //添加css兹瓷 ...
- Embedded之Stack之二
1 Function Programming languages make functions easy to maintain and write by giving each function i ...
- dubbo之泛化引用
使用泛化调用 泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 Gene ...