zoukankan      html  css  js  c++  java
  • [poj] 2828 Buy Tickets

    原题

    简单的线段树问题~

    首先,最后一个人的位置是准确的,而每个人的位置就是倒着推时当前没填的人的该位置(可想而知),所以只要维护现在区间里还没被填的有多少个就可以了!

    #include<cstdio>
    #define N 200010
    using namespace std;
    int n,pos[N],nm[N];
    struct hhh
    {
        int l,r,data,sum;
    }tre[4*N];
    
    int read()
    {
        int ans=0,fu=1;
        char j=getchar();
        for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
        if (j=='-') fu=-1,j=getchar();
        for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
        return ans*fu;
    }
    
    void build(int i,int l,int r)
    {
        tre[i].l=l;
        tre[i].r=r;
        tre[i].data=0;
        tre[i].sum=r-l+1;
        if (l==r) return ;
        build(i*2,l,(l+r)>>1);
        build(i*2+1,((l+r)>>1)+1,r);
        tre[i].sum=tre[i*2].sum+tre[i*2+1].sum;
    }
    
    void modify(int i,int x,int y)
    {
        if (tre[i].l==tre[i].r)
        {
    	tre[i].data=y;
    	tre[i].sum=0;
    	return ;
        }
        if (tre[i*2].sum<x) modify(i*2+1,x-tre[i*2].sum,y);
        else modify(i*2,x,y);
        tre[i].sum=tre[i*2].sum+tre[i*2+1].sum;
    }
    
    int query(int i,int x)
    {
        if (tre[i].l==tre[i].r) return tre[i].data;
        int mid=(tre[i].l+tre[i].r)>>1;
        if (x>mid) return query(i*2+1,x);
        else return query(i*2,x);
    }
    
    int main()
    {
        while (~scanf("%d",&n))
        {
    	build(1,1,n);
    	for (int i=1;i<=n;i++)
    	{
    	    pos[i]=read();
    	    nm[i]=read();
    	}
    	for (int i=n;i>=1;i--)
    	    modify(1,pos[i]+1,nm[i]);
    	for (int i=1;i<=n;i++)
    	    printf("%d%c",query(1,i)," 
    "[i==n]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    "上传"组件:<upload> —— 快应用组件库H-UI
    Xcode免证书调试
    iOS-OC-基本控件之UIPageControl
    关于装完系统出现a disk read error occurred的解决方法
    iOS-OC-基本控件之UITextField
    windows常用快捷键
    制作无广告启动盘
    自制垃圾批处理软件
    学习总结
    如何将BroadcastReceiver中的信息传到Activity中
  • 原文地址:https://www.cnblogs.com/mrha/p/7880814.html
Copyright © 2011-2022 走看看