1 条题解
-
0
#include <bits/stdc++.h> #define pb emplace_back typedef long long ll; typedef std::pair<int,int> pii; const int maxn = 3e5 + 5; int n,m,Q,cnt,pre[maxn],X[maxn],Y[maxn]; std::list<pii> G[maxn]; std::vector<ll> s[maxn]; int lowbit(int x) { return x & -x; } int c[maxn << 1]; void add(int x,int y) { for(;x <= cnt;x += lowbit(x))c[x] += y; return ; } int query(int x) { int ans = 0; for(;x;x -= lowbit(x))ans += c[x]; return ans; } int Query(int x) { int ans = 0,sum = 0; for(int p = (1 << 19);p;p >>= 1) { if(ans + p >= cnt)continue ; if(sum + c[ans + p] < x)sum += c[ans += p]; } return ans + 1; } int main() { scanf("%d %d %d",&n,&m,&Q); cnt = std::max(n , m) + Q; for(int i = 1;i <= Q;++ i) { scanf("%d %d",&X[i],&Y[i]); if(Y[i] != m)G[X[i]].pb(Y[i] , i); } for(int i = 1;i <= cnt;++ i)add(i , 1); for(int i = 1;i <= n;++ i) { for(auto& [v , id] : G[i]) { add(pre[id] = Query(v) , -1); } for(auto& [v , id] : G[i]) { add(pre[id] , 1); } } for(int i = 1;i <= Q;++ i) { int r = Query(X[i]); ll val,ans; add(r , -1); if(r <= n)val = 1ll * r * m; else val = s[0][r - n - 1]; if(Y[i] != m) { s[X[i]].pb(val); if(pre[i] < m)ans = 1ll * (X[i] - 1) * m + pre[i]; else ans = s[X[i]][pre[i] - m]; } else ans = val; s[0].pb(ans); printf("%lld\n",ans); } return 0; }
- 1
信息
- ID
- 173
- 时间
- 900ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者