zoukankan      html  css  js  c++  java
  • 集训·列队

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=300005;
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    int n,m,q,u,v,tot,rt[N<<4],cnt,lson[N<<4],rson[N<<4],sum[N<<4],pos;
    std::vector<int> pb[N];
    inline int query(int now,int l,int r,int val)
    {
    	if(l==r)return l;
    	int mid=((l+r)>>1),tmp=mid-l+1-sum[lson[now]];
    	if(val<=tmp)return query(lson[now],l,mid,val);
    	return query(rson[now],mid+1,r,val-tmp);
    }
    inline void modify(int &now,int l,int r)
    {
    	if(!now)now=++cnt;
    	sum[now]++;
    	if(l==r)return;
    	int mid=((l+r)>>1);
    	if(pos<=mid)modify(lson[now],l,mid);
    	else modify(rson[now],mid+1,r);
    }
    inline int sp_sol(int x,int y)
    {
    	pos=query(rt[n+1],1,tot,x);
    	modify(rt[n+1],1,tot);
    	int ans;
    	if(pos<=n)ans=pos*m;
    	else ans=pb[n+1][pos-n-1];
    	if(y)pb[n+1].push_back(y);
    	else pb[n+1].push_back(ans);
    	return ans;
    }
    inline int sol(int x,int y)
    {
    	pos=query(rt[x],1,tot,y);
    	modify(rt[x],1,tot);
    	int ans;
    	if(pos<m)ans=(x-1)*m+pos;
    	else ans=pb[x][pos-m];
    	pb[x].push_back(sp_sol(x,ans));
    	return ans;
    }
    signed main(signed argc, char const *argv[])
    {
    //	freopen("phalanx.in","r",stdin);
    //	freopen("phalanx.out","w",stdout);
    	n=read();m=read();q=read();
    	tot=max(n,m)+q;
    	while(q--)
    	{
    		u=read();v=read();
    		if(v==m)cout<<sp_sol(u,0)<<endl;
    		else cout<<sol(u,v)<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    2021/9/20 开始排序算法
    快速排序(自己版本)
    2021/9/17(栈实现+中后缀表达式求值)
    2021/9/18+19(中缀转后缀 + 递归 迷宫 + 八皇后)
    20212021/9/13 稀疏数组
    2021/9/12 线性表之ArrayList
    开发环境重整
    Nginx入门
    《财富的帝国》读书笔记
    Linux入门
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678651.html
Copyright © 2011-2022 走看看