답안 #282597

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
282597 2020-08-24T15:25:19 Z youssefbou62 마상시합 토너먼트 (IOI12_tournament) C++14
17 / 100
1000 ms 1792 KB
#include  <bits/stdc++.h>
using namespace std;

// using namespace __gnu_pbds;
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#define mp make_pair
#define fi first
#define se second
#define all(v) v.begin(),v.end()
#define allarr(a) a , a + n
#define ll long long
#define ull unsigned long long 
#define pb push_back
#define fastio ios_base::sync_with_stdio(false) ; cin.tie(NULL); cout.tie(NULL)
#define sz(x)  (int)x.size() 
typedef pair<int, int> pi;
typedef pair<ll,ll> pll; 
typedef pair<int,pi> trp ;
typedef vector<pi> vpi;
typedef vector<pll> vpll ;
// int ab  (int  x ) { return (x>0?x:-x); }
//typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
const int MAXN = 5005 ; 

int in[MAXN] , jump[MAXN],best[MAXN];  
int st[MAXN*2]; 
int v[MAXN]; 
void init(int n){
	for(int i = 0 ; i< n ;i++ )
		in[i] = i ;

}

// int left(int u){return u*2+1;}
// int right(int u){return u*2+2;}

// void build (int i,int j,int in,int u){

// 	if( i > j )return ; 
// 	if( i == j ){

// 		st[u] = v[in]; 
// 		return ; 
// 	}
// 	int mid = (i+j)/2; 
// 	if( in <= mid )
// 	build(i,mid,in,left(u)); 
// 	else 
// 	build(mid+1,j,in,right(u)); 
	
// 	st[u] = max(st[left(u)],st[right(u)]); 
// }



// int query(int i,int j,int qL ,int qR,int u){
// 	// if( qL == 1 && qR == 3 )cout << i << " " << j << " " << u << endl; 
// 	if( i > j || i > qR || j < qL ) return -1; 
// 	if( i >= qL && j <= qR )return st[u] ; 

// 	int mid = ( i + j )/2; 
// 	return max(query(i,mid,qL,qR,left(u)) , 
// 		query(mid+1,j,qL,qR,right(u))); 

// }

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
	init(N); 
	
	vpi queries ;

	for(int i = 0 ; i < N-1 ; i++ )v[i] = K[i] ; 
	for(int i = 0 ; i < C ; i++ ){
		int s = S[i] , e = E[i] ;
		int new_index = s ; 
		int L = 1e9 , Rx = -1 ; 
		int last = -1 ;

		for(int j = 0 ; j < N ; j++ ){
			if( in[j] >= s && in[j] <= e){
				last = in[j] ; 
				in[j] = new_index;
				L = min(L,j); 
				Rx = max(Rx,j); 
			}

			if( in[j] > e && in[j]!=last)new_index ++ ; 
			if( in[j] > e )
				last=in[j],in[j] = new_index ;  

		}

		queries.pb({L,Rx}); 

	}
	
	int ans=-1,pos; 

	for(int i = N-1 ; i != -1 ; i-- ){
		

		v[i] = R;  

		for(int j = 0 ; j < N ; j++ ){
			jump[j]=j+1 , best[j] = v[j]; 
		}
		int cur_ans = 0 ;
		// cout << "chosed "  <<i<< endl; 
		for(int j = 0 ; j < C ; j++ ){
			int l = queries[j].fi , r =  queries[j].se; 
			int cur_best =-1;
			for(int k = l ; k <= queries[j].se ; k=jump[k]){
				cur_best = max(cur_best,best[k]); 
			}
			// cout << j << " " << cur_best<<endl; 
			best[l]=cur_best ; 

			if( cur_best == R)cur_ans ++ ; 

		}
		if( cur_ans >= ans ){
			pos = i ;
			ans = cur_ans ; 
		}
		if( i )
		v[i] = v[i-1] ;

	}
	assert(ans!=-1); 
  	return pos;

}




// #define inbuf_len 1 << 16
// #define outbuf_len 1 << 16

// int GetBestPosition(int N, int C, int R, int *K, int *S, int *E);

// int main() {
//   int tmp;

//   /* Set input and output buffering */
//   char *inbuf, *outbuf;
//   inbuf = (char*) malloc(inbuf_len * sizeof(char));
//   outbuf = (char*) malloc(outbuf_len * sizeof(char));
//   tmp = setvbuf(stdin, inbuf, _IOFBF, inbuf_len);
//   assert(tmp == 0);
//   tmp = setvbuf(stdout, outbuf, _IOFBF, outbuf_len);
//   assert(tmp == 0);

//   int N, C, R;
//   int *K, *S, *E;
//   tmp = scanf("%d %d %d", &N, &C, &R);
//   assert(tmp == 3);
//   K = (int*) malloc((N-1) * sizeof(int));
//   S = (int*) malloc(C * sizeof(int));
//   E = (int*) malloc(C * sizeof(int));
//   int i;
//   for (i = 0; i < N-1; i++) {
//     tmp = scanf("%d", &K[i]);
//     assert(tmp == 1);
//   }
//   for (i = 0; i < C; i++) {
//     tmp = scanf("%d %d", &S[i], &E[i]);
//     assert(tmp == 2);
//   }

//   printf("%d\n", GetBestPosition(N, C, R, K, S, E));

//   return 0;

// }

Compilation message

tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:113:28: warning: unused variable 'r' [-Wunused-variable]
  113 |    int l = queries[j].fi , r =  queries[j].se;
      |                            ^
tournament.cpp:133:11: warning: 'pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
  133 |    return pos;
      |           ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 40 ms 384 KB Output is correct
4 Correct 161 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 39 ms 384 KB Output is correct
7 Correct 94 ms 384 KB Output is correct
8 Correct 63 ms 504 KB Output is correct
9 Correct 5 ms 384 KB Output is correct
10 Correct 6 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 384 KB Output is correct
2 Execution timed out 1085 ms 632 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 17 ms 1792 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -