Submission #232795

#TimeUsernameProblemLanguageResultExecution timeMemory
232795anubhavdharSails (IOI07_sails)C++14
100 / 100
280 ms10616 KiB
#include<bits/stdc++.h> #define ll long long int #define pb push_back #define mp make_pair #define FOR(i,n) for(i=0;i<(n);++i) #define FORe(i,n) for(i=1;i<=(n);++i) #define FORr(i,a,b) for(i=(a);i<(b);++i) #define FORrev(i,n) for(i=(n);i>=0;--i) #define ii pair<ll,ll> #define vi vector<ll> #define vii vector<ii> #define ff first #define ss second #define cd complex<double> #define vcd vector<cd> #define ldd long double #define dbgLine cout<<"Line : "<<__LINE__<<'\n' #define all(x) (x).begin(),(x).end() using namespace std; const short int __PRECISION = 10; const ll MOD = 1e9+7; const ll INF = 1e17 + 1101; const ll LOGN = 17; const ll MAXN = 1e5+5; const ll ROOTN = 320; const ldd PI = acos(-1); const ldd EPS = 1e-7; struct Segtree { ll st[MAXN*4], lz[MAXN*4]; inline void push(ll node, ll ss, ll se) { if(lz[node] == 0) return; if(ss != se) { lz[node*2+1] += lz[node]; lz[node*2+2] += lz[node]; } // cout<<"pushing ["<<ss<<','<<se<<"] "<<lz[node]<<'\n'; st[node] += (se - ss + 1)*lz[node]; lz[node] = 0; } void upd(ll node,ll ss, ll se, ll l, ll r, ll val) { push(node, ss, se); if(r < ss or l > se) return; if(l <= ss and r >= se) { lz[node] += val; push(node,ss,se); return; } ll mid = (ss+se)/2; upd(node*2+1, ss, mid, l, r, val); upd(node*2+2, mid + 1, se, l, r, val); st[node] += st[node*2+1] + st[node*2+2]; push(node, ss, se); } ll quer(ll node, ll ss, ll se,ll i) { push(node,ss,se); assert(!(i < ss or i > se)); if(ss == se) return st[node]; ll mid = (ss + se)/2; return ((i > mid) ? quer(node*2+2, mid + 1, se, i) : quer(node*2+1, ss, mid, i)); } Segtree() { int i; FOR(i, 4* MAXN) st[i] = lz[i] = 0; } inline void update(ll l, ll r, ll val) { if (l > r)return; upd(0,0,MAXN,l,r,val); } inline ll query(ll i) { return quer(0,0,MAXN,i); } } S; int main() { /* ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); */ int N, i, j, k; cin>>N; pair<int,int> pole[N]; FOR(i,N) { cin>>j>>k; pole[i] = mp(j,k); } sort(pole, pole + N); int top = 0; set<int> partitions; partitions.insert(0); // partitions.insert(99999999); S.update(0, 0, MAXN); FOR(i, N) { if (S.query(top) > 0 and top < pole[i].ff) partitions.insert(top); top = pole[i].ff; if(pole[i].ss == 0) continue; set<int> :: iterator it = partitions.lower_bound(top - pole[i].ss); bool ok = it != partitions.end(); int lst = top, a, b; if(ok) {lst = (*it); S.update(lst + 1, top, 1);} if(!ok or top - pole[i].ss != lst) { --it; S.update((*it) + 1,((*it) + pole[i].ss - top + lst), 1); partitions.insert((*it) + pole[i].ss - top + lst); a = S.query(*it), b = S.query(*it + 1); if(a == b) partitions.erase(it); } if(ok) { a = S.query(lst), b = S.query(lst + 1); if(a == b) partitions.erase(lst); } // cout<<"i = "<<i<<" pole : "<<pole[i].ff<<' '<<pole[i].ss<<"; top = "<<top<<endl; // FORe(j, top) cout<<S.query(j)<<' '; // cout<<"\npartitions : "; // for(int x : partitions) cout<<x<<' '; // cout<<'\n'; } ll ans = 0, tt; FORe(j, top) { tt = S.query(j); ans += (tt*(tt-1))/2; } cout<<ans; /* if(mn > 0) partitions.insert(-top); top = pole[i].ff; if(pole[i].ss == 0) continue; set<int> :: iterator it = (partitions.lower_bound( -(top - pole[i].ss + 1))) int lst = -(*it); S.update(lst, top, 1); if (lst == 0) continue; if(S.query(lst, lst) == S.query(lst - 1, lst - 1)) partitions.erase(lst); it++; assert(it != S.end()); int left = pole[i].ss - top + pole[i].ss - 1; if(left == 0) continue; S.update((*it), (*it) + left - 1, 1); partitions.insert((*it) + left) */ 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...