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杭电多校 DOS Card(线段树)

2022杭电多校第二场 1001 Static Query on Tree虚树区间合并树剖线段树维护标记等四种做法

2022杭电多校第二场 1001 Static Query on Tree虚树区间合并树剖线段树维护标记等四种做法

2022杭电多校第二场 1001 Static Query on Tree虚树区间合并树剖线段树维护标记等四种做法

2019杭电多校二 L Longest Subarray (线段树)

2019杭电多校第六场hdu6638 Snowy Smile(线段树+枚举)