Description

有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi。
si:由i出发经过k条边,这k条边的权值和。
mi:由i出发经过k条边,这k条边的权值最小值。

Input

第一行两个数n和k
第二行n个数f(i)
第三行n个数w(i)

Output

每行两个数si和mi

Sample Input

7 3
1 2 3 4 3 2 6
6 3 1 4 2 2 3

Sample Output

10 1
8 1
7 1
10 2
8 2
7 1
9 3

Data Constraint

30%的数据:n,k<=1000。
100%的数据:N<=10^5,k<=10^10,0<=f(i)

Hint

Solution

  • 观察到每个点的出边只有一条,那说明一个点运动的路径是固定不变的。

  • 由于 K 的范围太大,直接模拟是不可能的,于是我们想到倍增算法。

  • 设 F[i][j]F[i][j] 表示第 ii 个点、运动了 2j2^j 个点的状态。

  • 开三个域 toto , sumsum , mnmn 分别表示其到的点、权值和 和 最小值 。

  • 之后倍增求出 F 数组,再每个点 O(logK)O(logK) 走一遍即可 。

  • 这样的时间复杂度是 O(NlogK)O(NlogK) ,可以通过本题。

Code

#include<cstdio>
#include<cmath>
using namespace std;
const int N=100001;
struct data
{int to,mn;long long sum;
}g[N][35];
long long k;
int f[N],w[N];
long long p[35];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline int min(int x,int y)
{return x<y?x:y;
}
int main()
{int n=read();scanf("%lld",&k);int t=log2(k);for(int i=p[0]=1;i<=t;i++) p[i]=p[i-1]*2;for(int i=0;i<n;i++) g[i][0].to=f[i]=read();for(int i=0;i<n;i++) g[i][0].sum=g[i][0].mn=w[i]=read();for(int j=1;j<=t;j++)for(int i=0;i<n;i++){g[i][j].to=g[g[i][j-1].to][j-1].to;g[i][j].sum=g[i][j-1].sum+g[g[i][j-1].to][j-1].sum;g[i][j].mn=min(g[i][j-1].mn,g[g[i][j-1].to][j-1].mn);}for(int i=0;i<n;i++){long long s=0,x=k;int m=1e8,pos=i;for(int j=t;j>=0 && x;j--)if(x>=p[j]){x-=p[j];m=min(m,g[pos][j].mn);s+=g[pos][j].sum;pos=g[pos][j].to;}printf("%lld %d\n",s,m);}return 0;
}

JZOJ 100026. 【NOIP2017提高A组模拟7.7】图相关推荐

  1. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  2. JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation

    Description Input Output Sample Input 7 2 2343223 4 1 2234 Sample Output 2243233 2334 Data Constrain ...

  3. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  4. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  5. JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度

    Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...

  6. JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情

    Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...

  7. JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows

    Description Input Output Sample Input 5 3 1 4 5 2 3 4 3 4 1 Sample Output 5 Data Constraint Solution ...

  8. JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation

    Description 你有一个长度为n 的排列P 与一个正整数K 你可以进行如下操作若干次使得排列的字典序尽量小 对于两个满足|i-j|>=K 且|Pi-Pj| = 1 的下标i 与j,交换P ...

  9. JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph

    Description 给定一张n个点m条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通 你想在这张图上进行若干次旅游,每次旅游可以任选一个点x作为起点,再走到一个与x 直接有边相连的点y ...

最新文章

  1. Hyper-V 网卡 load failed
  2. element ui点击按钮弹出款_前端猿应该知道的十大最流行的前端UI框架
  3. 导出来的双引号怎么处理_阿里巴巴国际站图片处理小技巧
  4. vivo C/C++工程师视频面试总结 20180802
  5. Jar包冲突解决方法
  6. PPT写的好,升职加薪不会少-全套免费教程
  7. Google Drive 转存别人分享的文件到自己的网盘
  8. uniapp 最接近微信的图片压缩插件 Ba-ImageCompressor
  9. 二叉树的几个基本性质
  10. O2O模式为什么这么火
  11. python爬取美女_知乎大神用Python爬取高颜值美女(Python爬虫+人脸检测+颜值检测)...
  12. 【嵌入式04】用寄存器HAL库完成LED流水灯程序
  13. java加载顺序_类加载过程中几个重点执行顺序整理
  14. windows num_workers
  15. 使用余弦相似度算法计算文本相似度
  16. Python3快速入门-Python是什么
  17. 数字是有绝对值的,负数的绝对值是它本身取反,非负数的绝对值是它本身。 请定义一个方法,方法能够得到小数类型数字的绝对值并返回。 请定义方法并测试
  18. 存储技术现在的困境以及未来的发展
  19. 2023年浙江大学报考点硕士研究生报名网上确认公告
  20. IBus Pinyin 导入Sougou词库

热门文章

  1. 单层感知器应用实例--坐标点的二分类模式分类
  2. Maple 公式推导
  3. USTC English Club Note20171013(5)
  4. 【无标题】科大星云诗社动态20201206
  5. 科大星云诗社动态20201215
  6. [:zh]给机械课程设计的一封信[:] 2017-12-23
  7. 云炬Android开发笔记 2-1项目初始化
  8. 火爆 GitHub 的 16 张机器学习速查表,值得收藏!
  9. 台湾大学林轩田机器学习技法课程学习笔记5 -- Kernel Logistic Regression
  10. 计算广告 pdf_小学生PDF格式的试卷怎么编辑修改