珂朵莉树求调(玄关)(subtask#1已过)
查看原帖
珂朵莉树求调(玄关)(subtask#1已过)
925818
hjhAKIOI楼主2024/8/17 19:33

hack 数据 AC 了,不知道为啥 RE QAQ

评测记录

(个人感觉码风还好

#include<iostream>
#include<set>
using namespace std;
const int N=1e5+5;
int n,q;
int a[N];

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c-'0');
		c=getchar();
	}
	return x*f;
}

struct node{
	int l,r;
	mutable int v;
	bool operator<(const node &o)const{
		return l<o.l;
	}
};

set<node> t;

auto split(int m){
	if(m>n){
		return t.end();
	}
	auto it=t.upper_bound({m,0,0});
	it--;
	if(it->l==m){
		return it;
	}
	int l=it->l,r=it->r,v=it->v;
	t.erase(it);
	t.insert({l,m-1,v});
	return t.insert({m,r,v}).first;
}

void Merge(){
	for(auto it=t.begin();it!=t.end();it++){
		int l=it->l,r,v=it->v;
		auto itl=it;
		while(it->v==v){
			it++;
		}
		auto itr=it;
		it--;
		r=it->r;
//		cout<<l<<' '<<r<<' '<<v<<endl;
		t.erase(itl,itr);
		t.insert({l,r,v});
	}
}

void assign(int l,int r,int v){
	auto itr=split(r+1),itl=split(l);
	t.erase(itl,itr);
	t.insert({l,r,v});
}

void change(int l,int r){
	auto itr=split(r+1),itl=split(l);
	for(;itl!=itr;itl++){
//		cout<<itl->l<<' '<<itl->r<<' '<<itl->v<<endl;
		itl->v=itl->v^1;
	}
}

int ask_cnt(int l,int r){
	auto itr=split(r+1),itl=split(l);
	int cnt=0;
	for(;itl!=itr;itl++){
//		cout<<itl->l<<' '<<itl->r<<' '<<itl->v<<endl;
		if(itl->v){
			cnt+=itl->r-itl->l+1;
		}
	}
	return cnt;
}

int ask_max(int l,int r){
	auto itr=split(r+1),itl=split(l);
	int res=0;
	for(;itl!=itr;itl++){
//		cout<<itl->l<<' '<<itl->r<<' '<<itl->v<<endl;
		if(itl->v){
			res=max(res,itl->r-itl->l+1);
		}
	}
	return res;
}

int main(){
	n=read();
	q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<=n;i++){
		int j=i;
		while(a[j+1]==a[i]&&j<=n){
			j++;
		}
		t.insert({i,j,a[i]});
//		cout<<i<<' '<<j<<' '<<a[i]<<endl;
		i=j;
	}
	while(q--){
		int op=read(),l=read(),r=read();
		l++;
		r++;
		if(op<=1){
			assign(l,r,op);
		}
		if(op==2){
			change(l,r);
		}
		if(op==3){
			cout<<ask_cnt(l,r)<<endl;
		}
		if(op==4){
			cout<<ask_max(l,r)<<endl;
		}
		Merge();
	}
	return 0;
}
2024/8/17 19:33
加载中...