[JZOJ100026]图--倍增
[JZOJ100026]图--倍增
题目链接
太懒了,自行搜索
分析
裸倍增,不多说
\(fa[i][j]\)表示\(i\)跳\(2^j\)步走到的点
\(f[i][j]\)表示\(i\)跳\(2^j\)步经过边权之和
\(mi[i][j]\)表示\(i\)跳\(2^j\)步经过的边权最小值
\(fa[i][j]=fa[fa[i][j-1]][j-1]\)
\(f[i][j]=f[i][j-1]+f[fa[i][j-1]][j-1]\)
\(mi[i][j]=min(mi[i][j-1],mi[fa[i][j-1]][j-1])\)
然后一开始我\(naiive\)认为要找一个环上的点开始跳,于是打个了搜索,结果不知道怎么回事一直\(WA\),后面才学到根本不用那么麻烦...太菜了
代码
/*
code by RyeCatcher
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <utility>
#include <queue>
#include <vector>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <iostream>
#define DEBUG freopen("dat.in","r",stdin);freopen("wa.out","w",stdout);
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define ri register int
#define ll long long
#define ull unsigned long long
#define SIZE 1<<22
using std::min;
using std::max;
using std::priority_queue;
using std::queue;
using std::vector;
using std::pair;
using namespace __gnu_pbds;
inline char gc(){
static char buf[SIZE],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while((c=gc())>'9'||c<'0')ne=c=='-';x=c-48;
while((c=gc())>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48;x=ne?-x:x;return ;
}
const int maxn=100005;
const int inf=0x7fffffff;
int LIM;
int n;
vector <int> son[maxn];
int fa[maxn][33],mi[maxn][33];
ll f[maxn][33],k;
int pos[35],tot=0,cnt=0,ms=inf;
ll ans=0;
int main(){
int x,y;
//FO(graph);
freopen("wtf.out","w",stdout);
freopen("graph4.in","r",stdin);
read(n),read(k);
LIM=log2(k)+1;
for(ri i=1;i<=n;i++){
read(x),x++;
fa[i][0]=x,son[x].push_back(i);
}
for(ri i=1;i<=n;i++)read(f[i][0]),mi[i][0]=f[i][0];
for(ri o=1;o<=LIM;o++){
for(ri i=1;i<=n;i++){
fa[i][o]=fa[fa[i][o-1]][o-1];
f[i][o]=f[i][o-1]+f[fa[i][o-1]][o-1];
mi[i][o]=min(mi[i][o-1],mi[fa[i][o-1]][o-1]);
}
}
while(k){
if(k%2)pos[++tot]=cnt;
k=k>>1;
cnt++;
}
for(ri i=1;i<=n;i++){
ms=inf,ans=0,x=i;
for(ri j=1;j<=tot;j++){
ans+=f[x][pos[j]];
ms=min(ms,mi[x][pos[j]]);
x=fa[x][pos[j]];
}
printf("%lld %d\n",ans,ms);
}
return 0;
}
[JZOJ100026]图--倍增的更多相关文章
- BZOJ3712[PA2014]Fiolki 建图+倍增lca
居然是一道图论题 毫无思路 我们对于每一次的融合操作 $(a,b)$ 建一个新点$c$ 并向$a,b$连边 再将$b$瓶当前的位置赋成$c$ 这样子我们就可以建成一个森林 现在枚举每一种反应$M_i$ ...
- [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...
- BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
- cf786E ALT (最小割+倍增优化建图)
如果把“我全都要”看作是我全不要的话,就可以用最小割解决啦 源点S,汇点T 我们试图让每个市民作为一个等待被割断的路径 把狗狗给市民:建边(S,i,1),其中i是市民 把狗狗给守卫:建边(j,T,1) ...
- [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)
题目链接: http://172.16.0.132/senior/#main/show/100026 题目: 有一个$n$个点$n$条边的有向图,每条边为$<i,f(i),w(i)>$,意 ...
- [JZOJ100026]【NOIP2017提高A组模拟7.7】图
Description 有一个n个点n条边的有向图,每条边为<i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发经 ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- BZOJ 3732: Network 最小生成树 倍增
3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...
随机推荐
- redus - 队列
redus 写如队列 <?php $redis = new \Redis(); $redis->connect('127.0.0.1',6379); $password = '123456 ...
- [MySql]当虚拟机的IP地址自动更换后,JDBC使用原来的配置连不上MySql数据库时所报的异常。
Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. ...
- Android开发final的用法
Android开发final的用法 final如果修饰类,该类不能被继承: final如果修饰变量,该变量不能被修改,不能再重新赋值,即变为常量: final如果修饰方法,该方法不能被重写: 此外 ...
- kotlin 类的委托
fun main(arg: Array<String>) { val baseImpl = baseImpl() demo(baseImpl).printL() } interface b ...
- 数据分析 - Power BI
BI 目的 单表的展示有限很多的时候只能体现现象, 仅仅进行监控级别没问题 但是就数据分析而言实在不够用, 大部分的事情需要多表多图展示才可以通过现象深入挖掘诱因 BI 安装 这里使用 microso ...
- Flask-Login详解
Flask-Login详解 关于Flask登录认证的详细过程请参见拙作<<使用Flask实现用户登陆认证的详细过程>>一文,而本文则偏重于详细介绍Flask-Login的原理, ...
- OSG Qt Widget加载三维模型
graphicswindowqt.h #ifndef GRAPHICSWINDOWQT_H #define GRAPHICSWINDOWQT_H #include <QGLWidget> ...
- Linux 常用高效操作
空行处理 linux系统下删除空行,用vim底行模式'%s/^n$//g' 可以删除空行并真正修改文件,但文件数量太大时耗时不可预估,于是操作文件删除空行并重定向到一个新的文件是不错的选择. 常用特殊 ...
- Packages window(包窗口)
使用Unity Package Manager(在Unity的顶层菜单中:Window > Package Manager)查看可以安装或已安装在Project中的软件包.此外,您可以使用此窗口 ...
- 如何通过Exchange2010 OWA更改过期密码
很多Exchange 2003管理员都通过IISADMPWD虚拟目录为员工提供用户密码修改功能,这大大方便了移动用户和非加入域用户在密码到期时的更改操作.您也许已经注意到:Windows Server ...