题解

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

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

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

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

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

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

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

新加的一列三个边全连上

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

连上横着的两条边

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 60005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int64 a[2][MAXN],b[MAXN];
int N,M;
struct Matrix {
int64 f[2][2];
Matrix() {
for(int i = 0 ; i < 2 ; ++i) for(int j = 0 ; j < 2 ; ++j) f[i][j] = 1e10;
}
friend Matrix operator * (const Matrix &a,const Matrix &b) {
Matrix c;
for(int i = 0 ; i < 2 ; ++i) {
for(int j = 0 ; j < 2 ; ++j) {
for(int k = 0 ; k < 2 ; ++k) {
c.f[i][j] = min(c.f[i][j],a.f[i][k] + b.f[k][j]);
}
}
}
return c;
}
};
struct node {
int l,r;Matrix m;
}tr[MAXN * 4];
void update(int u) {
tr[u].m = tr[u << 1].m * tr[u << 1 | 1].m;
}
Matrix Calc(int c) {
Matrix res;
res.f[0][1] = min(a[0][c - 1],a[1][c - 1]);
res.f[0][0] = min(a[0][c - 1] + a[1][c - 1],b[c] + min(a[0][c - 1],a[1][c - 1]));
res.f[1][0] = a[0][c - 1] + a[1][c - 1] + b[c];
res.f[1][1] = a[0][c - 1] + a[1][c - 1];
return res;
}
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;
if(l == r) {
tr[u].m = Calc(l);
return;
}
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
update(u);
}
void Change(int u,int pos) {
if(tr[u].l == tr[u].r) {tr[u].m = Calc(pos);return;}
int mid = (tr[u].l + tr[u].r) >> 1;
if(pos <= mid) Change(u << 1,pos);
else Change(u << 1 | 1,pos);
update(u);
}
Matrix Query(int u,int l,int r) {
if(tr[u].l == l && tr[u].r == r) return tr[u].m;
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) return Query(u << 1,l,r);
else if(l > mid) return Query(u << 1 | 1,l,r);
else return Query(u << 1,l,mid) * Query(u << 1 | 1,mid + 1,r);
}
void Init() {
read(N);read(M);
for(int i = 0 ; i <= 1 ; ++i) {
for(int j = 1 ; j < N ; ++j) {
read(a[i][j]);
}
}
for(int j = 1 ; j <= N ; ++j) {
read(b[j]);
}
build(1,1,N);
}
void Solve() {
char op[5];
int l,r;int x0,y0,x1,y1;
int64 w;
for(int i = 1 ; i <= M ; ++i) {
scanf("%s",op + 1);
if(op[1] == 'Q') {
read(l);read(r);
if(l == r) {out(b[l]);enter;}
else {
Matrix t = Query(1,l + 1,r);
out(min(t.f[1][0],b[l] + t.f[0][0]));enter;
}
}
else {
read(x0);read(y0);read(x1);read(y1);read(w);
if(x0 == x1) {
if(y0 > y1) swap(y0,y1);
a[x0 - 1][y0] = w;
Change(1,y1);
}
else {
b[y0] = w;
Change(1,y0);
}
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

最新文章

  1. 用scikit-learn学习K-Means聚类
  2. .NET 实现并行的几种方式(四)
  3. Android ADB 命令大全
  4. &lt;转&gt;SQL语句大全
  5. Android开发--EditText的应用
  6. Android R文件相关问题
  7. 禁止在 .NET Framework 中执行用户代码。启用 &quot;clr enabled&quot; 配置选项
  8. oh-my-zsh配置你的zsh提高shell逼格终极选择
  9. C#学习笔记(第1周作业)
  10. [Java]HashMap的两种排序方式
  11. Web桌面应用框架2:著名的WEB桌面应用分析
  12. Beta版测试报告
  13. Classification Truth Table
  14. day21 正则表达式
  15. 解决node使用中8080端口被占用
  16. 【maven】maven查看项目依赖并解决依赖冲突的问题
  17. mybatis入门--mybatis和hibernate比较
  18. js实现多标签页效果
  19. MySQL基础值 存储过程和函数
  20. 【Hadoop】大数据时代,我们为什么使用hadoop

热门文章

  1. 从零开始编写自己的C#框架(23)——上传组件使用说明
  2. web app开发利器 - iscroll4 解决方案
  3. Java 虚拟机
  4. 拓扑排序 - 并查集 - Rank of Tetris
  5. centos7 使用systemd 自定义关机前脚本
  6. TCP和UDP的135、137、138、139、445端口的作用
  7. 在C++中调用DLL中的函数 (3)
  8. HDU 5360 Hiking 登山 (优先队列,排序)
  9. css3选择器笔记
  10. Struts2中的session、request、respsonse获取方法
  11. OSX 10.8+下开启Web 共享 的方法
  12. C#设计模式之二十二访问者模式(Visitor Pattern)【行为型】
  13. c#学习笔记 day_one
  14. 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出
  15. CNN:Channel与Core的高H、宽W的权值理解
  16. 复旦大学2017--2018学年第二学期高等代数II期末考试情况分析
  17. Linux——高效玩转命令行
  18. VS2019正式版注册码秘钥
  19. 【Gym - 100947G】Square Spiral Search
  20. 如何创建线程第一种继承Thread类