Submission #1013623

#TimeUsernameProblemLanguageResultExecution timeMemory
1013623Ivo_12Fish (IOI08_fish)C++98
9 / 100
398 ms26572 KiB
#include <bits/stdc++.h> #define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define ll long long #define mp make_pair #define pb push_back #define F first #define S second #define pii pair < int, int > using namespace std; const int N = 5e5+10, K = 5e5+10; const int logN = 20, maxN = (1<<20), startpos = maxN-1; int n, k, m; pii ribe[N]; int najvecidrag[K]; int draginterval[K]; int cur; int lowout[K]; int st[maxN<<1]; vector < int > dragulji; int sol; bool rip[K]; //bool ripp[7010][7010]; int temp; int newcol[K]; int granice[K]; bool dragsort1( int a, int b ) { if(najvecidrag[a] > najvecidrag[b]) return 1; return 0; } bool dragsort2( int a, int b ) { if(lowout[a] > lowout[b]) return 1; return 0; } int add( int a, int b ) { return (a + b >= m) ? a+b-m : a+b; } int mul( int a, int b ) { return (ll) a * b % m; } inline void merge( int i ) { st[i] = mul(st[i*2+1], st[i*2+2]); return; } inline void update( int i, int v ) { i += startpos; st[i] += v; while(i != 0) { i = (i - 1) / 2; merge(i); } return; } int product( int i, int l, int r, int lo, int hi ) { if(l>=lo && r<=hi) return st[i]; if(r<=lo || l>=hi) return 1; return mul(product(i*2+1, l, l + (r - l) / 2, lo, hi), product(i*2+2, l + (r - l) / 2, r, lo, hi)); } int main( void ) { FIO cin >> n >> k >> m; for(int i = 0; i < n; i++) { cin >> ribe[i].F >> ribe[i].S; ribe[i].S--; } sort(ribe, ribe + n); cur = 0; for(int i = 0; i < n; i++) { najvecidrag[ribe[i].S] = i; } for(int i = 0; i < k; i++) dragulji.pb(i); sort(dragulji.begin(), dragulji.end(), dragsort2); for(int i = 0; i < k; i++) { newcol[dragulji[i]] = i; } dragulji.clear(); for(int i = 0; i < n; i++) { ribe[i].S = newcol[ribe[i].S]; } for(int i = 0; i < n; i++) { najvecidrag[ribe[i].S] = i; while(ribe[cur].F * 2 <= ribe[i].F) { cur++; } draginterval[ribe[i].S] = cur; lowout[ribe[i].S] = n; } for(int i = 0; i < n; i++) { if(i >= draginterval[ribe[i].S]) { lowout[ribe[i].S] = min(lowout[ribe[i].S], i); } } for(int i = 0; i < maxN<<1; i++) st[i] = 1; for(int i = 0; i < n; i++) { update(ribe[i].S, 1); } for(int i = 0; i < k; i++) { dragulji.pb(i); } sort(dragulji.begin(), dragulji.end(), dragsort1); cur = n-1; for(int i = 0; i < k; i++) { while(cur >= 0 && draginterval[dragulji[i]] <= cur) { if(!rip[ribe[cur].S])update(ribe[cur].S, -1); cur--; } // cout << st[startpos+0] << " " << st[startpos+1] << " " << st[startpos+2] << " " << st[startpos+3] << "\n"; update(dragulji[i], -1); sol = add(sol, st[0]); update(dragulji[i], 1-st[dragulji[i] + startpos]); rip[dragulji[i]] = 1; // cout << st[startpos+0] << " " << st[startpos+1] << " " << st[startpos+2] << " " << st[startpos+3] << "\n\n"; } for(int i = 0; i < k; i++) rip[i] = 0; // cout << sol << "\n"; cur = 0; for(int i = 0; i < k; i++) granice[i] = k; sort(dragulji.begin(), dragulji.end(), dragsort2); reverse(dragulji.begin(), dragulji.end()); for(int i = 0; i < k; i++) { while(lowout[dragulji[cur]] < draginterval[i]) { granice[dragulji[cur]] = i; cur++; } } cur = n-1; sort(dragulji.begin(), dragulji.end(), dragsort1); for(int i = 0; i < maxN<<1; i++) st[i] = 1; for(int i = 0; i < n; i++) { update(ribe[i].S, 1); } // for(int i = 0; i < k; i++) { while(cur >= 0 && draginterval[dragulji[i]] <= cur) { update(ribe[cur].S, -1); cur--; } temp = 1 - st[dragulji[i] + startpos]; update(dragulji[i], temp); sol = add(sol, product(0, 0, maxN, 0, granice[dragulji[i]])); // cout << product(0, 0, maxN, 0, granice[i]) << "\n"; update(dragulji[i], -temp); } // cout << "\n"; // for(int i = 0; i < n; i++) cout << ribe[i].F << " " << ribe[i].S << "\n"; // cout << sol; 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...
#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...