Submission #623505

#TimeUsernameProblemLanguageResultExecution timeMemory
623505BalintRTeams (IOI15_teams)C++17
100 / 100
1544 ms126820 KiB
#include <bits/stdc++.h> using namespace std; #include "teams.h" typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; #define pb push_back #define fs first #define sn second const int MN = 5e5 + 5, TREE_SZ = 1 << 20; int n, q; pii arr[MN]; int mem[10 << 20], tree[TREE_SZ], vecSz[TREE_SZ], sumDec[TREE_SZ], lastRem[TREE_SZ]; vi needReset; int t, l, v; const int r = TREE_SZ >> 1; void update(int i, int segL, int segR, int prvLast){ if(r <= segL || l >= segR || v == 0) return; needReset.pb(i); if(prvLast > lastRem[i]) sumDec[i] = 0; lastRem[i] = prvLast = max(lastRem[i], prvLast); if(l <= segL){ int gv = upper_bound(mem + tree[i],mem + tree[i] + vecSz[i], t) - upper_bound(mem + tree[i], mem + tree[i] + vecSz[i], lastRem[i]) - sumDec[i]; if(gv <= v){ sumDec[i] = 0; lastRem[i] = t; v -= gv; return; } } if(segL + 1 == segR){ sumDec[i] += v; v = 0; return; } int mid = (segL + segR) >> 1; int oldV = v; update(i * 2, segL, mid, prvLast); sumDec[i] += oldV - v; if(v == 0) return; oldV = v; update(i * 2 + 1, mid, segR, prvLast); sumDec[i] += oldV - v; } void init(int N, int *A, int *B){ n = N; for (int i = 0; i < n; ++i) { arr[i] = {A[i], B[i]}; for(int j = r + B[i]; j; j >>= 1) vecSz[j]++; } sort(arr, arr + n); for (int i = 1; i < TREE_SZ; ++i) { tree[i] = tree[i-1] + vecSz[i-1]; vecSz[i-1] = 0; } for (int i = 0; i < n; ++i) { for(int j = r + arr[i].sn; j; j >>= 1){ mem[tree[j] + vecSz[j]++] = arr[i].fs; } } } int can(int k, int *reqSizes){ ll sum = 0; for (int i = 0; i < k; ++i) sum += reqSizes[i]; if(sum > n) return 0; sort(reqSizes, reqSizes + k); bool works = true; for (int i = 0; i < k; ++i) { t = l = v = reqSizes[i]; update(1, 0, r, 0); if(v){ works = false; break; } } for(int ind : needReset) sumDec[ind] = lastRem[ind] = 0; needReset.clear(); return works; }

Compilation message (stderr)

teams.cpp: In function 'void update(int, int, int, int)':
teams.cpp:27:140: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
   27 |         int gv = upper_bound(mem + tree[i],mem + tree[i] + vecSz[i], t) - upper_bound(mem + tree[i], mem + tree[i] + vecSz[i], lastRem[i]) - sumDec[i];
      |                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...