답안 #223950

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
223950 2020-04-16T22:25:05 Z MohamedAhmed04 케이크 (CEOI14_cake) C++17
100 / 100
1960 ms 19128 KB
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include <bits/stdc++.h>
 
using namespace std ;
 
const int MAX = 3e5 + 10 ;
 
int arr[MAX] ;
int n , a ;
 
int tree[4 * MAX] ;
 
void build(int node , int l , int r)
{
	if(l == r)
	{
		tree[node] = arr[l] ;
		return ;
	}
	int mid = (l + r) >> 1 ;
	build(node << 1 , l , mid) ;
	build(node << 1 | 1 , mid+1 , r) ;
	tree[node] = max(tree[node << 1] , tree[node << 1 | 1]) ;
}
 
void update(int node , int l , int r , int idx , int val)
{
	if(idx > r || idx < l)
		return ;
	if(l == r)
	{
		tree[node] = val ;
		return ;
	}
	int mid = (l + r) >> 1 ;
	update(node << 1 , l , mid , idx , val) ;
	update(node << 1 | 1 , mid+1 , r , idx , val) ;
	tree[node] = max(tree[node << 1] , tree[node << 1 | 1]) ;
}
 
int query(int node , int l , int r , int from , int to)
{
	if(from > r || to < l)
		return 0ll ;
	if(l >= from && r <= to)
		return tree[node] ;
	int mid = (l + r) >> 1 ;
	int a = query(node << 1 , l , mid , from , to) ;
	int b = query(node << 1 | 1, mid+1 , r , from , to) ;
	return max(a , b) ;
}
 
int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>a ;
	vector< pair<int , int> >vp ;
	for(int i = 1 ; i <= n ; ++i)
	{
		cin>>arr[i] ;
		vp.emplace_back(arr[i] , i) ;
	}
	sort(vp.begin() , vp.end()) ;
	for(int i = 0 ; i < n ; ++i)
		arr[vp[i].second] = i+1ll ;
	build(1 , 1 , n) ;
	set< pair<int , int> >s ;
	for(int i = 1 ; i <= n ; ++i)
		s.insert({arr[i] , i}) ;
	while(s.size() > 10)
		s.erase(s.begin()) ;
	int q ;
	cin>>q ;
	while(q--)
	{
		char c ;
		cin>>c ;
		if(c == 'E')
		{
			int x , y ;
			cin>>x>>y ;
			s.insert({arr[x] , x}) ;
			if(s.size() > 10)
			{
				s.erase({arr[x] , x}) ;
				s.erase(s.begin()) ;
			}
			else
				s.erase({arr[x] , x}) ;
			pair<int , int>p = *s.rbegin() ;
			int val = p.first ;
			for(int i = min(n , 10) ; i >= 1 ; --i)
			{
				val++ ;
				if(i == y)
				{
					arr[x] = val ;
					s.insert({arr[x] , x}) ;
					update(1 , 1 , n , x , arr[x]) ;
					continue ;
				}
				p = *s.begin() ;
				s.erase(p) ;
				arr[p.second] = val ;
				update(1 , 1 , n , p.second , arr[p.second]) ;
				s.insert({arr[p.second] , p.second}) ;
			}
			//arr[x] = val[n-y+1] ;
			//val[n-y+1]++ ;
			//update(1 , 1 , n , x , arr[x]) ;
		}
		else
		{
			int x ;
			cin>>x ;
			if(x == a)
			{
				cout<<0<<"\n" ;
				continue ;
			}
			int Max ;
			int l , r , ans = a ;
			if(x < a)
				Max = query(1 , 1 , n , x , a-1) , l = a+1 , r = n ;
			else
				Max = query(1 , 1 , n , a+1 , x) , l = 1 , r = a-1 ;
			while(l <= r)
			{
				int mid = (l + r) >> 1 ;
				int y ;
				if(mid > a)
					y = query(1 , 1 , n , a+1 , mid) ;
				else
					y = query(1 , 1 , n , mid , a-1) ;
				if(y < Max)
				{
					ans = mid ;
					if(mid > a)
						l = mid+1 ;
					else
						r = mid-1 ;
				}
				else
				{
					if(mid > a)
						r = mid-1 ;
					else
						l = mid+1 ;
				}
			}
			cout<<abs(x-a)+abs(ans-a)<<"\n" ;
		}
	}
	return 0 ;
}	
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 6 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 13 ms 512 KB Output is correct
5 Correct 30 ms 1024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1155 ms 1060 KB Output is correct
2 Correct 1083 ms 1144 KB Output is correct
3 Correct 1056 ms 1152 KB Output is correct
4 Correct 977 ms 1272 KB Output is correct
5 Correct 1150 ms 2048 KB Output is correct
6 Correct 1125 ms 2048 KB Output is correct
7 Correct 1160 ms 2048 KB Output is correct
8 Correct 1056 ms 2048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 460 ms 7920 KB Output is correct
2 Correct 301 ms 7912 KB Output is correct
3 Correct 320 ms 7664 KB Output is correct
4 Correct 5 ms 384 KB Output is correct
5 Correct 542 ms 17768 KB Output is correct
6 Correct 634 ms 17768 KB Output is correct
7 Correct 495 ms 17512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 760 KB Output is correct
2 Correct 117 ms 768 KB Output is correct
3 Correct 261 ms 4184 KB Output is correct
4 Correct 222 ms 4084 KB Output is correct
5 Correct 270 ms 864 KB Output is correct
6 Correct 499 ms 5484 KB Output is correct
7 Correct 407 ms 1528 KB Output is correct
8 Correct 532 ms 7404 KB Output is correct
9 Correct 1738 ms 18940 KB Output is correct
10 Correct 876 ms 1756 KB Output is correct
11 Correct 1143 ms 3328 KB Output is correct
12 Correct 1680 ms 16044 KB Output is correct
13 Correct 1960 ms 19128 KB Output is correct