BZOJ 3365: [Usaco2004 Feb]Distance Statistics 路程统计 点分治
2017-06-21 18:51
507 查看
3365: [Usaco2004 Feb]Distance Statistics 路程统计
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 264 Solved: 153
[Submit][Status][Discuss]
Description
在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的.
Input
第1到I+M行:与前三题相同;第M+2行:一个整数K.
Output
农场之间的距离不超过K的对数.Sample Input
7 61 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
10
Sample Output
5有五对道路之间的距离小于10
1-4,距离为3
4-7,距离为2
1-7,距离为5
3-5,距离为7
3-6,距离为9
裸点分治
这个题有鬼畜的字符。。。
还 诚惶诚恐地加了输入字符串。。。
我有读入优化啊。。。
笑哭
#include<cmath> #include<ctime> #include<cstdio> #include<cstring> #include<cstdlib> #include<complex> #include<iostream> #include<algorithm> #include<iomanip> #include<vector> #include<string> #include<bitset> #include<queue> #include<map> #include<set> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f; } inline void print(int x) { if(x<0)putchar('-'),x=-x; if(x>=10)print(x/10);putchar('0'+x%10); } const int N=40010,inf=0X3f3f3f3f; int ecnt,last ,k,n,root,sum,size ,f ,t ,dis ,ans; bool vis ; struct EDGE{int to,nt,val;}e[N<<1]; inline void add(int u,int v,int val) {e[++ecnt]=(EDGE){v,last[u],val};last[u]=ecnt;} void getroot(int u,int fa) { f[u]=0;size[u]=1; for(int i=last[u];i;i=e[i].nt) { if(e[i].to==fa||vis[e[i].to])continue; getroot(e[i].to,u); size[u]+=size[e[i].to]; f[u]=max(f[u],size[e[i].to]); } f[u]=max(f[u],sum-size[u]); if(f[u]<f[root])root=u; } void seek(int u,int fa) { t[++t[0]]=dis[u]; for(int i=last[u];i;i=e[i].nt) { if(vis[e[i].to]||e[i].to==fa)continue; dis[e[i].to]=dis[u]+e[i].val; seek(e[i].to,u); } } inline void cal(int u,int val,int opt) { t[0]=0;dis[u]=val;seek(u,0); sort(t+1,t+1+t[0]); int l=1,r=t[0]; while(l<r) { if(t[l]+t[r]<=k)ans+=opt*(r-l),l++; else r--; } } void solve(int u) { cal(u,0,1);vis[u]=1; for(int i=last[u];i;i=e[i].nt) { if(vis[e[i].to])continue; cal(e[i].to,e[i].val,-1);root=0;sum=size[e[i].to]; getroot(e[i].to,0);solve(root); } } int main() { n=read();int m=read(); while(m--){int u=read(),v=read(),val=read();add(u,v,val);add(v,u,val);} k=read();f[0]=inf;sum=n;getroot(1,0);solve(root);print(ans); return 0; } /* 7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 10 5 */
相关文章推荐
- BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计 树的点分治
- BZOJ_3365_[Usaco2004 Feb]Distance Statistics 路程统计&&POJ_1741_Tree_点分治
- 【bzoj3365】[Usaco2004 Feb]Distance Statistics 路程统计 点分治
- [BZOJ3365][Usaco2004 Feb]Distance Statistics 路程统计(点分治)
- POJ 1987 BZOJ 3365 USACO 2004 Feb Distance Statistics 路程统计 点分治
- bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)
- 3365: [Usaco2004 Feb]Distance Statistics 路程统计 点分治
- 3365: [Usaco2004 Feb]Distance Statistics 路程统计|树的点分治
- 【点分治】3365: [Usaco2004 Feb]Distance Statistics 路程统计
- BZOJ3365: [Usaco2004 Feb]Distance Statistics 路程统计 点分治
- 【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树的直径/LCA/树的点分治
- bzoj3365: [Usaco2004 Feb]Distance Statistics 路程统计
- 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦
- bzoj 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 带权并查集
- BZOJ 3367: [Usaco2004 Feb]The Big Game 球赛( dp )
- 树的直径 【bzoj3363】[Usaco2004 Feb]Cow Marathon 奶牛马拉松
- bzoj 3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助(set+贪心)
- BZOJ3367 [Usaco2004 Feb]The Big Game 球赛
- LCA【bzoj3364】: [Usaco2004 Feb]Distance Queries 距离咨询
- bzoj 3364: [Usaco2004 Feb]Distance Queries 距离咨询 LCA