Submission #725878

#TimeUsernameProblemLanguageResultExecution timeMemory
725878pragmatistKoala Game (APIO17_koala)C++17
99 / 100
88 ms340 KiB
    #include "koala.h"        
    #include <bits/stdc++.h>
     
    #define sz(v) (int)v.size()
    #define pb push_back
     
    using namespace std;      
     
    int minValue(int N, int W) {
        // TODO: Implement Subtask 1 solution here.
        // You may leave this function unmodified if you are not attempting this
        // subtask.
        int n = N;
        int a[n], b[n];
        memset(a, 0, sizeof(a));
        a[0] = 1;
        playRound(a, b);    
        for(int i = 0; i < n; ++i) {
        	if(b[i] == 0) {
        		return i;
        	}
        }
        return 0;
    }
     
    int maxValue(int N, int W) {
        // TODO: Implement Subtask 2 solution here.
        // You may leave this function unmodified if you are not attempting this
        // subtask.
        int n = N, a[n], b[n];
       	vector<int> v;
       	for(int i = 0; i < n; ++i) {
       		v.pb(i);
       	}
       	while(sz(v) > 1) {
    		int t = W / sz(v);
    		bool used[n];
    		memset(used, 0, sizeof(used));
    		for(auto x : v) used[x] = 1;
    		for(int i = 0; i < n; ++i) {
    			if(!used[i]) {
    				a[i] = 0;
    			} else {
    				a[i] = t;
    			}
    		}
    		playRound(a, b);
    		vector<int> to;
    		for(int i = 0; i < n; ++i) {
    			if(b[i] > t) {
    				to.pb(i);
    			}
    		}
    		v = to;		   		
       	}
        return v[0];
    }
     
    bool cmp(int i, int j, int n, int W) {
    	int a[n], b[n];
    	int l = 1, r = min(9, W / 2), ans = -1;
    	while(l <= r) {
    		int mid = (l + r) >> 1;
    		memset(a, 0, sizeof(a));	
    		a[i] = a[j] = mid;
    		playRound(a, b);   
    		if(a[i] >= b[i] && a[j] >= b[j]) {
    			r = mid - 1;
    			continue;
    		}
    		bool c = (a[i] < b[i]), d = (a[j] < b[j]);
    		if(c && d) {
    			l = mid + 1;  
    			continue;
    		}
    		ans = (c < d);
    		break;
    	}
    	assert(ans != -1);
    	return ans;	
    }
     
    int greaterValue(int N, int W) {
        // TODO: Implement Subtask 3 solution here.
        // You may leave this function unmodified if you are not attempting this
        // subtask.
        return cmp(0, 1, N, W);
    }
     
    bool comp(int i, int j, int n) {
    	int a[n], b[n];
    	memset(a, 0, sizeof(a));
    	a[i] = a[j] = n;
    	playRound(a, b);
    	assert((b[i] > a[i]) || (b[j] > a[j]));
    	if(b[i] < a[i]) {
    		return 1;
    	}
    	return 0;
    }
     
    void calc(int l, int r, vector<int> &v, vector<int> &temp, int n, int w) {
    	if(l == r) {
    		return;
    	}	
    	int mid = (l + r) >> 1;
    	calc(l, mid, v, temp, n, w);
    	calc(mid + 1, r, v, temp, n, w);
    	int timer = l, i = l, j = mid + 1;
    	while(i <= mid && j <= r) {
    		if((w == 2 * n ? comp(v[i], v[j], sz(v)) : cmp(v[i], v[j], n, w))) {
    			temp[timer++] = v[i++];
    			continue;
    		}
    		temp[timer++] = v[j++];
    	} 
    	for(int k = i; k <= mid; ++k) temp[timer++] = v[k];
    	for(int k = j; k <= r; ++k) temp[timer++] = v[k];
    	for(int i = l; i <= r; ++i) v[i] = temp[i];	
    }
     
    int timer;
     
    vector<int> solve(vector<int> &v, int tl, int tr, int n, int W) {
    	if(sz(v) <= 1 || tl > tr) {
    		return v;
    	}
    	int c = min((int)sqrt(2 * tr), W / sz(v));
    	int a[n], b[n];
    	memset(a, 0, sizeof(a));
    	for(auto x : v) {
    		a[x] = c;
    	}
    	playRound(a, b);
    	vector<int> l, r;
    	for(auto x : v) {
    		if(a[x] < b[x]) {
    			r.pb(x);
    		} else {
    			l.pb(x);
    		}
    	}
    	if(l.empty() || r.empty()) {
    		vector<int> op = v;
    		calc(0, sz(v) - 1, v, op, n, W);
    		return v;		
    	}
    	l = solve(l, tl, tl + sz(l) - 1, n, W);
    	r = solve(r, tl + sz(l), tr, n, W);
    	for(auto x : r) {
    		l.pb(x);
    	}
    	return l;
    }
     
    void allValues(int N, int W, int *P) {
        if (W == 2*N) {
            // TODO: Implement Subtask 4 solution here.
            // You may leave this block unmodified if you are not attempting this
            // subtask.
            int n = N;    
            vector<int> v, p;
            for(int i = 1; i <= n; ++i) {
            	v.pb(i - 1);
        	}
        	p = v;
        	calc(0, n - 1, v, p, N, W); 
        	for(int i = 0; i < n; ++i) {
        		P[v[i]] = i + 1;
        	}
        } else {
            // TODO: Implement Subtask 5 solution here.
            // You may leave this block unmodified if you are not attempting this
            // subtask.
    		int n = N, a[n], b[n];
    		vector<int> v; 
    		for(int t = 0; t < n; ++t) {
    			v.pb(t);
    		}
    		v = solve(v, 1, n, n, W);
    		for(int i = 0; i < n; ++i) {
        		P[v[i]] = i + 1;
        	}
        }
    }

Compilation message (stderr)

koala.cpp: In function 'void allValues(int, int, int*)':
koala.cpp:175:18: warning: unused variable 'a' [-Wunused-variable]
  175 |       int n = N, a[n], b[n];
      |                  ^
koala.cpp:175:24: warning: unused variable 'b' [-Wunused-variable]
  175 |       int n = N, a[n], b[n];
      |                        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...