点分治X2
1.聪聪可可
点分治板子
然而想那个 t1[1]*t1[2]*2+t1[0]*t1[0]想了好久
就是最基本的组合方法 毕竟(2,5)和(5,2)可是要算两次的
画画图就好了
(不要像我一样盯着大佬们的显然可得懵逼23333)
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #define maxn 40000 using namespace std; struct eg { int to,v,nxt; }b[maxn]; ,f[maxn],sz[maxn],vis[maxn],d[maxn]={},ans,root,sum,t1[]; int gcd(int x,int y){return y?gcd(y,x%y):x;} void link(int x,int y,int z) { b[++tot].nxt=head[x]; b[tot].to=y; b[tot].v=z; head[x]=tot; } void getroot(int u,int fa) { sz[u]=,f[u]=; for (int i=head[u];i;i=b[i].nxt) { int t=b[i].to; if (vis[t]||t==fa) continue; getroot(t,u); sz[u]+=sz[t]; f[u]=max(f[u],sz[t]); } f[u]=max(f[u],sum-sz[u]); if (f[root]>f[u]) root=u; } void getdeep(int x,int fa) { t1[d[x]]++; for (int i=head[x];i;i=b[i].nxt) { int t=b[i].to; if (vis[t]||t==fa) continue; d[t]=(d[x]+b[i].v)%; getdeep(t,x); } } int cal(int x,int vv) { d[x]=vv%; t1[]=t1[]=t1[]=; getdeep(x,); ]*t1[]*+t1[]*t1[]; } void work(int x) { ans+=cal(x,); vis[x]=; for (int i=head[x];i;i=b[i].nxt) { int t=b[i].to; if (vis[t]) continue; ans-=cal(t,b[i].v); sum=sz[t]; root=; getroot(t,); work(root); } } int main() { int n; scanf ("%d",&n); ;i<n;++i) { int x,y,w; scanf ("%d%d%d",&x,&y,&w); link(x,y,w); link(y,x,w); } root=;f[]=n,sum=n; getroot(,); work(root); int l=gcd(ans,n*n); cout<<(ans/l)<<"/"<<(n*n/l); ; }
2.POJ1741 树上的点对
考试的时候碰到这题 感觉就像bilegou
然后我这个天大的sb就发挥我的本性打了个链剖哈哈哈哈哈哈哈哈 还没打完
考完之后老师说正解是点分治 然而考前我们是没有学过这玩意儿的(和善
去学了一下 只感觉dalao的论文写的真好
#include<iostream> #include<cstdlib> #include<cstdio> #include<algorithm> #include<cstring> #define maxn 20010 using namespace std; ,dep[maxn],sz[maxn],f[maxn],vis[maxn],d[maxn]; int sum,root,n,k,ans; void link(int x,int y,int z) { nxt[++tot]=head[x]; to[tot]=y; dis[tot]=z; head[x]=tot; } void gr(int x,int fa) { sz[x]=;f[x]=; for (int i=head[x];i;i=nxt[i]) { int t=to[i]; if (t==fa||vis[t]) continue; gr(t,x); sz[x]+=sz[t]; f[x]=max(f[x],sz[t]); } f[x]=max(f[x],sum-sz[x]); if (f[root]>f[x]) root=x; } void gd(int x,int fa) { dep[++dep[]]=d[x]; for (int i=head[x];i;i=nxt[i]) { int t=to[i]; if (t==fa||vis[t]) continue; d[t]=d[x]+dis[i]; gd(t,x); } } int work(int x,int v) { d[x]=v;dep[]=; gd(x,); sort(dep+,dep+dep[]+); ; ,r=dep[];l<r;) { if (dep[l]+dep[r]<=k) ans+=r-l,l++; else r--; } return ans; } void dfs(int u) { ans+=work(u,); vis[u]=; for (int i=head[u];i;i=nxt[i]) { int t=to[i]; if (vis[t]) continue; ans-=work(t,dis[i]); sum=sz[t]; root=; gr(t,); dfs(root); } } int main() { //freopen ("in.txt","r",stdin); //freopen ("out.txt","w",stdout); while (scanf ("%d%d",&n,&k)) { memset(vis,,sizeof(vis)); memset(head,,sizeof(head)); root=,ans=,tot=; ) break; ;i<n;++i) { int x,y,z; scanf ("%d%d%d",&x,&y,&z); link(x,y,z); link(y,x,z); } sum=n,f[]=0x7fffffff; gr(,); dfs(root); cout<<ans<<endl; } ; }
点分治X2的更多相关文章
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
[题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...
- 初识CDQ分治
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
- 【BZOJ-4456】旅行者 分治 + 最短路
4456: [Zjoi2016]旅行者 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 254 Solved: 162[Submit][Status] ...
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- Bzoj2683 简单题 [CDQ分治]
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1071 Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...
- 初学CDQ分治-NEU1702
关于CDQ分治,首先需要明白分治的复杂度. T(n) = 2T(n/2)+O(kn), T(n) = O(knlogn) T(n) = 2T(n/2)+O(knlogn), T(n) = O(knlo ...
随机推荐
- Html5如何自学 只需这几步
Html5在整个行业卷起了一场大潮流,好多人都,但是很多人都不知道该怎么学习Html5,不知道Html5该如何自学?不知道Html5开发多久才会学会?接下来将从以下几点内容详细讲述. 第一,很多人建议 ...
- OC面向对象的三大特性
一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...
- 【转】three.js详解之入门篇
原文链接:https://www.cnblogs.com/shawn-xie/archive/2012/08/16/2642553.html 开场白 webGL可以让我们在canvas上实现3D效 ...
- wkwebview加载本地html的要点
项目中有些页面,我采用了html页面开发,然后用wkwebview加载的设计.在加载过程中遇见了一些问题,在这里进行一些记载和讨论.如有不同意见欢迎进行评论沟通. 问题时候这样的: 在webview的 ...
- 简单了解enum
enum的性质: 1.枚举类型的实例都是常量 2.要使用enum,需要创建一个该类型的引用,并将其赋值给某个实例 3.常用的方法: * toString():某个enum实例的名字 * ...
- git log 中文乱码问题(浪费了一天)
git log和gitcommit中文出现乱码,花了大半天的时间试了网上的各种方法,还是搞不定. 只好放大招. 卸载软件后重装,还没有进行任何配置,git config --list 发现有大量的配置 ...
- CCF-201503-2-数字排序
问题描述 试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序 ...
- yii2.0中数据缓存之增删改查
public function actionSss(){ /* * 获取到缓存 * 这里是获取的是根目录下 的common/main.php中的缓存类组件 * */ $cache=\Yii::$app ...
- 如何打包静态库.framework文件 iOS
代码调试好了开始打包成sdk,下面是将要打包的FRSDK代码(FRSDK.h暴露在外面有别人调用) 1.创建新工程(Xcode File-New-Project) 2.把下面的红色框的东西移除 3.将 ...
- Android数据绑定技术一,企业级开发
PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...