1 条题解

  • 0
    @ 2023-4-20 19:58:29

    image

    #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
    上传者