码迷,mamicode.com
首页 > 其他好文 > 详细

luogu3960 列队

时间:2018-02-19 19:39:21      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:include   参考   lld   markdown   name   struct   scan   print   ack   

参考这篇

#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\n", ans);
        vec[n+1].push_back(ans);
    }
    return 0;
}

luogu3960 列队

标签:include   参考   lld   markdown   name   struct   scan   print   ack   

原文地址:https://www.cnblogs.com/poorpool/p/8454255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!