Submission #583835

#TimeUsernameProblemLanguageResultExecution timeMemory
583835BackNoobSails (IOI07_sails)C++14
100 / 100
117 ms2236 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define endl '\n' #define MASK(i) (1LL << (i)) #define ull unsigned long long #define ld long double #define pb push_back #define all(x) (x).begin() , (x).end() #define BIT(x , i) ((x >> (i)) & 1) #define TASK "task" #define sz(s) (int) (s).size() using namespace std; const int mxN = 1e6 + 227; const int inf = 1e9 + 277; const int mod = 1e9 + 7; const ll infll = 1e18 + 7; const int base = 307; const int LOG = 20; template <typename T1, typename T2> bool minimize(T1 &a, T2 b) { if (a > b) {a = b; return true;} return false; } template <typename T1, typename T2> bool maximize(T1 &a, T2 b) { if (a < b) {a = b; return true;} return false; } int n; pair<int, int> a[mxN]; int cnt[mxN]; int bit[mxN]; int N = 2e5; void update(int pos, int val) { for(; pos <= N; pos += pos & -pos) bit[pos] += val; } void update_range(int l, int r, int val) { if(l > r) return; // cout << l << ' ' << r << endl; update(l, val); update(r + 1, -val); } int getval(int pos) { int res = 0; for(; pos > 0; pos -= pos & -pos) res += bit[pos]; return res; } int findpos(int r, int x) { int lo = 1, hi = r; while(lo + 1 < hi) { int mid = (lo + hi) / 2; if(getval(mid) > x) lo = mid; else hi = mid; } if(getval(lo) == x) return lo; return hi; } void solve() { cin >> n; int maxhigh = -1; for(int i = 1; i <= n; i++) { cin >> a[i].fi >> a[i].se; maximize(maxhigh, a[i].fi); } sort(a + 1, a + 1 + n); for(int i = 1; i <= n; i++) { // for(int j = 1; j <= n; j++) cout << getval(j) << ' '; // cout << endl; int need = a[i].se; int lim = a[i].fi; int cnt = 0; while(need > 0) { ++cnt; int pos = findpos(lim, getval(lim)); if(lim - pos + 1 >= need) { update_range(pos, pos + need - 1, 1); need = 0; } else { need -= (lim - pos + 1); update_range(pos, lim, 1); lim = pos - 1; int x = getval(lim - need + 1); int pos1 = findpos(lim, x); int pos2 = findpos(lim, x - 1); if(getval(pos2) <= x - 1) { need -= (lim - pos2 + 1); update_range(pos2 , lim , 1); } update_range(pos1, pos1 + need - 1, 1); need = 0; } lim = pos - 1; } // cout << a[i].fi << ' ' << a[i].se << ' ' << pos << endl; // if(a[i].fi - pos + 1 >= a[i].se) { // update_range(pos, pos + a[i].se - 1, 1); // } // else { // update_range(pos, a[i].fi, 1); // need -= (a[i].fi - pos + 1); // // pos = findpos(pos - 1); // update_range(1, need, 1); // } } // for(int j = 1; j <= n; j++) cout << getval(j) << ' '; // cout << endl; ll res = 0; for(int i = 1; i <= maxhigh; i++) { int x = getval(i); res += 1LL * x * (x - 1) / 2; } cout << res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); //freopen(TASK".inp" , "r" , stdin); //freopen(TASK".out" , "w" , stdout); int tc = 1; //cin >> tc; while(tc--) { solve(); } return 0; }
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...