Submission #1030767

#TimeUsernameProblemLanguageResultExecution timeMemory
1030767huutuanFish (IOI08_fish)C++14
88 / 100
377 ms51052 KiB
#include<bits/stdc++.h> using namespace std; int mod; struct SegmentTree{ int n; vector<int> t; void init(int _n){ n=_n; t.assign(4*n+1, 1); } void update(int k, int l, int r, int pos, int val){ if (l==r){ t[k]+=val; return; } int mid=(l+r)>>1; if (pos<=mid) update(k<<1, l, mid, pos, val); else update(k<<1|1, mid+1, r, pos, val); t[k]=t[k<<1]*t[k<<1|1]%mod; } int get(int k, int l, int r, int L, int R){ if (r<L || R<l) return 1; if (L<=l && r<=R) return t[k]; int mid=(l+r)>>1; return get(k<<1, l, mid, L, R)*get(k<<1|1, mid+1, r, L, R)%mod; } } st; const int N=5e5+10; int n, m, mx[N], pos[N], b[N], cnt[N]; vector<int> v[N]; pair<int, int> a[N]; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> mod; for (int i=1; i<=n; ++i) cin >> a[i].first >> a[i].second; sort(a+1, a+n+1); for (int i=1; i<=n; ++i) mx[a[i].second]=i, v[a[i].second].push_back(a[i].first); m=0; for (int i=1; i<=n; ++i) if (mx[a[i].second]==i){ ++m; pos[a[i].second]=m; b[m]=a[i].second; } st.init(m); int ans=0; for (int i=1, j=0; i<=n; ++i){ while (j<n && a[j+1].first*2<=a[i].first){ ++j; st.update(1, 1, m, pos[a[j].second], 1); ++cnt[a[j].second]; } if (mx[a[i].second]==i){ int p1=1, p2=1; p1=st.get(1, 1, m, 1, pos[a[i].second]-1); p2=p1; int l=pos[a[i].second]+1, r=m; while (l<=r){ int mid=(l+r)>>1; int cc=upper_bound(v[a[i].second].begin(), v[a[i].second].end(), a[mx[b[mid]]].first/2)-v[a[i].second].begin(); if (cc<=cnt[a[i].second]) l=mid+1; else r=mid-1; } p2=p2*st.get(1, 1, m, pos[a[i].second]+1, r)%mod; p1=p1*cnt[a[i].second]%mod; ans=(ans+p1+p2)%mod; } } cout << ans << '\n'; 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...