zoukankan      html  css  js  c++  java
  • hdu 2795 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <cstring>
     6 #include <queue>
     7 #include <vector>
     8 
     9 #define maxn 222222
    10 #define lson l,mid,u<<1
    11 #define rson mid+1,r,u<<1|1
    12 using namespace std;
    13 
    14 const int INF = 0x3f3f3f;
    15 int h,w,n;
    16 int seg[maxn<<2];
    17 int row;
    18 
    19 int Push_UP(int u){
    20     seg[u] = max(seg[u<<1],seg[u<<1|1]);  //****这个地方 u<<1|1 不能换为 u << 1 +1 
    21 }
    22 void build(int l,int r,int u){
    23     if(l == r){
    24          seg[u] = w;
    25          return;
    26     }
    27     int mid = (l + r)>>1; 
    28     build(lson);
    29     build(rson);
    30     Push_UP(u);
    31 }
    32 void Update(int loc,int num,int l,int r,int u){
    33     if(l == r){  // 这个地方要注意!! 
    34         seg[u] -= num;  
    35         return;
    36     }
    37     int mid = (l + r)/2; 
    38     if(loc <= mid) Update(loc,num,lson);
    39     else           Update(loc,num,rson);
    40     Push_UP(u);
    41 }
    42 
    43 int Query(int num,int l,int r,int u){
    44     if(seg[u] < num) return -1;
    45     
    46     if(l == r && seg[u] >= num){
    47         return l;
    48     }
    49     int ret = 0;  
    50     int mid = (l + r)/2;
    51     ret = Query(num,lson);
    52     if(ret != -1) return ret;
    53     else          return Query(num,rson);    
    54 }
    55 int main()
    56 {
    57     //if(freopen("input.txt","r",stdin)== NULL)  {printf("Error
    "); exit(0);}
    58     while(cin>>h>>w>>n){
    59         if(h > n) h = n;
    60         build(1,h,1); 
    61         while(n--){
    62             int a;     
    63             scanf("%d
    ",&a);
    64             row = Query(a,1,h,1);
    65             if(row == -1) printf("-1
    ");
    66             else{
    67                 Update(row,a,1,h,1);
    68                 printf("%d
    ",row);
    69             }
    70         }
    71     }
    72 }
    View Code

    参考别人的改进版:

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <cstring>
     6 #include <queue>
     7 #include <vector>
     8 
     9 #define maxn 222222
    10 #define lson l,mid,u<<1
    11 #define rson mid+1,r,u<<1|1
    12 using namespace std;
    13 
    14 const int INF = 0x3f3f3f;
    15 int h,w,n;
    16 int seg[maxn<<2];
    17 
    18 
    19 int Push_UP(int u){
    20     seg[u] = max(seg[u<<1],seg[u<<1|1]);  //****这个地方 u<<1|1 不能换为 u << 1 +1 
    21 }
    22 void build(int l,int r,int u){
    23     if(l == r){
    24          seg[u] = w;
    25          return;
    26     }
    27     int mid = (l + r)>>1; 
    28     build(lson);
    29     build(rson);
    30     Push_UP(u);
    31 }
    32 int Query(int num,int l,int r,int u){
    33     if(l == r ){
    34         seg[u] -= num;
    35         return l;
    36     }
    37     int ret = 0;  
    38     int mid = (l + r)/2;
    39     if(seg[u<<1] >= num)     ret = Query(num,lson);
    40     else                     ret = Query(num,rson);
    41     Push_UP(u);    
    42     return ret;
    43 }
    44 int main()
    45 {
    46     //if(freopen("input.txt","r",stdin)== NULL)  {printf("Error
    "); exit(0);}
    47     while(cin>>h>>w>>n){
    48         if(h > n) h = n;
    49         build(1,h,1); 
    50         while(n--){    
    51             int num; 
    52             scanf("%d
    ",&num);
    53             if(seg[1]<num)  printf("-1
    ");
    54             else          printf("%d
    ",Query(num,1,h,1));
    55         }
    56     }
    57 }
    View Code
  • 相关阅读:
    linux集群实施与部署-----Nginx
    以太网链路聚合简单配置
    配置基于源地址的策略路由
    shell --Day 6
    ps初学--Day 1部分工具使用
    shell --Day 5
    shell ——Day 4
    shell——Day3
    shell——Day 2
    初学shell——Day1
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3219992.html
Copyright © 2011-2022 走看看