zoukankan      html  css  js  c++  java
  • 【比赛】NOIP2017 列队

    一直忘了发,现在赶快补

    用权值线段树维护有人的位置,动态开点省空间

    多加的人用个vector存下来就可以了

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=300000+10;
    int n,m,q,N;
    std::vector<ll> V[MAXN];
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    #define Mid ((l+r)>>1)
    #define lson l,Mid
    #define rson Mid+1,r
    struct Segment_Tree{
    	int sum[MAXN<<5],lc[MAXN<<5],rc[MAXN<<5],root[MAXN<<5],cnt;
    	inline void Update(int &rt,int l,int r,int ps)
    	{
    		if(!rt)rt=++cnt;
    		sum[rt]++;
    		if(l==r)return ;
    		else
    		{
    			if(ps<=Mid)Update(lc[rt],lson,ps);
    			else Update(rc[rt],rson,ps);
    		}
    	}
    	inline int Query(int rt,int l,int r,int k)
    	{
    		if(l==r)return l;
    		else
    		{
    			int t=Mid-l+1-sum[lc[rt]];
    			if(t>=k)return Query(lc[rt],lson,k);
    			else return Query(rc[rt],rson,k-t);
    		}
    	}
    };
    Segment_Tree T;
    #undef Mid
    #undef lson
    #undef rson
    int main()
    {
    	freopen("phalanx.in","r",stdin);
    	freopen("phalanx.out","w",stdout);
    	read(n);read(m);read(q);N=max(n,m)+q;
    	while(q--)
    	{
    		int x,y;read(x);read(y);
    		ll now;
    		if(y==m)
    		{
    			T.Update(T.root[n+1],1,N,now=T.Query(T.root[n+1],1,N,x));
    			now=now<=n?1ll*now*m:V[n+1][now-n-1];
    			V[n+1].push_back(now);
    			write(now,'
    ');
    		}
    		else
    		{
    			T.Update(T.root[x],1,N,now=T.Query(T.root[x],1,N,y));
    			now=now<m?1ll*(x-1)*m+now:V[x][now-m];
    			V[n+1].push_back(now);
    			write(now,'
    ');
    			T.Update(T.root[n+1],1,N,now=T.Query(T.root[n+1],1,N,x));
    			now=now<=n?1ll*now*m:V[n+1][now-n-1];
    			V[x].push_back(now);
    		}
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    HDU-1102 Constructing Roads ( 最小生成树 )
    POJ-1287 Networking ( 最小生成树 )
    HDU-1272 小希的迷宫 ( 并查集 )
    Java基本数据类型、关键字
    观察者模式
    Android系统启动过程分析
    Activity启动过程源码分析(Android 8.0)
    Okhttp解析—Okhttp概览
    Okhttp解析—Interceptor详解
    Okhttp源码分析--基本使用流程分析
  • 原文地址:https://www.cnblogs.com/hongyj/p/9345935.html
Copyright © 2011-2022 走看看