[CF1814E] Chain Chips 题解
aeiouaoeiu · · 题解
由于操作完必须形成一个排列,于是每条边必须被操作偶数次,否则这条边左右不能平衡。
进一步发现,每条边最多操作
于是一条边只有选和不选两种情况,要求不能有连续两条边不选,代价为选的边的边权之和
考虑修改,显然转移形如
时间复杂度
::::info[code]
#include<bits/stdc++.h>
#define pb emplace_back
#define pob pop_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ll maxn=200007,ee=1e18;
ll n,q,a[maxn];
void ups(ll &a,ll b){a=min(a,b);}
struct Matrix{
ll a[2][2];
Matrix(void){memset(a,0x3f,sizeof(a));}
void fill(ll x){a[0][1]=a[1][1]=x,a[1][0]=0;}
Matrix operator*(Matrix &o){
Matrix res;
for(ll i=0;i<=1;i++)for(ll j=0;j<=1;j++){
for(ll k=0;k<=1;k++) ups(res.a[i][j],a[i][k]+o.a[k][j]);
}
return res;
}
void op(void){
cout<<a[0][0]<<" "<<a[0][1]<<"\n";
cout<<a[1][0]<<" "<<a[1][1]<<"\n\n";
}
};
struct Tree{
Matrix val[maxn<<2];
void build(ll l,ll r,ll rt){
if(l==r){
val[rt].fill(a[l]);
if(l==n-1||l==1) val[rt].a[1][0]=ee;
return;
}
ll mid=(l+r)>>1;
build(l,mid,rt<<1),build(mid+1,r,rt<<1|1);
val[rt]=val[rt<<1]*val[rt<<1|1];
}
void modify(ll l,ll r,ll x,ll z,ll rt){
if(l==r){
val[rt].fill(z);
if(l==n-1||l==1) val[rt].a[1][0]=ee;
return;
}
ll mid=(l+r)>>1;
if(x<=mid) modify(l,mid,x,z,rt<<1);
else modify(mid+1,r,x,z,rt<<1|1);
val[rt]=val[rt<<1]*val[rt<<1|1];
}
}tree;
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(ll i=1;i<n;i++) cin>>a[i];
tree.build(1,n-1,1);
cin>>q;
for(ll i=1,x,y;i<=q;i++){
cin>>x>>y;
tree.modify(1,n-1,x,y,1);
Matrix res=tree.val[1];
cout<<res.a[0][1]*2<<"\n";
}
return 0;
}
::::