zoukankan      html  css  js  c++  java
  • 区间修改点查询 HDU1556

      1 #include <iostream>
      2 #include <cstdio>
      3 
      4 using namespace std;
      5 
      6 struct Node
      7 {
      8     int l,r;
      9     int v;
     10     int lz;
     11 }bn[400000];
     12 
     13 void build(int k,int l,int r)
     14 {
     15     bn[k].l=l;
     16     bn[k].r=r;
     17     bn[k].lz=0;
     18     if(bn[k].l==bn[k].r)
     19     {
     20         bn[k].v=0;
     21         return ;
     22     }
     23     int lk=k*2;
     24     int rk=lk+1;
     25     int mid=(l+r)/2;
     26     build(lk,l,mid);
     27     build(rk,mid+1,r);
     28     bn[k].v=0;
     29 }
     30 
     31 void push(int k)
     32 {
     33     int lk=k*2;
     34     int rk=lk+1;
     35     bn[lk].v+=bn[k].lz;
     36     bn[rk].v+=bn[k].lz;
     37     bn[lk].lz+=bn[k].lz;
     38     bn[rk].lz+=bn[k].lz;
     39     bn[k].lz=0;
     40 }
     41 
     42 void change(int k,int l,int r)
     43 {
     44     if(bn[k].l==l&&bn[k].r==r)
     45     {
     46         bn[k].lz++;
     47         bn[k].v=bn[k].lz*(bn[k].r-bn[k].l+1);
     48         return ;
     49     }
     50     if(bn[k].lz)
     51         push(k);
     52     int lk=k*2;
     53     int rk=lk+1;
     54     if(bn[lk].r>=r)
     55         change(lk,l,r);
     56     else if(bn[rk].l<=l)
     57         change(rk,l,r);
     58     else
     59     {
     60         change(lk,l,bn[lk].r);
     61         change(rk,bn[rk].l,r);
     62     }
     63     bn[k].v=bn[rk].v+bn[lk].v;
     64 }
     65 
     66 int ans;
     67 void search(int k,int i)
     68 {
     69     if(bn[k].l==i&&bn[k].r==i)
     70     {
     71         ans=bn[k].v;
     72         return ;
     73     }
     74     if(bn[k].lz)
     75         push(k);
     76     int lk=k*2;
     77     int rk=lk+1;
     78     if(bn[lk].r>=i)
     79         search(lk,i);
     80     else if(bn[rk].l<=i)
     81         search(rk,i);
     82     bn[k].v=bn[rk].v+bn[lk].v;
     83 }
     84 
     85 int main()
     86 {
     87     int n;
     88     while(cin>>n&&n)
     89     {
     90         int a,b;
     91         build(1,1,n);
     92         for(int i=1;i<=n;i++)
     93         {
     94             scanf("%d%d",&a,&b);
     95             change(1,a,b);
     96         }
     97         search(1,1);
     98         cout<<ans;
     99         for(int i=2;i<=n;i++)
    100         {
    101             search(1,i);
    102             cout<<" "<<ans;
    103         }
    104         cout<<endl;
    105     }
    106     return 0;
    107 }
    View Code

    这是正常线段树做法

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 int an[100010];
     8 int ans[100010];
     9 
    10 int main()
    11 {
    12     int n;
    13     while(cin>>n&&n)
    14     {
    15         memset(an,0,sizeof(an));
    16         memset(ans,0,sizeof(ans));
    17         int a,b;
    18         for(int i=1;i<=n;i++)
    19         {
    20             scanf("%d%d",&a,&b);
    21             an[a]+=1;
    22             an[b+1]+=-1;
    23         }
    24         for(int i=1;i<=n;i++)
    25         {
    26             ans[i]=ans[i-1]+an[i];
    27         }
    28         cout<<ans[1];
    29         for(int i=2;i<=n;i++)
    30         {
    31             cout<<" "<<ans[i];
    32         }
    33         cout<<endl;
    34     }
    35     return 0;
    36 }
    View Code

    简便方法,时间复杂度为N

  • 相关阅读:
    POJ 1003 解题报告
    POJ 1004 解题报告
    POJ-1002 解题报告
    vi--文本编辑常用快捷键之光标移动
    常用图表工具
    September 05th 2017 Week 36th Tuesday
    September 04th 2017 Week 36th Monday
    September 03rd 2017 Week 36th Sunday
    September 02nd 2017 Week 35th Saturday
    September 01st 2017 Week 35th Friday
  • 原文地址:https://www.cnblogs.com/wsruning/p/4691416.html
Copyright © 2011-2022 走看看