2022杭电多校 DOS Card(线段树)
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022杭电多校 DOS Card(线段树)相关的知识,希望对你有一定的参考价值。
DOS Card
答案只会存在情况 + + - - 或 + - + -
考虑转移
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define yes cout<<"Yes\\n"
#define no cout<<"No\\n"
#define yesno if(fg)yes;else no;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=1e18;
const int maxn=2e5+100;
struct node
int l,r;
int s1100,s1010;
int s110,s100,s101,s010;
int s11,s10,s00,s01;
int s1,s0;
t[maxn*4];
int a[maxn];
void push_up(node &u,const node &l,const node &r)
// if(u.l==u.r)return ;
// auto &u=t[k];
// auto &l=t[k<<1];
// auto &r=t[k<<1|1];
u.s0=max(l.s0,r.s0);
u.s1=max(l.s1,r.s1);
u.s11=max(l.s11,r.s11,l.s1+r.s1);
u.s10=max(l.s10,r.s10,l.s1+r.s0);
u.s00=max(l.s00,r.s00,l.s0+r.s0);
u.s01=max(l.s01,r.s01,l.s0+r.s1);
u.s110=max(l.s110,r.s110,l.s1+r.s10,l.s11+r.s0);
u.s100=max(l.s100,r.s100,l.s1+r.s00,l.s10+r.s0);
u.s101=max(l.s101,r.s101,l.s1+r.s01,l.s10+r.s1);
u.s010=max(l.s010,r.s010,l.s0+r.s10,l.s01+r.s0);
u.s1100=max(l.s1100,r.s1100,l.s1+r.s100,l.s11+r.s00,l.s110+r.s0);
u.s1010=max(l.s1010,r.s1010,l.s1+r.s010,l.s10+r.s10,l.s101+r.s0);
void build(int l,int r,int k)
t[k].l=l;
t[k].r=r;
t[k].s1100=t[k].s1010=t[k].s110=t[k].s100=t[k].s101=t[k].s010=t[k].s11=t[k].s10=t[k].s00=t[k].s01=t[k].s1=t[k].s0=-inf;
if(l==r)
t[k].s0=-a[l]*a[l];
t[k].s1=a[l]*a[l];
return ;
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
push_up(t[k],t[k<<1],t[k<<1|1]);
node query(int l,int r,int k)
if(r<t[k].l||l>t[k].r)return 0,0,-inf,-inf,-inf,-inf,-inf,-inf,-inf,-inf,-inf,-inf,-inf,-inf;
if(l<=t[k].l&&t[k].r<=r)
return t[k];
node sl=query(l,r,k<<1);
node sr=query(l,r,k<<1|1);
node now;
now.l=sl.l,now.r=sr.r;
push_up(now,sl,sr);
return now;
signed main()
IOS
int tt;
cin>>tt;
while(tt--)
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>a[i];
build(1,n,1);
while(m--)
int l,r;
cin>>l>>r;
node ans=query(l,r,1);
cout<<max(ans.s1100,ans.s1010)<<"\\n";
build(1,n,1);
以上是关于2022杭电多校 DOS Card(线段树)的主要内容,如果未能解决你的问题,请参考以下文章
2022杭电多校第二场 1001 Static Query on Tree虚树区间合并树剖线段树维护标记等四种做法
2022杭电多校第二场 1001 Static Query on Tree虚树区间合并树剖线段树维护标记等四种做法
2022杭电多校第二场 1001 Static Query on Tree虚树区间合并树剖线段树维护标记等四种做法