BZOJ 3697: 采药人的路径 [点分治] [我想上化学课]

传送门

题意:

路径有$-1,1$两种权值,求有多少路径满足权值和为$0$且有一个点将路径分成权值和为$0$的两段


 

第四节课本来想去上化学,然后快上课了这道题还没调出来.....可恶我想上化学

昨天两节语文课潸然的李煜讲座也没去听呜呜听说今天的语文课还有什么文艺活动又错过了呜呜

还是有思路的

点分治,考虑经过$u$的路径

首先保证权值和为$0$,记录$c[i]$为当前权值和为$i$的路径有几条

怎么满足有一个点呢?

$0+0=0$!!!

我们只要保证一段和$0$另一段自然也是$0$

所以补充保存的信息,

$c[i][0]$当前权值和为$0$且到$u$的路径上没有一段为$0$(就是没有祖先的权值和也为$i$,打标记就行了)的路径有几条

$c[i][1]$表示有......

然后每颗子树先更新答案再更新$c$就行了

然后一直$WA$.....

突然想到自己没有处理$u$的信息

然后改了也不对

然后发现打标记只是$=1\ =0$没有$++\ --$.....

改了还不对

参考黄学长的代码打了一份他的做法$AC$了,然后又开始找自己的错误

最后还是处理$u$的信息有问题,我直接用了$mark$因为我还以为$mark$只有$0,1$.......

还我化学

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5,INF=1e9+5;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,a,b,w;
struct edge{int v,w,ne;
}e[N<<1];
int h[N],cnt;
inline void ins(int u,int v,int w){cnt++;e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
}int f[N],size[N],all,vis[N],root;
void dfsRt(int u,int fa){size[u]=1;f[u]=0;for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(vis[v]||v==fa) continue;dfsRt(v,u);size[u]+=size[v];f[u]=max(f[u],size[v]);}f[u]=max(f[u],all-size[u]);if(f[u]<f[root]) root=u;
}
int mark[N<<1],Z=N,c[N<<1][2];
ll ans;
void dfsAns(int u,int fa,int now){if(now==0) ans+=c[Z][0]+c[Z][1] +(mark[Z]>=1);else{if(mark[Z+now]) ans+=c[Z-now][0]+c[Z-now][1];else ans+=c[Z-now][1];}mark[Z+now]++;for(int i=h[u];i;i=e[i].ne)if(!vis[e[i].v]&&e[i].v!=fa) dfsAns(e[i].v,u,now+e[i].w);mark[Z+now]--;
}
int st[N],top;
void dfsDee(int u,int fa,int now){c[Z+now][mark[Z+now]>=1]++;st[++top]=Z+now;mark[Z+now]++;for(int i=h[u];i;i=e[i].ne)if(!vis[e[i].v]&&e[i].v!=fa) dfsDee(e[i].v,u,now+e[i].w);mark[Z+now]--;
}
void dfsSol(int u){vis[u]=1;for(int i=h[u];i;i=e[i].ne)if(!vis[e[i].v]) dfsAns(e[i].v,u,e[i].w),dfsDee(e[i].v,u,e[i].w);while(top) c[st[top]][0]=c[st[top]][1]=0,top--;for(int i=h[u];i;i=e[i].ne) if(!vis[e[i].v]){all=size[e[i].v];root=0;dfsRt(e[i].v,0);dfsSol(root);}
}
int main(){freopen("in","r",stdin);n=read();for(int i=1;i<n;i++) a=read(),b=read(),w= read()==0?-1:1,ins(a,b,w);all=n;root=0;f[0]=INF;dfsRt(1,0);dfsSol(root);printf("%lld",ans);
}

 

黄学长做法,本质上一样的

改进了一下后$1600ms$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5,INF=1e9+5;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,a,b,w;
struct edge{int v,w,ne;
}e[N<<1];
int h[N],cnt;
inline void ins(int u,int v,int w){cnt++;e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
}int f[N],size[N],all,vis[N],root;
void dfsRt(int u,int fa){size[u]=1;f[u]=0;for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(vis[v]||v==fa) continue;dfsRt(v,u);size[u]+=size[v];f[u]=max(f[u],size[v]);}f[u]=max(f[u],all-size[u]);if(f[u]<f[root]) root=u;
}
int mark[N<<1],Z=N;
ll c[N<<1][2],d[N<<1][2];
ll ans;
int mx;
void dfsRun(int u,int fa,int now){d[Z+now][mark[Z+now]>=1]++;mx=max(mx,abs(now));mark[Z+now]++;for(int i=h[u];i;i=e[i].ne)if(!vis[e[i].v]&&e[i].v!=fa) dfsRun(e[i].v,u,now+e[i].w);mark[Z+now]--;
}
void dfsSol(int u){//printf("dfsSol %d\n",u);vis[u]=1;c[Z][0]=1;int mxmx=0;for(int i=h[u];i;i=e[i].ne)if(!vis[e[i].v]){mx=1;dfsRun(e[i].v,u,e[i].w);mxmx=max(mxmx,mx);ans+=(c[Z][0]-1)*d[Z][0];for(int j=-mx;j<=mx;j++) ans+=c[Z-j][1]*d[Z+j][1]+c[Z-j][0]*d[Z+j][1]+c[Z-j][1]*d[Z+j][0];for(int j=Z-mx;j<=Z+mx;j++){c[j][0]+=d[j][0];c[j][1]+=d[j][1];d[j][0]=d[j][1]=0;}}for(int i=Z-mxmx;i<=Z+mxmx;i++) c[i][0]=c[i][1]=0;for(int i=h[u];i;i=e[i].ne) if(!vis[e[i].v]){all=size[e[i].v];root=0;dfsRt(e[i].v,0);dfsSol(root);}
}
int main(){freopen("in","r",stdin);n=read();for(int i=1;i<n;i++) a=read(),b=read(),w= read()==0?-1:1,ins(a,b,w);all=n;root=0;f[0]=INF;dfsRt(1,0);dfsSol(root);printf("%lld",ans);
}

 

转载于:https://www.cnblogs.com/candy99/p/6497858.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#语言规范所在文件夹,C#规范整理·语言要素

如有不理解&#xff0c;请留言&#xff0c;开始!1. 正确操作字符串拼接字符串一定要考虑使用 StringBuilder ,默认长度为16,实际看情况设置。StringBuilder本质&#xff1a; 是以非托管方式分配内存。同时StringFormat方法 内部也是使用StringBuilder进行字符串格式化。2. 使用…

Discuz常见小问题-如何取消登陆发帖验证码

1 正常情况下&#xff0c;用户点击登录之后&#xff0c;需要填写验证码 2 进入后台&#xff0c;点击防灌水&#xff0c;验证设置&#xff0c;然后下面的各个选项可以设置是否启用验证码。 转载于:https://www.cnblogs.com/acetaohai123/p/6504754.html

RC电路的充放过程C语言实现,RC串联电路的暂态过程基本原理介绍

RC串联电路的特点&#xff1a;由于有电容存在不能流过直流电流&#xff0c;电阻和电容都对电流存在阻碍作用&#xff0c;其总阻抗由电阻和容抗确定&#xff0c;总阻抗随频率变化而变化。RC 串联有一个转折频率&#xff1a;f01/2πR1C1当输入信号频率大于f0 时&#xff0c;整个 …

jvm 方法区

方法区在一个jvm实例的内部&#xff0c;类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量也存储在方法区中。 jvm实现的设计者决定了类型信息的内部表现形式。如&#xff0c;多字节变量在类文件是以big-endia…

C语言1094题目,基于visual Studio2013解决C语言竞赛题之1094纵横图

/************************************************************************//* 二)程序设计⑴奇阶纵横图n2m1请见填写方法分析1)。 该程序在 数组23题已经完成⑵偶阶纵横图n2(2m1)时&#xff0c;算法分析是把方阵划成A、B、C、D四个小子阵&#xff0c;然后进行多次交换数字来…

c语言考试常考试卷,c语言面试最必考的十道试题,求职必看!!!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼6、free()函数问&#xff1a;下面的程序会在用户输入’freeze’的时候出问题&#xff0c;而’zebra’则不会&#xff0c;为什么?#include int main(int argc, char *argv[]) {char *ptr (char*)malloc(10);if(NULL ptr){printf(…

Java 导出Excel

前台代码&#xff1a; View Code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546<button class"btn btn-sm btn-success" type"submit" id"detailEp" onclick"return exportCheck(true);"…

android 使用动态的svg资源,在Android中使用SVG作为资源 – victor

victor在Android中使用SVG作为资源。使用这个插件&#xff0c;你可以为SVG定义源文件&#xff0c;它们将会自动在build中光栅化/导入&#xff0c;无需源代码。安装在build.gradle中添加:buildscript {repositories {jcenter()}dependencies {classpath com.trello:victor:0.3.0…

centOS改编码

http://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html cd /rootvim .bashrcLANG"zh_CN.GBK" :wqsoure.bashrc转载于:https://www.cnblogs.com/finallyliuyu/p/6513587.html

android 键盘 自动消失,android 软键盘 回到键 消失事件 监听

弹出输入法 时 隐藏了 ‘底部状态栏’ 在按 物理 返回键 后&#xff0c; 软键盘消失后 恢复 ‘底部状态栏’public class ImageViewCareIME extends ImageView{public ImageViewCareIME(Context context){super(context);// TODO Auto-generated constructor stub}public stati…

java基础_变量

变量: 数据类型: 基本类型&#xff1a;short/byte(1byte)/char(2byte)-->int(4byte)-->long(8byte)-->float&#xff08;8byte&#xff09;-->double&#xff08;16byte,默认&#xff09;、boolean java变量 从本质上讲&#xff0c;变量其实是内存里面的一小块区域…

android 开机动画尺寸,Android开机Logo动画制作

开机Logo制作1.准备Logo图片准备一张符合尺寸要求(例如&#xff1a;1280x720)的图片&#xff0c;最好是png或jgp。2.用Hitool工具制作镜像文件海思芯片使用的是Hitool工具&#xff0c;打开Hitool&#xff0c;选择HiFastplay&#xff0c;选择右下角的Logo设置&#xff0c;添加图…

18:验证子串

18:验证子串 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述输入两个字符串&#xff0c;验证其中一个串是否为另一个串的子串。 输入输入两个字符串&#xff0c; 每个字符串占一行&#xff0c;长度不超过200且不含空格。输出若第一个串s1是第二个串s2的子串&#xf…

android安装过哪些应用程序,如何安装应用程序两次而不干扰Android?

我有一个Android应用程序(让我们称为X),我想创建第二个应用程序X2,但基于另一个应用程序.所以我将清单应用程序名称属性更改为X2也改变了包名...但是当我安装X2时,应用程序X被删除了!我应该更改哪些属性,以便我可以在一台设备上独立安装这两个应用程序.我正在研究eclispe.packa…

android webview es6,Android v 5.0 webview HTML5,CSS3和ES6兼容性

我有一个使用Crosswalk的混合Android应用程序.几个月前我转向Crosswalk,这是一个巨大的生产力提升.我花了很多时间测试不同的Android操作系统版本,并且在HTML5 / CSS3 / ES6实现不完整的情况下遇到的问题要少得多 – 如果我理解正确的话,因为Crosswalk是基于Chromium而不是早期…

ADB 基础命令使用

1.adb shell&#xff08;>2个设备显示&#xff1a;error: more than one device/emulator,仅连接一个设备可用&#xff09; adb -d shell 只运行在真实设备中 adb -e shell 只运行在模拟器中 adb -s "指定设备ID" shell &#xff08;>2个设备可用&#xff09; …

照片边框 app android,Screener App-一手搞定将手机截图加上外框

记得几年前想要在Android手机上截图&#xff0c;得安装类似截图软件与Root 才行&#xff0c;层层的关卡还真不是一般使用者能处理的&#xff0c;如今Android手机大部分都已内置截图功能&#xff0c;对于我撰写App文章来说帮助很大&#xff0c;但有时想要表现哪台手机外框画面时…

java多线程编程相关技术

首先要记住核心一点、多线程事异步的&#xff0c;也就是cpu利用率大幅提高。 Stringbuffer 是线程安全的 stringbuilder是线程不安全的HashTable是线程安全的 HashMap不是线程安全的 2.对象及变量的并发访问下的问题。 方法内的变量因为是方法的私有变量&#xff0…

JAVA补充-抽象类

1.抽象类基本概念 1 package com.neusoft.abstracted;2 /**3 * 抽象类&#xff1a;在class之前加abstract关键字4 * 抽象方法语法&#xff1a; 修饰符 abstract 返回值类型 方法名&#xff08;形参列表&#xff09;&#xff1b;5 * 1.抽象方法的返回值前面有abstract关键…

android谷歌补丁日期,久违的Android更新补丁:多年前的坑,谷歌终于给填上了

3月5日消息&#xff0c;近日谷歌在最新的Android安全公告中称&#xff0c;当前更新的补丁CVE-2020-0069已修复联发科芯片设备的安全漏洞。据了解&#xff0c;联发科曾在2016年左右确认&#xff0c;部分搭载联发科芯片的Android设备存在安全性问题&#xff0c;所涉及的设备数量达…