답안 #202520

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
202520 2020-02-16T20:17:31 Z vanic Nekameleoni (COCI15_nekameleoni) C++14
28 / 140
3000 ms 108664 KB
#include <iostream>
#include <cstdio>
#include <math.h>
#include <vector>
#include <set>
#include <algorithm>
#include <queue>
#include <array>

using namespace std;

const int maxn=1e5+5, Log=17, pot=(1<<Log);
const int inf=1e9;

struct tournament1{
	pair < int, int > t[pot*2];
	tournament1(){
		for(int i=0; i<pot*2; i++){
			t[i]={inf, -inf};
		}
	}
	void update(int x, int val){
		t[x]={val, val};
		for(x/=2; x>0; x/=2){
			t[x].first=min(t[x*2].first, t[x*2+1].first);
			t[x].second=max(t[x*2].second, t[x*2+1].second);
		}
	}
	void reset(int x){
		t[x]={inf, -inf};
		for(x/=2; x>0; x/=2){
			t[x].first=min(t[x*2].first, t[x*2+1].first);
			t[x].second=max(t[x*2].second, t[x*2+1].second);
		}
	}
	int query(int L, int D, int x, int l, int d, bool p){
		if(L>=l && D<=d){
			if(p){
				return t[x].second;
			}
			else{
				return t[x].first;
			}
		}
		int lijeva, desna;
		if(p){
			lijeva=-inf;
			desna=-inf;
		}
		else{
			lijeva=inf;
			desna=inf;
		}
		if((L+D)/2>=l){
			lijeva=query(L, (L+D)/2, x*2, l, d, p);
		}
		if((L+D)/2+1<=d){
			desna=query((L+D)/2+1, D, x*2+1, l, d, p);
		}
		if(p){
			return max(lijeva, desna);
		}
		else{
			return min(lijeva, desna);
		}
	}
};

struct tournament2{
	pair < int, int > t[pot*2];
	pair < int, int > t1[pot*2];
	int prop[pot*2];
	bool jesam[pot*2];
	tournament2(){
		for(int i=0; i<pot*2; i++){
			t[i]={-inf, inf};
			t1[i]={inf, -inf};
		}
	}
	void propagate(int x, int L){
		if(jesam[x]){
			t[x]={prop[x], L};
			t1[x]={prop[x], prop[x]};
			if(x<pot){
				jesam[x*2]=1;
				jesam[x*2+1]=1;
				prop[x*2]=prop[x];
				prop[x*2+1]=prop[x];
			}
			jesam[x]=0;
		}
	}
	void update(int x, pair < int, int > val){
		int br=0, x1=x;
		while(x1<pot){
			x1*=2;
			br++;
		}
//		cout << "Update " << x-pot << " " << val.first << endl;
		propagate(x, x1-pot);
		t[x]=val;
		t1[x]={val.first, val.first};
		for(x/=2; x>0; x/=2){
			propagate(x*2, x1-pot);
			propagate(x*2+1, x1-pot+(1<<br));
			t1[x].first=min(t1[x*2].first, t1[x*2+1].first);
			t1[x].second=max(t1[x*2].second, t1[x*2+1].second);
			if(t[x*2].second-t[x*2].first>t[x*2+1].second-t[x*2+1].first){
				t[x]=t[x*2+1];
			}
			else{
				t[x]=t[x*2];
			}
			br++;
		}
	}
	void update1(int L, int D, int x, int l, int d, int val){
		propagate(x, L);
		if(L>=l && D<=d){
			update(x, {val, L});
			if(x<pot){
				prop[x*2]=val;
				prop[x*2+1]=val;
				jesam[x*2]=1;
				jesam[x*2+1]=1;
			}
			return;
		}
		if((L+D)/2>=l){
			update1(L, (L+D)/2, x*2, l, d, val);
		}
		if((L+D)/2+1<=d){
			update1((L+D)/2+1, D, x*2+1, l, d, val);
		}
	}
	int query(int val){
		int x=1;
		int L=0;
		int br=16;
		propagate(1, L);
//		cout << "Query\n";
		while(x<pot){
			propagate(x*2, L);
			propagate(x*2+1, L+(1<<br));
//			cout << t1[x].second << endl;
			if(t1[x*2].second>val){
				x*=2;
			}
			else{
				x=x*2+1;
				L+=(1<<br);
			}
			br--;
		}
		return x-pot;
	}
};


tournament1 s[50];
tournament2 T;
int l[maxn];
set < pair < int, int > > red;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, m, k;
	cin >> n >> k >> m;
	for(int i=0; i<n; i++){
		cin >> l[i];
		l[i]--;
		s[l[i]].update(i+pot, i);
	}
	int x, y, z;
	int mini;
	bool p;
	for(int i=0; i<n; i++){
		mini=inf;
		p=1;
		for(int j=0; j<k; j++){
			x=s[j].query(0, pot-1, 1, 0, i, 1);
			if(x==-inf){
				p=0;
				break;
			}
			mini=min(mini, x);
		}
		if(p){
//			cout << "update " << i << endl;
			T.update(i+pot, {mini, i});
		}
	}
	int prosli, iduci;
	int neki;
	pair < int, int > pa;
	for(int i=0; i<m; i++){
/*		cout << "test\n";
		for(int i=0; i<n; i++){
			cout << l[i] << " ";
		}
		cout << endl;*/
		cin >> x;
		if(x==1){
			cin >> y >> z;
			y--;
			z--;
			if(y==n-1){
				prosli=n;
			}
			else{
				prosli=s[l[y]].query(0, pot-1, 1, y+1, n-1, 0);
			}
			if(prosli==inf){
				prosli=n;
			}
			prosli--;
			if(y-1==-1){
				iduci=-inf;
			}
			else{
				iduci=s[l[y]].query(0, pot-1, 1, 0, y-1, 1);
			}
			neki=T.query(iduci);
//			cout << "vazno " << neki << " " << prosli << " " << iduci << endl;
			if(neki<=prosli){
				T.update1(0, pot-1, 1, neki, prosli, iduci);
			}
			s[l[y]].reset(y+pot);
			s[z].update(y+pot, y);
			l[y]=z;
			if(y!=n-1){
				prosli=s[z].query(0, pot-1, 1, y+1, n-1, 0);
				if(prosli==inf){
					prosli=n;
				}
				prosli--;
				for(int j=0; j<k; j++){
					red.insert({s[j].query(0, pot-1, 1, 0, y, 1), s[j].query(0, pot-1, 1, y+1, prosli, 0)-1});
				}
				iduci=y+1;
//				cout << "neki update ";
				while(!red.empty()){
					pa=*red.begin();
					red.erase(red.begin());
//					cout << pa.first << " ";
					if(pa.second==inf-1){
						pa.second=prosli;
					}
					if(pa.second>=iduci){
						T.update1(0, pot-1, 1, iduci, pa.second, pa.first);
						iduci=pa.second+1;
					}
				}
//				cout << endl;
			}
			mini=inf;
			for(int j=0; j<k; j++){
				mini=min(mini, s[j].query(0, pot-1, 1, 0, y, 1));
			}
			T.update1(0, pot-1, 1, y, y, mini);
		}
		else{
//			cout << T.t[1].first << " " << T.t[1].second << '\n';
//			cout << T.t[pot].first << " " << T.t[pot].second << '\n';
//			cout << T.t[pot+1].first << " " << T.t[pot+1].second << '\n';
			if(T.t[1].first==-inf){
				cout << -1 << '\n';
			}
			else{
				cout << T.t[1].second-T.t[1].first+1 << '\n';
			}
		}
	}
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 104 ms 107132 KB Output is correct
2 Correct 113 ms 107128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 186 ms 107280 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 279 ms 107128 KB Output is correct
2 Correct 281 ms 107128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1925 ms 107640 KB Output is correct
2 Execution timed out 3073 ms 108168 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2967 ms 108036 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3098 ms 107896 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3080 ms 108280 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3074 ms 108280 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3083 ms 108664 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3073 ms 108664 KB Time limit exceeded
2 Halted 0 ms 0 KB -