Submission #49006

# Submission time Handle Problem Language Result Execution time Memory
49006 2018-05-21T06:42:43 Z Namnamseo Jousting tournament (IOI12_tournament) C++17
100 / 100
94 ms 16600 KB
#include <bits/stdc++.h>
using namespace std;
#define sz(v) ((int)((v).size()))
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define coord_comp(v) sort(all(v)), v.erase(unique(all(v)), v.end())
#define v_index(v, x) (lower_bound(all(v),x)-(v).begin())
typedef pair<int,int> pp;
typedef long long ll;
void read(int& x){ scanf("%d",&x); }
void read(ll& x){ scanf("%lld",&x); }
template<typename T1,typename T2>
void read(pair<T1,T2>& p){ read(p.first); read(p.second); }
template<typename T,typename... Args>
void read(T&a,Args&...b){ read(a); read(b...); }

int n, rnds, R;

#define rank namseo

int *rank;

struct pos_tree {
	static const int M=131072;
	int tree[M*2];
	void upd(int pos,int val){
		pos += M;
		tree[pos]=val; pos>>=1;
		while(pos){
			tree[pos]=tree[pos*2] + tree[pos<<1|1];
			pos >>= 1;
		}
	}

	void init(){
		for(int i=1; i<=n; ++i) upd(i, 1);
	}

	int find_kth(int k){
		int sum = 0;
		int pos = 1;
		while(pos < M){
			pos *= 2;
			if(sum + tree[pos] < k){
				sum += tree[pos];
				++pos;
			}
		}
		return pos - M;
	}
} pos_T;

struct maxtree{
	static const int M=131072;
	int tree[262144];

	void upd(int pos,int val){
		pos += M;
		tree[pos]=val; pos >>= 1;
		while(pos){
			tree[pos] = max(tree[pos<<1], tree[pos<<1|1]);
			pos >>= 1;
		}
	}

	void init(){
		for(int i=1; i<n; ++i) upd(i, rank[i]);
	}
	
	int rangemax(int a,int b){
		a+= M; b+=M;
		int ret=-1;
		while(a<=b){
			if(a%2==1) ret=max(ret, tree[a++]);
			if(b%2==0) ret=max(ret, tree[b--]);
			a>>=1; b>>=1;
		}
		return ret;
	}
} max_T;

int nodeL[100010];
int nodeR[100010];
int nxtNode[100010];

int maxDepth[100010];
int maxPos  [100010];

int GetBestPosition(int N, int C, int rr, int *K, int *S, int *E){
	n = N;
	rnds = C;
	R = rr;
	rank = K-1;

	max_T.init();
	pos_T.init();

	for(int i=1; i<=n; ++i)
		nodeL[i] = nodeR[i] = i,
		nxtNode[i] = i+1,
		maxPos[i] = i;

	int ans=0, ansPos=1;

	for(int i=1; i<=rnds; ++i){
		int L = S[i-1], R = E[i-1];
		++L; ++R;
		int a=pos_T.find_kth(L), b=pos_T.find_kth(R);
		if(a==0) break;

		int realL=2e9, realR=-1;
		int maxD = -1, maxP = -1;

		for(int j=a; j<=b; j=nxtNode[j]){

			pos_T.upd(j, 0);

			realL=min(realL, nodeL[j]);
			realR=max(realR, nodeR[j]);

			if(maxDepth[j] != -1){
				if(maxD < maxDepth[j])
					maxP = maxPos[j],
					maxD = maxDepth[j];
				else if(maxD == maxDepth[j])
					maxP = min(maxP, maxPos[j]);
			}
		}

		pos_T.upd(a, 1);
		nodeL[a]=realL;
		nodeR[a]=realR;
		nxtNode[a] = nxtNode[b];
		maxDepth[a] = -1;
		maxPos  [a] = -1;

		if(maxP == -1 || max_T.rangemax(realL,realR-1) > ::R){
			continue;
		}

		maxDepth[a] = maxD + 1;
		maxPos  [a] = maxP;

		if(ans < maxDepth[a])
			ans = maxDepth[a],
			ansPos = maxPos[a];
		else if(ans == maxDepth[a]) ansPos = min(ansPos, maxPos[a]);
	}
	return ansPos-1;
}

Compilation message

tournament.cpp: In function 'void read(int&)':
tournament.cpp:10:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 void read(int& x){ scanf("%d",&x); }
                    ~~~~~^~~~~~~~~
tournament.cpp: In function 'void read(ll&)':
tournament.cpp:11:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 void read(ll& x){ scanf("%lld",&x); }
                   ~~~~~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 488 KB Output is correct
3 Correct 3 ms 560 KB Output is correct
4 Correct 3 ms 560 KB Output is correct
5 Correct 3 ms 560 KB Output is correct
6 Correct 2 ms 656 KB Output is correct
7 Correct 2 ms 656 KB Output is correct
8 Correct 2 ms 656 KB Output is correct
9 Correct 2 ms 696 KB Output is correct
10 Correct 2 ms 840 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 840 KB Output is correct
2 Correct 6 ms 1076 KB Output is correct
3 Correct 4 ms 1288 KB Output is correct
4 Correct 6 ms 1288 KB Output is correct
5 Correct 6 ms 1288 KB Output is correct
6 Correct 5 ms 1332 KB Output is correct
7 Correct 6 ms 1384 KB Output is correct
8 Correct 7 ms 1452 KB Output is correct
9 Correct 4 ms 1516 KB Output is correct
10 Correct 17 ms 1540 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 3528 KB Output is correct
2 Correct 94 ms 7500 KB Output is correct
3 Correct 35 ms 7500 KB Output is correct
4 Correct 76 ms 9836 KB Output is correct
5 Correct 72 ms 11172 KB Output is correct
6 Correct 76 ms 12492 KB Output is correct
7 Correct 75 ms 14268 KB Output is correct
8 Correct 75 ms 15984 KB Output is correct
9 Correct 36 ms 15984 KB Output is correct
10 Correct 48 ms 16600 KB Output is correct