题意:
一段路有n个点,每个点有一个合法区间[ui,vi],然后相邻两点之间有一个长度,问从i出发,走到j,是否使能经过每个点。有两种修改操作,修改合法区间[ui,vi],相邻点之间的长度。
题解:
- 根据题意:我们可知如果能到达下一个点的话, m a x ( u [ i ] + c o s [ i ] , u [ i + 1 ] ) < = v [ i + 1 ] max(u[i] + cos[i], u[i+1]) <= v[i+1] max(u[i]+cos[i],u[i+1])<=v[i+1]
- 我们根据上一条我们就可以维护出线段树两点之间的合并,维护可行u的最大值以及,可行v的最小值
code
/*
* @Author: 0iq
* @LastEditTime: 2021-07-22 18:04:50
* @优快云 blog: https://blog.youkuaiyun.com/acm_durante
* @E-mail: 1055323152@qq.com
* @ProbTitle:
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 50;
struct node
{
int u, v, cos;
} t[N << 2];
int u[N], v[N], w[N];
int n, m, T;
int op,x,y,z;
node tmp;
node merge(node a,node b,int mid){
node res = {0,0,0};
res.cos = a.cos + b.cos + w[mid];
res.u = max(a.u+b.cos+w[mid],b.u);//
res.v = min(a.v,b.v-w[mid]-a.cos);
if(a.u + w[mid] > b.v)
res.v = -1e9;
return res;
}
void build(int l,int r,int p){
t[p] = {0,0,0};
if(l == r){
t[p] = {u[l],v[l],0};
return;
}
int mid = l + r >> 1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
t[p] = merge(t[p<<1],t[p<<1|1],mid);
}
void up(int l,int r,int p,int pos){
if(l == r){
t[p] = {u[l],v[l],0};
return;
}
int mid = l + r >> 1;
if(pos <= mid)
up(l,mid,p<<1,pos);
else
up(mid+1,r,p<<1|1,pos);
t[p] = merge(t[p<<1],t[p<<1|1],mid);
}
node ask(int l,int r,int p,int al,int ar){
if(al <= l && r <= ar){
return t[p];
}
int mid = l + r >> 1;
if (mid < al)
return ask(mid+1, r, p << 1 | 1,al, ar);
if (mid >= ar)
return ask(l , mid, p << 1, al, ar);
return merge(ask(l , mid, p << 1, al, ar), ask(mid+1, r, p << 1 | 1,al, ar),mid);
}
void solve()
{
cin >> n;
for(int i = 1; i <= n ; i++) cin >> u[i];
for(int i = 1; i <= n ; i++) cin >> v[i];
for(int i = 1; i < n ; i++) cin >> w[i];
build(1,n,1);
cin >> m;
while(m--){
cin >> op >> x >> y;
if(op == 0){
tmp = ask(1,n,1,x,y);
if(tmp.v < 0) cout << "No\n";
else cout << "Yes\n";
}
else if(op == 1){
w[x] = y;
up(1,n,1,x);
}
else if(op == 2){
cin >> z;
u[x] = y;
v[x] = z;
up(1,n,1,x);
}
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> T;
while (T--)
{
solve();
}
return 0;
}