Submission #945909

# Submission time Handle Problem Language Result Execution time Memory
945909 2024-03-14T08:39:25 Z WongYiKai Jousting tournament (IOI12_tournament) C++14
100 / 100
309 ms 45072 KB
//i love returning max number of fights instead of position of guy :)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
    int s, e;
    ll mn, mx, sum;
    bool lset;
    ll add_val, set_val;
    node *l, *r;
    node (int _s, int _e, int A[] = NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) {
        if (A == NULL) return;
        if (s == e) mn = mx = sum = A[s];
        else {
            l = new node(s, (s+e)>>1, A), r = new node((s+e+2)>>1, e, A);
            combine();
        }
    }
    void create_children() {
        if (s == e) return;
        if (l != NULL) return;
        int m = (s+e)>>1;
        l = new node(s, m);
        r = new node(m+1, e);
    }
    void self_set(ll v) {
        lset = 1;
        mn = mx = set_val = v;
        sum = v * (e-s+1);
        add_val = 0;
    }
    void self_add(ll v) {
        if (lset) { self_set(v + set_val); return; }
        mn += v, mx += v, add_val += v;
        sum += v*(e-s+1);
    }
    void lazy_propagate() {
        if (s == e) return;
        if (lset) {
            l->self_set(set_val), r->self_set(set_val);
            lset = set_val = 0;
        }   
        if (add_val != 0) {
            l->self_add(add_val), r->self_add(add_val);
            add_val = 0;
        }
    }
    void combine() {
        if (l == NULL) return;
        sum = l->sum + r->sum;
        mn = min(l->mn, r->mn);
        mx = max(l->mx, r->mx);
    }
    void add(int x, int y, ll v) {
        if (s == x && e == y) { self_add(v); return; }
        int m = (s+e)>>1;
        create_children(); lazy_propagate();
        if (x <= m) l->add(x, min(y, m), v);
        if (y > m) r->add(max(x, m+1), y, v);
        combine();
    }
    void set(int x, int y, ll v) {
        if (s == x && e == y) { self_set(v); return; }
        int m = (s+e)>>1;
        create_children(); lazy_propagate();
        if (x <= m) l->set(x, min(y, m), v);
        if (y > m) r->set(max(x, m+1), y, v);
        combine();
    }
    ll range_sum(int x, int y) {
        if (s == x && e == y) return sum;
        if (l == NULL || lset) return (sum / (e-s+1)) * (y-x+1);
        int m = (s+e)>>1;
        lazy_propagate();
        if (y <= m) return l->range_sum(x, y);
        if (x > m) return r->range_sum(x, y);
        return l->range_sum(x, m) + r->range_sum(m+1, y);
    }
    ll range_min(int x, int y) {
        if (s == x && e == y) return mn;
        if (l == NULL || lset) return mn;
        int m = (s+e)>>1;
        lazy_propagate();
        if (y <= m) return l->range_min(x, y);
        if (x > m) return r->range_min(x, y);
        return min(l->range_min(x, m), r->range_min(m+1, y));
    }
    ll range_max(int x, int y) {
        if (s == x && e == y) return mx;
        if (l == NULL || lset) return mx;
        int m = (s+e)>>1;
        lazy_propagate();
        if (y <= m) return l->range_max(x, y);
        if (x > m) return r->range_max(x, y);
        return max(l->range_max(x, m), r->range_max(m+1, y));
    }
    ~node() {
        if (l != NULL) delete l;
        if (r != NULL) delete r;
    }
} *root,*root1,*root2;


int GetBestPosition(int n, int c, int r, int *k, int *s, int *e) {
	root = new node(0,n+5);
	root1 = new node(0,n+5);
	root2 = new node(0,n+5);
	//root -> count
	//root1 -> rank
	//root2 -> alive?
	for (int i=0;i<n-1;i++){
		root1->set(i,i,k[i]);
	}
	root2->set(0,n,1);
	for (int i=0;i<c;i++){
		int l=0,r2=n-1;
		//cout << s[i] << "\n";
		while (l<r2){
			int m = l+(r2-l)/2;
			if (root2->range_sum(0,m)<=(s[i])) l=m+1;
			else r2=m;
			//cout << l << " " << r2 << "\n";
		}
		/*
		for (int j=0;j<n;j++){
			cout << root2->range_max(j,j) << " ";
		}
		cout << "\n";
		*/
		int start = l;
		l=0,r2=n-1;
		while (l<r2){
			int m = l+(r2-l)/2;
			if (root2->range_sum(0,m)<=(e[i]+1)) l=m+1;
			else r2=m;
		}
		l--;
		int end=l;
		//cout << "fight: " << start << "," << end << "\n";
		if (root1->range_max(start,end-1)<r){
			//cout << "add: " << start << "," << end << "\n";
			root->add(start,end,1);
		}
		root2->set(start,start,1);
		root2->set(start+1,end,0);
	}
	/*
	for (int i=0;i<n;i++){
		cout << root->range_max(i,i) << " ";
	}
	cout << "\n";
	*/
	ll ans=0;
	ll high=0;
	for (int i=0;i<n;i++){
		if (root->range_max(i,i)>high){
			high = root->range_max(i,i);
			ans = i;
		}
	}
	return ans;
}

Compilation message

tournament.cpp: In member function 'void node::lazy_propagate()':
tournament.cpp:42:28: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   42 |             lset = set_val = 0;
      |                    ~~~~~~~~^~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 600 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 604 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 860 KB Output is correct
2 Correct 9 ms 2140 KB Output is correct
3 Correct 3 ms 1372 KB Output is correct
4 Correct 9 ms 2140 KB Output is correct
5 Correct 8 ms 2016 KB Output is correct
6 Correct 10 ms 2652 KB Output is correct
7 Correct 9 ms 2396 KB Output is correct
8 Correct 9 ms 2140 KB Output is correct
9 Correct 2 ms 1116 KB Output is correct
10 Correct 15 ms 2616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 147 ms 22200 KB Output is correct
2 Correct 240 ms 37336 KB Output is correct
3 Correct 50 ms 19028 KB Output is correct
4 Correct 242 ms 39128 KB Output is correct
5 Correct 228 ms 38400 KB Output is correct
6 Correct 309 ms 45072 KB Output is correct
7 Correct 251 ms 40276 KB Output is correct
8 Correct 234 ms 38068 KB Output is correct
9 Correct 30 ms 16464 KB Output is correct
10 Correct 53 ms 21588 KB Output is correct