odt求优化
查看原帖
odt求优化
580202
Siegerkranz_2735楼主2024/7/20 16:37

tle on 6 12

#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r;
	mutable long long v;
	node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
	bool operator<(const node& o) const{
		return l<o.l;
	}
};
set<node> s;
int n,m;
#define IT set<node>::iterator
IT split(int pos){
	IT it=s.lower_bound(node(pos));
	if(it!=s.end()&&it->l==pos)return it;
	it--;
	int L=it->l,R=it->r;
	long long V=it->v;
	s.erase(it);
	s.insert(node(L,pos-1,V));
	return s.insert(node(pos,R,V)).first;
}
void assign(int l,int r,long long v){
	IT itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,v));
}
void add(int l,int r,long long v){
	IT itr=split(r+1),itl=split(l);
	for(IT it=itl;it!=itr;it++)it->v+=v;
}
void mul(int l,int r,long long v){
	IT itr=split(r+1),itl=split(l);
	for(IT it=itl;it!=itr;it++)it->v*=v;
}
int find(int l,int r){
	IT itr=split(r+1),itl=split(l);
	int ans=0;
	for(IT it=itl;it!=itr;it++){
		if(it->v==42||it->v==424||it->v==4242||it->v==42424||it->v==424242){
			ans+=(it->r-it->l+1);
		}
	}
	return ans;
}
int main(){
	cin>>n>>m;
	int L=1,R=1,pos=n,prew,w;scanf("%d",&prew);
	while(pos-->1) {
		scanf("%d",&w);
		if(w==prew){
			R++;continue;
		}
		s.insert(node(L,R,prew));
		L=++R;prew=w;
	}s.insert(node(L,R,prew));
	for(int i=1,opt,l,r,v;i<=m;i++){
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==4){
			printf("%d\n",find(l,r));
			continue;
		}
		scanf("%d",&v);
		if(opt==1)add(l,r,v);
		else if(opt==2)mul(l,r,v);
		else if(opt==3)assign(l,r,v);
	}
	return 0;
}
2024/7/20 16:37
加载中...