luoguP2572 [SCOI2010]序列操作

…差不多写了3个小时吧。。。。

嘛其实没什么思维,主要是一些套路的结合。。。
但是还是有一定的编写难度的(5.7k)可想而知

#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;

int n,m;
int a[MAXN * 4],l1[MAXN * 4],l2[MAXN * 4];
int x,y,k;

struct node{
	int lx,rx,mx;
}t1[MAXN * 4] , t2[MAXN * 4];

void update1(int rt , int l , int r){//ά»¤Ò»¶Î1µÄ×£¬ 
	int mid = (l + r) >> 1;
	t1[rt].lx = t1[rt << 1].lx;
	if(a[rt << 1] == mid - l + 1)t1[rt].lx = t1[rt << 1].lx + t1[(rt << 1) | 1].lx;
	t1[rt].rx = t1[(rt << 1) | 1].rx;
	if(a[(rt << 1) | 1] == r - mid)t1[rt].rx = t1[(rt << 1) | 1].rx + t1[rt << 1].rx;
	t1[rt].mx = max(t1[rt << 1].mx , t1[(rt << 1) | 1].mx);
	t1[rt].mx = max(t1[rt].mx , t1[rt << 1].rx + t1[(rt << 1) | 1].lx);
}

void update2(int rt , int l , int r){//ά»¤Ò»¶Î1µÄ×£¬ 
	int mid = (l + r) >> 1;
	t2[rt].lx = t2[rt << 1].lx;
	if(t2[rt << 1].lx == mid - l + 1)t2[rt].lx = t2[rt << 1].lx + t2[(rt << 1) | 1].lx;
	t2[rt].rx = t2[(rt << 1) | 1].rx;
	if(t2[(rt << 1) | 1].rx == r - mid)t2[rt].rx = t2[(rt << 1) | 1].rx + t2[rt << 1].rx;
	t2[rt].mx = max(t2[rt << 1].mx , t2[(rt << 1) | 1].mx);
	t2[rt].mx = max(t2[rt].mx , t2[rt << 1].rx + t2[(rt << 1) | 1].lx);
}

void build(int rt , int l , int r){
	l1[rt] = -1;
	l2[rt] = 0;
	if(l == r){
		cin>>a[rt];
		if(a[rt] == 0)t2[rt].lx = t2[rt].rx = t2[rt].mx = 1;
		else t1[rt].lx = t1[rt].rx = t1[rt].mx = 1;
		return;
	}
	int mid = (l + r) >> 1;
	build(rt << 1 , l , mid);
	build((rt << 1) | 1 , mid + 1 , r);
	a[rt] = a[rt << 1] + a[(rt << 1) | 1];
	update1(rt , l , r);
	update2(rt , l , r);
	return;
}

void push_down(int rt , int l , int r){
	int mid = (l + r) >> 1;
	if(l1[rt] == (-1) && l2[rt] == 0)return;
	else if(l1[rt] == (-1) && l2[rt] == 1){
		a[rt << 1] = (mid - l + 1) - a[rt << 1] , a[(rt << 1) | 1] = (r - mid) - a[(rt << 1) | 1];
		
		if(l1[rt << 1] != (-1))l1[rt << 1] = (l1[rt << 1] + 1) % 2;
		else l2[rt << 1] = (l2[rt << 1] + 1) % 2;
		if(l1[(rt << 1) | 1] != (-1))l1[(rt << 1) | 1] = (l1[(rt << 1) | 1] + 1) % 2;
		else l2[(rt << 1) | 1] = (l2[(rt << 1) | 1] + 1) % 2;
		
		swap(t1[rt << 1].mx , t2[rt << 1].mx);swap(t1[rt << 1].lx , t2[rt << 1].lx);swap(t1[rt << 1].rx , t2[rt << 1].rx);
		swap(t1[(rt << 1) | 1].mx , t2[(rt << 1) | 1].mx);swap(t1[(rt << 1) | 1].lx , t2[(rt << 1) | 1].lx);swap(t1[(rt << 1) | 1].rx , t2[(rt << 1) | 1].rx);
	}
	else if(l1[rt] == 0){
		a[rt << 1] = 0 , a[(rt << 1) | 1] = 0;	
		t1[rt << 1].lx = t1[(rt << 1) | 1].lx = t1[rt << 1].rx = t1[(rt << 1) | 1].rx = t1[rt << 1].mx = t1[(rt << 1) | 1].mx = 0;
		t2[rt << 1].lx = t2[rt << 1].rx = t2[rt << 1].mx = mid - l + 1;
		t2[(rt << 1) | 1].lx = t2[(rt << 1) | 1].rx = t2[(rt << 1) | 1].mx = r - mid;
		
		l1[rt << 1] = l1[(rt << 1) | 1] = 0;
		l2[rt << 1] = l2[(rt << 1) | 1] = 0;
		
	}
	else if(l1[rt] == 1){
		a[rt << 1] = mid - l + 1 , a[(rt << 1) | 1] = r - mid;	
		t2[rt << 1].lx = t2[(rt << 1) | 1].lx = t2[rt << 1].rx = t2[(rt << 1) | 1].rx = t2[rt << 1].mx = t2[(rt << 1) | 1].mx = 0;
		t1[rt << 1].lx = t1[rt << 1].rx = t1[rt << 1].mx = mid - l + 1;
		t1[(rt << 1) | 1].lx = t1[(rt << 1) | 1].rx = t1[(rt << 1) | 1].mx = r - mid;
		
		l1[rt << 1] = l1[(rt << 1) | 1] = 1;
		l2[rt << 1] = l2[(rt << 1) | 1] = 0;
	}
	l1[rt] = -1;
	l2[rt] = 0;
}

void add1(int rt , int  l , int r){//°Ñx -- yÇø¼ä±äΪ0 
	if(r < x || l > y)return;
	if(x <= l && r <= y){
		a[rt] = l1[rt] = 0;
		t1[rt].lx = t1[rt].rx = t1[rt].mx = 0;
		t2[rt].lx = t2[rt].rx = t2[rt].mx = r - l + 1;
		return;
	}
	push_down(rt , l , r);
	int mid = (l + r) >> 1;
	add1(rt << 1 , l , mid);
	add1((rt << 1) | 1 , mid + 1 , r);
	a[rt] = a[rt << 1] + a[(rt << 1) | 1];
	update1(rt , l , r);
	update2(rt , l , r);
	return; 
}

void add2(int rt , int l , int r){//°Ñx -- yÇø¼ä±äΪ1 
	if(r < x || l > y)return;
	if(x <= l && r <= y){
		a[rt] = r - l + 1;
		t1[rt].lx = t1[rt].rx = t1[rt].mx = r - l + 1;
		t2[rt].lx = t2[rt].rx = t2[rt].mx = 0;
		l1[rt] = 1;
		return;
	}
	push_down(rt , l , r);
	int mid = (l + r) >> 1;
	add2(rt << 1 , l , mid);
	add2((rt << 1) | 1 , mid + 1 , r);
	a[rt] = a[rt << 1] + a[(rt << 1) | 1];
	update1(rt , l , r);
	update2(rt , l , r);
	return; 
}

void add3(int rt , int l , int r){
	if(r < x || l > y)return;
	if(x <= l && r <= y){
		a[rt] = (r - l + 1) - a[rt];
		if(l1[rt] != (-1))l1[rt] = (l1[rt] + 1) % 2;
		else l2[rt] = (l2[rt] + 1) % 2;
		swap(t1[rt] , t2[rt]);
		return;
	}
	push_down(rt , l , r);
	int mid = (l + r) >> 1;
	add3(rt << 1 , l , mid);
	add3((rt << 1) | 1 , mid + 1 , r);
	a[rt] = a[rt << 1] + a[(rt << 1) | 1];
	update1(rt , l , r);
	update2(rt , l , r);
	return; 
}

int que(int rt , int l , int r){
	if(r < x || l > y)return 0;
	if(x <= l && r <= y)return a[rt];
	push_down(rt , l , r);
	int mid = (l + r) >> 1 , zz = 0;
	zz += que(rt << 1 , l , mid);
	zz += que((rt << 1) | 1 , mid + 1 , r);
	return zz; 
}

node up(int rt , int  l , int r){
	if(r < x || l > y)return (node){0 , 0 , 0};
	if(x <= l && r <= y)return t1[rt];
	int mid = (l + r) >> 1 , zz = 0;
	node ans1 , ans2 , ans3;
	push_down(rt , l , r);
	ans1 = up(rt << 1 , l , mid);
	ans2 = up((rt << 1) | 1 , mid + 1 , r);
	ans3.lx = ans1.lx;
	if(ans1.lx == mid - l + 1)ans3.lx = mid - l + 1 + ans2.lx;
	ans3.rx = ans2.rx;
	if(ans2.rx == r - mid)ans3.rx = r - mid + ans1.rx;
	ans3.mx = max(ans1.mx , ans2.mx);
	ans3.mx = max(ans3.mx , ans1.rx + ans2.lx);
	return ans3;
}

int main(){
	cin>>n>>m;
	build(1 , 1 , n);
	for(int i = 1 ; i <= m ;i++){
		cin>>k>>x>>y;	
		x++;
		y++;
		if(k == 0)add1(1 , 1 , n);
		if(k == 1)add2(1 , 1 , n);
		if(k == 2)add3(1 , 1 , n);
		if(k == 3)cout<<que(1 , 1 , n)<<endl;
		if(k == 4){
			node ans = up(1 , 1, n);
			cout<<max(ans.mx , max(ans.lx , ans.rx))<<endl;
		}
		x = 1 , y = n;
	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值