제출 #1361664

#제출 시각아이디문제언어결과실행 시간메모리
1361664Rawlat_vanak서열 (APIO23_sequence)C++20
19 / 100
583 ms64044 KiB
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define mod 1000000007
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back


struct lazymax{
	int n;
	vector<int> seg;
	vector<int> lazy;
	void build(int l, int r, int v){
		if(l==r){
			seg[v]=l;
		}else{
			int m=(l+r)/2;
			build(l,m,2*v);
			build(m+1,r,2*v+1);
			seg[v]=max(seg[2*v],seg[2*v+1]);
		}
	}

	void push(int v){
		lazy[2*v]+=lazy[v];
		lazy[2*v+1]+=lazy[v];
		seg[2*v]+=lazy[v];
		seg[2*v+1]+=lazy[v];
		lazy[v]=0;
	}

	void update(int l, int r, int v, int cl, int cr, int x){
		if(cl>cr){
			return;
		}
		if(l>r){
			return;
		}

		if(l==cl and r==cr){
			seg[v]+=x;
			lazy[v]+=x;
			return;
		}
		int m=(l+r)/2;
		push(v);
		update(l,m,2*v,cl,min(m,cr),x);
		update(m+1,r,2*v+1,max(m+1,cl),cr,x);
		seg[v]=max(seg[2*v],seg[2*v+1]);
	}

	int get(int l, int r, int v, int cl, int cr){
		if(cl>cr){
			return -1e9;
		}
		if(l>r){
			return -1e9;
		}
		if(l==cl and r==cr){
			return seg[v];
		}
		int m=(l+r)/2;
		push(v);
		return max(get(l,m,2*v,cl,min(cr,m)),get(m+1,r,2*v+1,max(cl,m+1),cr));
	}

	lazymax(int n){
		this->n=n;
		seg.clear();
		seg.resize(4*n+5);
		lazy.clear();
		lazy.resize(4*n+5);
		build(1,n,1);
	}

};

struct lazymin{
	int n;
	vector<int> seg;
	vector<int> lazy;
	void build(int l, int r, int v){
		if(l==r){
			seg[v]=l;
		}else{
			int m=(l+r)/2;
			build(l,m,2*v);
			build(m+1,r,2*v+1);
			seg[v]=min(seg[2*v],seg[2*v+1]);
		}
	}

	void push(int v){
		lazy[2*v]+=lazy[v];
		lazy[2*v+1]+=lazy[v];
		seg[2*v]+=lazy[v];
		seg[2*v+1]+=lazy[v];
		lazy[v]=0;
	}

	void update(int l, int r, int v, int cl, int cr, int x){
		if(cl>cr){
			return;
		}
		if(l>r){
			return;
		}

		if(l==cl and r==cr){
			seg[v]+=x;
			lazy[v]+=x;
			return;
		}
		int m=(l+r)/2;
		push(v);
		update(l,m,2*v,cl,min(m,cr),x);
		update(m+1,r,2*v+1,max(m+1,cl),cr,x);
		seg[v]=min(seg[2*v],seg[2*v+1]);
	}

	int get(int l, int r, int v, int cl, int cr){
		if(cl>cr){
			return 1e9;
		}
		if(l>r){
			return 1e9;
		}
		if(l==cl and r==cr){
			return seg[v];
		}
		int m=(l+r)/2;
		push(v);
		return min(get(l,m,2*v,cl,min(cr,m)),get(m+1,r,2*v+1,max(cl,m+1),cr));
	}

	lazymin(int n){
		this->n=n;
		seg.clear();
		seg.resize(4*n+5);
		lazy.clear();
		lazy.resize(4*n+5,0);
		build(1,n,1);
	}

};


int sequence(int n, vector<int> a){
	int ans=1;
	lazymax segmax(n);
	lazymin segmin(n);
	
	vector<vector<int>> indices(n+1,vector<int>());
	for(int i=0;i<n;i++){
		indices[a[i]].pb(i+1);
	}

	for(int i=1;i<=n;i++){
		/*for(int j:indices[i-1]){
			segmax.update(1,n,1,j,n,-1);
			segmin.update(1,n,1,j,n,-1);
		}
		for(int j:indices[i]){
			segmax.update(1,n,1,j,n,-1);
			segmin.update(1,n,1,j,n,-1);
		}*/
		if(indices[i].size()==0){
			continue;
		}
		if(indices[i].size()==1){
			continue;
		}



		vector<vector<int>> pl(2),pr(2),ql(2),qr(2); //0 is for 1111 and 1 is for -1-1-1-1
		for(int j=0;j<indices[i].size();j++){
			int bruh=indices[i][j];
			pl[0].pb(segmax.get(1,n,1,1,bruh-1));
			ql[0].pb(segmin.get(1,n,1,1,bruh-1));
			pr[0].pb(segmax.get(1,n,1,bruh,n));
			qr[0].pb(segmin.get(1,n,1,bruh,n));
			int zero=0;
			pl[0][j]=max(pl[0][j],zero);
			ql[0][j]=min(ql[0][j],zero);
		}

		for(int j:indices[i]){
			segmax.update(1,n,1,j,n,-2);
			segmin.update(1,n,1,j,n,-2);
		}
		for(int j=0;j<indices[i].size();j++){
			int bruh=indices[i][j];
			pl[1].pb(segmax.get(1,n,1,1,bruh-1));
			ql[1].pb(segmin.get(1,n,1,1,bruh-1));
			pr[1].pb(segmax.get(1,n,1,bruh,n));
			qr[1].pb(segmin.get(1,n,1,bruh,n));
			int zero=0;
			pl[1][j]=max(pl[1][j],zero);
			ql[1][j]=min(ql[1][j],zero);
		}



		int lo=0,hi=indices[i].size();
		while(lo<hi){
			int mid=(lo+hi+1)/2;
			bool flag=false;
			for(int j=0;j+mid<=indices[i].size();j++){
				if(pr[0][j+mid-1]>=ql[0][j] and qr[1][j+mid-1]<=pl[1][j]){
					flag=true;
				}
			}

			if(flag){
				lo=mid;
			}else{
				hi=mid-1;
			}
		}
		//cout<<lo<<'\n';
		ans=max(ans,lo);


		/*int cnt=1;
		int idx1=0;
		int idx2=0;
		int l=indices[i][idx1];
		int r=indices[i][idx2];
		cout<<l<<' '<<r<<" ok what\n";
		while(idx2<indices[i].size() and idx1<indices[i].size()){
			if(idx1>idx2){
				idx2=idx1;
			}
			l=indices[i][idx1];
			r=indices[i][idx2];
			int pl=segmax.get(1,n,1,1,l-1);
			int ql=segmin.get(1,n,1,1,l-1);
			int pr=segmax.get(1,n,1,r,n);
			int qr=segmin.get(1,n,1,r,n);
			int zero=0;
			pl=max(pl,zero);
			ql=min(ql,zero);
			cout<<pl<<' '<<ql<<' '<<pr<<' '<<qr<<" qerngoierng\n";

			while(pr-ql>=idx1-idx2-1 and qr-pl<=idx2-idx1+1 and idx2<indices[i].size()){
				cout<<pl<<' '<<ql<<' '<<pr<<' '<<qr<<" qerwhyyyyyyyyyngoierng\n";
				idx2++;
				if(idx2==indices[i].size()){
					break;
				}
				r=indices[i][idx2];
				cout<<idx1<<' '<<idx2<<' '<<r<<" what is happening1\n";
				pr=segmax.get(1,n,1,r,n);
				qr=segmin.get(1,n,1,r,n);
			}
			idx2--;
			r=indices[i][idx2];
			cout<<idx1<<' '<<idx2<<' '<<r<<" what is happening\n";
			pr=segmax.get(1,n,1,r,n);
			qr=segmin.get(1,n,1,r,n);

			cout<<l<<' '<<r<<" this works\n";
			ans=max(ans,idx2-idx1+1);
			idx1++;
			l=indices[i][idx1];
			cout<<idx1<<' '<<idx2<<" why is this not going in\n";

		}*/
	}

	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…