답안 #610900

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
610900 2022-07-28T17:26:09 Z racsosabe Poklon (COCI17_poklon) C++14
84 / 140
5000 ms 27852 KB
#include<bits/stdc++.h>
using namespace::std;

const int N = 500000 + 5;
const int SQRT = 710;
const int bsize = 710;

int n;
int q;
int a[N];
int L[N];
int val[N];
int block[SQRT];
int ans[N];
int last1[N];
int last2[N];
int last3[N];
vector<int> Q[N];

void compress(){
	set<int> S;
	for(int i = 1; i <= n; i++) S.emplace(a[i]);
	int len = 0;
	map<int, int> id;
	for(int x : S){
		id[x] = len++;
	}
	for(int i = 1; i <= n; i++) a[i] = id[a[i]];
}

void update(int x, int y){
	val[x] += y;
}

int query(int l, int r){
	int ans = 0;
	for(; r >= l; r--) ans += val[r];
	return ans;
}

int get_sum(int pos){
	return query(1, pos);
}

void fix(int i){
	int x = a[i];
	int l1 = last1[x], l2 = last2[x], l3 = last3[x];
	if(l2){
		update(l3 + 1, -1);
		update(l2 + 1, 1);
	}
	if(l1){
		update(l2 + 1, 1);
		update(l1 + 1, -1);
	}
	last3[x] = l2;
	last2[x] = l1;
	last1[x] = i;
}

void download(int i){
	for(int at : Q[i]){
		ans[at] = get_sum(L[at]);
	}
}

void solve(){
	for(int i = 1; i <= n; i++){
		fix(i);
		download(i);
	}
}

int main(){
	scanf("%d %d", &n, &q);
	for(int i = 1; i <= n; i++) scanf("%d", a + i);
	compress();
	for(int i = 1; i <= q; i++){
		int r;
		scanf("%d %d", L + i, &r);
		Q[r].emplace_back(i);
	}
	solve();
	for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);
	return 0;
}

Compilation message

poklon.cpp: In function 'int main()':
poklon.cpp:75:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |  scanf("%d %d", &n, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~
poklon.cpp:76:35: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |  for(int i = 1; i <= n; i++) scanf("%d", a + i);
      |                              ~~~~~^~~~~~~~~~~~~
poklon.cpp:80:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |   scanf("%d %d", L + i, &r);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 12116 KB Output is correct
2 Correct 7 ms 12080 KB Output is correct
3 Correct 10 ms 12116 KB Output is correct
4 Correct 13 ms 12192 KB Output is correct
5 Correct 1641 ms 15588 KB Output is correct
6 Correct 1644 ms 15864 KB Output is correct
7 Execution timed out 5093 ms 18684 KB Time limit exceeded
8 Execution timed out 5076 ms 21940 KB Time limit exceeded
9 Execution timed out 5071 ms 24972 KB Time limit exceeded
10 Execution timed out 5075 ms 27852 KB Time limit exceeded