Submission #394439

#TimeUsernameProblemLanguageResultExecution timeMemory
394439shivensinha4Teams (IOI15_teams)C++17
0 / 100
291 ms52512 KiB
#include "bits/stdc++.h"
#include "teams.h"
using namespace std;
#define for_(i, s, e) for (int i = s; i < (int) e; i++)
#define for__(i, s, e) for (ll i = s; i < e; i++)
typedef long long ll;
typedef vector<int> vi;
typedef array<int, 2> ii;
#define endl '\n'

struct Node {
	int pref, suf, mn, sum;
};

class SegmentTree {
	private:
		vector<Node> tree; vi raw; int n;
		int INF = 1e7;
		Node bound = {0, 0, INF, 0};
		
		Node merge(Node a, Node b) {
			if (a.mn == -INF) return b;
			if (b.mn == -INF) return a;
			
			Node ans;
			ans.sum = a.sum + b.sum;
			ans.mn = min({a.mn, b.mn, b.pref + a.suf});
			ans.suf = min(b.suf, b.sum + a.suf);
			ans.pref = min(a.pref, a.sum + b.pref);
			return ans;
		}
		
		void buildTree(int l, int r, int p) {
			if (l == r) {
				tree[p] = {raw[l], raw[l], raw[l], raw[l]};
				return;
			}
			
			int mid = (l + r) / 2;
			int c1 = 2*p+1, c2 = 2*p+2;
			buildTree(l, mid, c1); buildTree(mid+1, r, c2);
			tree[p] = merge(tree[c1], tree[c2]);
		}
		
		void update(int i, int val, int l, int r, int p) {
			if (l > i or r < i) return;
			if (l == r) {
				val = val+tree[p].sum;
				tree[p] = {val, val, val, val};
				return;
			}
			
			int mid = (l + r) / 2;
			int c1 = 2*p+1, c2 = 2*p+2;
			update(i, val, l, mid, c1); update(i, val, mid+1, r, c2);
			tree[p] = merge(tree[c1], tree[c2]);
		}
		
		Node mn(int i, int j, int l, int r, int p) {
			if (l > j or r < i) return bound;
			if (l >= i and r <= j) return tree[p];
			
			int mid = (l + r) / 2;
			int c1 = 2*p+1, c2 = 2*p+2;
			return merge(mn(i, j, l, mid, c1), mn(i, j, mid+1, r, c2));
		}
	
	public: 
		void build(vi input) {
			raw = input;
			n = raw.size();
			tree.resize(4*n);
			buildTree(0, n-1, 0);
		}
		
		int mn(int i, int j) {
			return mn(i, j, 0, n-1, 0).mn;
		}
		
		void update(int i, int val) {
			update(i, val, 0, n-1, 0);
		}
};

SegmentTree tree;
int n;

void init(int N, int A[], int B[]) {
	n = N;
	vi curr(N);
	for_(i, 0, N) {
		curr[A[i]-1]++;
		if (B[i] < N) curr[B[i]]--;
	}
	
	for_(i, 1, N) curr[i] += curr[i-1];
	tree.build(curr);
}

int can(int M, int K[]) {
	for_(i, 0, M) {
		tree.update(K[i]-1, -K[i]);
	}
	
	int ans = tree.mn(0, n-1) >= 0;
	
	for_(i, 0, M) {
		tree.update(K[i]-1, K[i]);
	}
	
	return ans;
}


// int main() {
// #ifdef mlocal
// 	freopen("teams.in", "r", stdin);
// #endif
	
// 	ios_base::sync_with_stdio(false);
// 	cin.tie(0);
	
// 	int t; cin >> t;
// 	cout << "got " << t << endl;
// 	while (t--) {
	
// 	}
// }

Compilation message (stderr)

teams.cpp: In member function 'void SegmentTree::build(vi)':
teams.cpp:71:16: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   71 |    n = raw.size();
      |        ~~~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...