답안 #542364

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
542364 2022-03-26T09:19:53 Z gs14004 Fibonacci representations (CEOI18_fib) C++17
50 / 100
4000 ms 5004 KB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pi = pair<int, int>;
const int mod = 1e9 + 7;
const int MAXN = 200005;
 
struct mtrx{
	int a[2][2];
	mtrx operator*(const mtrx &m)const{
		mtrx ret;
		memset(ret.a, 0, sizeof(ret.a));
		for(int i=0; i<2; i++){
			for(int j=0; j<2; j++){
				for(int k=0; k<2; k++){
					ret.a[j][k] += 1ll * a[j][i] * m.a[i][k] % mod;
					if(ret.a[j][k] >= mod) ret.a[j][k] -= mod;
				}
			}
		}
		return ret;
	}
}E, pwr[MAXN];
 
mtrx num(int n){
	mtrx m;
	m.a[1][0] = m.a[1][1] = (n % 2 == 0);
	m.a[0][0] = (n + 1) / 2;
	m.a[0][1] = (n - 1) / 2;
	return m;
}
 
set<pi> s;
map<int, mtrx> mp;
 
int query(){
	mtrx m = E;
	for(auto &i : mp){
		m = m * i.second;
	}
	return m.a[0][0];
}
 
void add_query(int pos, mtrx m){
	assert(mp.find(pos) == mp.end());
	mp[pos] = m;
}
 
void rem_query(int pos){
	assert(mp.find(pos) != mp.end());
	mp.erase(pos);
}
 
void add(int x){ 
	if(x == 0) x = 1;
	if(x == -1) return;
	auto ins = [](pi x){
		auto itr = s.lower_bound(x);
		int pos = 0;
		if(itr != s.begin()) pos = prev(itr)->second;
		if(itr != s.end()) rem_query(pos);
		s.insert(x);
		add_query(pos, num(x.first - pos));
		if(x.first != x.second) add_query(x.first, pwr[(x.second - x.first) / 2]);
		itr = s.upper_bound(x);
		if(itr != s.end()){
			add_query(x.second, num(itr->first - x.second));
		}
	};
	auto rem = [](pi x){
		if(x.first != x.second) rem_query(x.first);
		auto itr = s.lower_bound(x);
		int pos = 0;
		if(itr != s.begin()) pos = prev(itr)->second;
		if(next(itr) != s.end()) rem_query(x.second);
		rem_query(pos);
		s.erase(x);
		itr = s.lower_bound(x);
		if(itr != s.end()){
			add_query(pos, num(itr->first - pos));
		}
	};
	auto it = s.upper_bound(pi(x + 1, -1));
	if(it != s.begin() && prev(it)->second >= x){
		auto intv = *--it;
		rem(intv);
		if(intv.first % 2 == x % 2){
			add(intv.second + 1);
			intv.second = x - 2;
			if(intv.first <= intv.second){
				auto l = s.lower_bound(pi(intv.second + 3, -1));
				auto nxt = pi(intv.first + 1, intv.second + 1);
				if(l != s.end() && l->first == intv.second + 3){
					nxt.second = l->second;
					rem(*l);
				}
				ins(nxt);
			}
			add(intv.first - 2);
		}
		else{
			ins(pi(intv.first, x - 1));
			add(intv.second + 1);
		}
	}
	else{
		auto nxt = it;
		if(nxt != s.begin()){
			nxt = prev(nxt);
			if(nxt->second == x - 1){
				auto prv = *nxt;
				rem(prv);
				if(prv.first != prv.second){
					prv.second -= 2;
					ins(prv);
				}
				add(x + 1);
				return;
			}
			if(nxt->second == x - 2){
				auto l = s.lower_bound(pi(x + 1, -1));
				if(l != s.end() && l->first == x + 1){
					int pos = l->second + 1;
					rem(*l);
					add(pos);
				}
				else if(l != s.end() && l->first == x + 2){
					auto it = *nxt;
					it.second = l->second;
					rem(*l);
					rem(*nxt);
					ins(it);
				}
				else{
					auto it = *nxt;
					it.second += 2;
					rem(*nxt);
					ins(it);
				}
				return;
			}
		}
		auto l = s.lower_bound(pi(x + 1, -1));
		if(l->first == x + 1){
			int pos = l->second + 1;
			rem(*l);
			add(pos);
		}
		else if(l->first == x + 2){
			auto nxt = *l; nxt.first -= 2;
			rem(*l);
			ins(nxt);
		}
		else{
			ins(pi(x, x));
		}
	}
}
 
int main(){
	E.a[0][0] = E.a[1][1] = 1;
	pwr[0] = E;
	pwr[1] = num(2);
	for(int i=2; i<MAXN; i++) pwr[i] = pwr[i-1] * pwr[1];
	int n, x;
	scanf("%d",&n);
	for(int i=0; i<n; i++){
		scanf("%d",&x);
		add(x);
		printf("%d\n", query());
	}
}

Compilation message

fib.cpp: In function 'int main()':
fib.cpp:166:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  166 |  scanf("%d",&n);
      |  ~~~~~^~~~~~~~~
fib.cpp:168:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  168 |   scanf("%d",&x);
      |   ~~~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3412 KB Output is correct
2 Correct 6 ms 3412 KB Output is correct
3 Correct 6 ms 3368 KB Output is correct
4 Correct 7 ms 3416 KB Output is correct
5 Correct 6 ms 3412 KB Output is correct
6 Correct 6 ms 3412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3412 KB Output is correct
2 Correct 6 ms 3412 KB Output is correct
3 Correct 6 ms 3368 KB Output is correct
4 Correct 7 ms 3416 KB Output is correct
5 Correct 6 ms 3412 KB Output is correct
6 Correct 6 ms 3412 KB Output is correct
7 Correct 8 ms 3412 KB Output is correct
8 Correct 7 ms 3412 KB Output is correct
9 Correct 7 ms 3412 KB Output is correct
10 Correct 7 ms 3412 KB Output is correct
11 Correct 7 ms 3428 KB Output is correct
12 Correct 6 ms 3412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3412 KB Output is correct
2 Correct 6 ms 3412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3412 KB Output is correct
2 Correct 6 ms 3412 KB Output is correct
3 Correct 6 ms 3368 KB Output is correct
4 Correct 7 ms 3416 KB Output is correct
5 Correct 6 ms 3412 KB Output is correct
6 Correct 6 ms 3412 KB Output is correct
7 Correct 8 ms 3412 KB Output is correct
8 Correct 7 ms 3412 KB Output is correct
9 Correct 7 ms 3412 KB Output is correct
10 Correct 7 ms 3412 KB Output is correct
11 Correct 7 ms 3428 KB Output is correct
12 Correct 6 ms 3412 KB Output is correct
13 Correct 6 ms 3412 KB Output is correct
14 Correct 6 ms 3412 KB Output is correct
15 Correct 6 ms 3412 KB Output is correct
16 Correct 6 ms 3412 KB Output is correct
17 Correct 6 ms 3412 KB Output is correct
18 Correct 6 ms 3412 KB Output is correct
19 Correct 7 ms 3376 KB Output is correct
20 Correct 6 ms 3428 KB Output is correct
21 Correct 7 ms 3316 KB Output is correct
22 Correct 6 ms 3412 KB Output is correct
23 Correct 6 ms 3412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3412 KB Output is correct
2 Execution timed out 4067 ms 5004 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3412 KB Output is correct
2 Correct 6 ms 3412 KB Output is correct
3 Correct 6 ms 3368 KB Output is correct
4 Correct 7 ms 3416 KB Output is correct
5 Correct 6 ms 3412 KB Output is correct
6 Correct 6 ms 3412 KB Output is correct
7 Correct 8 ms 3412 KB Output is correct
8 Correct 7 ms 3412 KB Output is correct
9 Correct 7 ms 3412 KB Output is correct
10 Correct 7 ms 3412 KB Output is correct
11 Correct 7 ms 3428 KB Output is correct
12 Correct 6 ms 3412 KB Output is correct
13 Correct 6 ms 3412 KB Output is correct
14 Correct 6 ms 3412 KB Output is correct
15 Correct 6 ms 3412 KB Output is correct
16 Correct 6 ms 3412 KB Output is correct
17 Correct 6 ms 3412 KB Output is correct
18 Correct 6 ms 3412 KB Output is correct
19 Correct 7 ms 3376 KB Output is correct
20 Correct 6 ms 3428 KB Output is correct
21 Correct 7 ms 3316 KB Output is correct
22 Correct 6 ms 3412 KB Output is correct
23 Correct 6 ms 3412 KB Output is correct
24 Correct 6 ms 3412 KB Output is correct
25 Execution timed out 4067 ms 5004 KB Time limit exceeded
26 Halted 0 ms 0 KB -