zoukankan      html  css  js  c++  java
  • HDU 2795Billboard

    题意:(刚开始没看懂题啊  很僵硬  )大概意思就是给你一个n*m的海报 然后  让你贴小广告,优先往上和往右,很明显要建树,这里对于数的叶子节点要分类考虑,首先n与K的关系,n<k时建树的叶子节点应该n,反之为k,存入数的是当前存在的位置最多多少,然后遍历树,若左节点的空位大于要求的调用左儿子,反之右儿子,若不存在直接输出-1即可;

    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<map>
    #include<set>
    #include<cstring>
    #include<cstdio>
    #define N 200010
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef struct node{
    	int x;int y;int date;
    }node;
    node a[N*4];
    int b[N];
    void built(int root,int first,int end,int e){
    	if(first==end){
    		a[root].x=first;a[root].y=end;a[root].date=e;
    		return ;
    	}
    	int mid=(first+end)/2;
    	built(root*2,first,mid,e);
    	built(root*2+1,mid+1,end,e);
    	a[root].x=a[root*2].x;a[root].y=a[root*2+1].y;a[root].date=max(a[root*2].date,a[root*2+1].date);
    }
    void U(int root,int first,int end,int e,int p){
    	if(first==end){
    		if(a[root].date<p){
    			b[e]=-1;
    		}
    		else{
    			b[e]=first;
    			a[root].date-=p;
    		}
    		return ;
    	}
    	int mid=(first+end)/2;
    	if(a[root*2].date>=p)  U(root*2,first,mid,e,p);
    	else U(root*2+1,mid+1,end,e,p);
    	a[root].date=max(a[root*2+1].date,a[root*2].date);
    }
    int main(){
    	int m,n,k;
    	while(scanf("%d %d %d",&m,&n,&k)==3){
    		int l;
    		memset(b,0,sizeof(0));
    		int p;
    		if(m>=k){
    			p=k;
    		}
    		else{
    			p=m;
    		}
    		built(1,1,p,n);
    		for(int i=1;i<=k;i++){
    			scanf("%d",&l);
    			U(1,1,p,i,l);
    		}
    		for(int i=1;i<=k;i++){
    			printf("%d
    ",b[i]);
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    都不敢上CSDN了
    什么是函数(function)?
    今天3/8妇女节
    一件有意思的事情:关于std::string和std::auto_ptr
    转两篇Link相关的文章
    DevIL Downloads
    状态模式(State Pattern)
    访问者模式(Visitor Pattern)
    羊皮卷的故事第二章
    备忘录模式(Memento Pattern)
  • 原文地址:https://www.cnblogs.com/wang9897/p/7624400.html
Copyright © 2011-2022 走看看