题解

就是线段树维护一下转移矩阵

分成两种情况,一种是前面有两个联通块,一种是前面有一个联通块

从一个联通块转移到一个联通块

也就是新加一列的三个边选其中两条即可

从一个联通块转移到两个联通块

不连竖着的那条边,横着的两条边转移一条短的即可

从两个联通块转移到一个联通块

新加的一列三个边全连上

从两个联通块转移到两个联通块

连上横着的两条边

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define pdi pair<db,int>
  6. #define mp make_pair
  7. #define pb push_back
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. #define eps 1e-8
  11. #define mo 974711
  12. #define MAXN 60005
  13. //#define ivorysi
  14. using namespace std;
  15. typedef long long int64;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;char c = getchar();T f = 1;
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 + c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. int64 a[2][MAXN],b[MAXN];
  39. int N,M;
  40. struct Matrix {
  41. int64 f[2][2];
  42. Matrix() {
  43. for(int i = 0 ; i < 2 ; ++i) for(int j = 0 ; j < 2 ; ++j) f[i][j] = 1e10;
  44. }
  45. friend Matrix operator * (const Matrix &a,const Matrix &b) {
  46. Matrix c;
  47. for(int i = 0 ; i < 2 ; ++i) {
  48. for(int j = 0 ; j < 2 ; ++j) {
  49. for(int k = 0 ; k < 2 ; ++k) {
  50. c.f[i][j] = min(c.f[i][j],a.f[i][k] + b.f[k][j]);
  51. }
  52. }
  53. }
  54. return c;
  55. }
  56. };
  57. struct node {
  58. int l,r;Matrix m;
  59. }tr[MAXN * 4];
  60. void update(int u) {
  61. tr[u].m = tr[u << 1].m * tr[u << 1 | 1].m;
  62. }
  63. Matrix Calc(int c) {
  64. Matrix res;
  65. res.f[0][1] = min(a[0][c - 1],a[1][c - 1]);
  66. res.f[0][0] = min(a[0][c - 1] + a[1][c - 1],b[c] + min(a[0][c - 1],a[1][c - 1]));
  67. res.f[1][0] = a[0][c - 1] + a[1][c - 1] + b[c];
  68. res.f[1][1] = a[0][c - 1] + a[1][c - 1];
  69. return res;
  70. }
  71. void build(int u,int l,int r) {
  72. tr[u].l = l;tr[u].r = r;
  73. if(l == r) {
  74. tr[u].m = Calc(l);
  75. return;
  76. }
  77. int mid = (l + r) >> 1;
  78. build(u << 1,l,mid);
  79. build(u << 1 | 1,mid + 1,r);
  80. update(u);
  81. }
  82. void Change(int u,int pos) {
  83. if(tr[u].l == tr[u].r) {tr[u].m = Calc(pos);return;}
  84. int mid = (tr[u].l + tr[u].r) >> 1;
  85. if(pos <= mid) Change(u << 1,pos);
  86. else Change(u << 1 | 1,pos);
  87. update(u);
  88. }
  89. Matrix Query(int u,int l,int r) {
  90. if(tr[u].l == l && tr[u].r == r) return tr[u].m;
  91. int mid = (tr[u].l + tr[u].r) >> 1;
  92. if(r <= mid) return Query(u << 1,l,r);
  93. else if(l > mid) return Query(u << 1 | 1,l,r);
  94. else return Query(u << 1,l,mid) * Query(u << 1 | 1,mid + 1,r);
  95. }
  96. void Init() {
  97. read(N);read(M);
  98. for(int i = 0 ; i <= 1 ; ++i) {
  99. for(int j = 1 ; j < N ; ++j) {
  100. read(a[i][j]);
  101. }
  102. }
  103. for(int j = 1 ; j <= N ; ++j) {
  104. read(b[j]);
  105. }
  106. build(1,1,N);
  107. }
  108. void Solve() {
  109. char op[5];
  110. int l,r;int x0,y0,x1,y1;
  111. int64 w;
  112. for(int i = 1 ; i <= M ; ++i) {
  113. scanf("%s",op + 1);
  114. if(op[1] == 'Q') {
  115. read(l);read(r);
  116. if(l == r) {out(b[l]);enter;}
  117. else {
  118. Matrix t = Query(1,l + 1,r);
  119. out(min(t.f[1][0],b[l] + t.f[0][0]));enter;
  120. }
  121. }
  122. else {
  123. read(x0);read(y0);read(x1);read(y1);read(w);
  124. if(x0 == x1) {
  125. if(y0 > y1) swap(y0,y1);
  126. a[x0 - 1][y0] = w;
  127. Change(1,y1);
  128. }
  129. else {
  130. b[y0] = w;
  131. Change(1,y0);
  132. }
  133. }
  134. }
  135. }
  136. int main() {
  137. #ifdef ivorysi
  138. freopen("f1.in","r",stdin);
  139. #endif
  140. Init();
  141. Solve();
  142. }

【LOJ】#2186. 「SDOI2015」道路修建的更多相关文章

  1. 【LOJ】#2445. 「NOI2011」道路修建

    题解 看完题目我的第一个反应是--要求最小花费的方案?!怎么求??? 然后我把题读完了.好吧. 记录一下size就行,比NOIP普及组还要不如的题= = 代码 #include <iostrea ...

  2. LOJ #2183「SDOI2015」序列统计

    有好多好玩的知识点 LOJ 题意:在集合中选$ n$个元素(可重复选)使得乘积模$ m$为$ x$,求方案数对$ 1004535809$取模 $ n<=10^9,m<=8000且是质数,集 ...

  3. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  4. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

随机推荐

  1. 51nod 1463 找朋友 (扫描线+线段树)

    1463 找朋友  基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次询 ...

  2. pandas read_csv 读取中文列标题文件报错

    Traceback (most recent call last): File "C:/Users/arron/PycharmProjects/ML/ML/test.py", li ...

  3. 【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)

    [BZOJ1488][HNOI2009]图的同构(Burside引理,Polya定理) 题面 BZOJ 洛谷 题解 求本质不同的方案数,很明显就是群论这套理论了. 置换一共有\(n!\)个,考虑如何对 ...

  4. 【BZOJ1293】[SCOI2009]生日礼物(单调队列)

    [BZOJ1293][SCOI2009]生日礼物(单调队列) 题面 BZOJ 洛谷 题解 离散之后随便拿单调队列维护一下就好了. #include<iostream> #include&l ...

  5. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

  6. mysql主主同步设置

    mysql主主同步设置 主主同步设置是同等的地位,所以以下操作在两台机器上都需要进行而且操作是相同的. 服务器 服务器代号 IP hostname A 192.168.70.128 Debian1 B ...

  7. es7----proxy

    proxy是代理的意思,es7新增这个可以代理某个变量的“增删改查”,vue的核心原理就是这个~~ 基本使用方法: let json = {a: 123, c: 999} let p = new Pr ...

  8. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...

  9. 安装R和Rstudio

    安装R和Rstudio 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装R编程语言 1.登录下载网站 https://cran.r-project.org/ 2.点击下载链 ...

  10. Linux通过ssh登录其他服务器,不用输入密码

    有A(192.168.10.163)和B(192.168.10.164)两台服务器,为了使A服务器通过SSH连接B服务器时,免密登录,做以下操作. 1. 登录A(192.168.10.163)服务器( ...