zoukankan      html  css  js  c++  java
  • luogu3960 列队

    参考这篇

    #include <iostream>
    #include <cstdio>
    #include <vector>
    using namespace std;
    typedef long long ll;
    int n, m, q, maxn, rot[300005], cnt, uu, vv;
    ll ans;
    vector<ll> vec[300005];
    struct Node{
    	int l, r, sum;
    }nd[11000005];
    int queryPos(int o, int l, int r, int x){
    	if(l==r)	return l;
    	else{
    		int mid=(l+r)>>1;
    		int siz=mid-l+1-nd[nd[o].l].sum;
    		if(x<=siz)	return queryPos(nd[o].l, l, mid, x);
    		else	return queryPos(nd[o].r, mid+1, r, x-siz);
    	}
    }
    void shanchu(int &o, int l, int r, int x){
    	if(!o)	o = ++cnt;
    	nd[o].sum++;
    	if(l==r)	;
    	else{
    		int mid=(l+r)>>1;
    		if(x<=mid)	shanchu(nd[o].l, l, mid, x);
    		else	shanchu(nd[o].r, mid+1, r, x);
    	}
    }
    void delCol(int x){
    	int pos=queryPos(rot[n+1], 1, maxn, x);
    	shanchu(rot[n+1], 1, maxn, pos);
    	if(pos<=n)	ans = (ll)m * pos;
    	else	ans = vec[n+1][pos-n-1];
    }
    void delRow(int uu, int vv){
    	int pos=queryPos(rot[uu], 1, maxn, vv);
    	shanchu(rot[uu], 1, maxn, pos);
    	delCol(uu);
    	vec[uu].push_back(ans);
    	if(pos<=m-1)	ans = (ll)m * (uu - 1) + pos;
    	else	ans = vec[uu][pos-m];
    }
    int main(){
    	cin>>n>>m>>q;
    	maxn = max(n, m) + q;
    	while(q--){
    		scanf("%d %d", &uu, &vv);
    		if(vv==m)	delCol(uu);
    		else	delRow(uu, vv);
    		printf("%lld
    ", ans);
    		vec[n+1].push_back(ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    并发运行的思维模型
    进程和线程的区别
    拿来主义
    同步组件合作和团队合作 让世界变得更美好
    strace a++;b++;a+b;
    System 88: GDB Overview
    numpy多维数组维度及添加轴的理解
    Numpy入门
    python列表list 和numpy.array区别
    数组的生成方法
  • 原文地址:https://www.cnblogs.com/poorpool/p/8454255.html
Copyright © 2011-2022 走看看