• hdu 4893 线段树lazy wa代码 先放这里 我还会回来的!!


      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<queue>
      6 #include<math.h>
      7 #include<algorithm>
      8 #include<vector>
      9 #define maxx 100010
     10 using namespace std;
     11 #define ss __int64
     12 
     13 struct node {int l,r;ss sum; bool flag;};
     14 node tree[maxx*4];
     15 ss f[100];
     16 
     17 void getfib()
     18 {
     19     f[0]=f[1]=1;
     20     for(int i=2;i<=90;i++)
     21         {
     22             f[i]=f[i-1]+f[i-2];
     23             //printf("%I64d
    ",f[i]);
     24         }
     25 }
     26 
     27 int solve(ss x)  //jiang  x  bian wei  zui jin d fib
     28 {
     29     int l=0,r=90,best=0;
     30     while(l<r)
     31     {
     32         int mid=(l+r)/2;
     33         if(f[mid]<=x)
     34         {
     35             l=mid+1;
     36             best=max(best,mid);
     37         }
     38         else
     39             r=mid-1;
     40     }
     41     return best;
     42 }
     43 
     44 void build(int left,int right,int k)
     45 {
     46     int mid;
     47     tree[k].l=left;
     48     tree[k].r=right;
     49     tree[k].sum=0;
     50     tree[k].flag=false;
     51     if(left==right)
     52         return ;
     53     mid=(left+right)/2;
     54     build(left,mid,k*2);
     55     build(mid+1,right,k*2+1);
     56 }
     57 
     58 void down(int k)
     59 {
     60     if(tree[k].flag==false)
     61        return ;
     62     tree[k].flag=false;
     63     if(tree[k].l==tree[k].r)
     64     {
     65 
     66         int temp,a,b;
     67         temp=solve(tree[k].sum);
     68         printf("1----%d
    ",tree[k].sum);
     69         a=abs(tree[k].sum-f[temp]);
     70         b=abs(tree[k].sum-f[temp+1]);
     71         if(a<b)
     72         {
     73             tree[k].sum=f[temp];
     74         }
     75         else if(a==b)
     76         {
     77             tree[k].sum=min(f[temp],f[temp+1]);
     78         }
     79         else
     80             tree[k].sum=f[temp+1];
     81         printf("2------%d
    ",tree[k].sum);
     82         return ;
     83 
     84     }
     85     down(k*2);
     86     down(k*2+1);
     87     tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
     88 }
     89 
     90 int sum(int left,int right,int k)
     91 {
     92     if(tree[k].l==left&&tree[k].r==right)
     93     {
     94         if(tree[k].flag)
     95             down(k);
     96         return tree[k].sum;
     97     }
     98     int mid;
     99     mid=(tree[k].l+tree[k].r)/2;
    100     if(right<=mid)
    101         return sum(left,right,k*2);
    102     else if(left>=mid+1)
    103         return sum(left,right,k*2+1);
    104     else
    105         return sum(left,mid,k*2)+sum(mid+1,right,k*2+1);
    106 }
    107 
    108 void add(int x,int zhi,int k)
    109 {
    110     if(tree[k].l==x&&x==tree[k].r)
    111     {
    112         if(tree[k].flag)
    113             down(k);
    114         tree[k].sum+=zhi;
    115         return ;
    116     }
    117     int mid;
    118     mid=(tree[k].l+tree[k].r)/2;
    119     if(x<=mid)
    120         add(x,zhi,k*2);
    121     else
    122         add(x,zhi,k*2+1);
    123     tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
    124 }
    125 
    126 void biaoji(int left,int right,int k)
    127 {
    128     if(tree[k].l==left&&tree[k].r==right)
    129     {
    130         printf("biao  %d %d
    ",tree[k].l,tree[k].r);
    131         tree[k].flag=true;
    132         return ;
    133     }
    134     int mid;
    135     mid=(tree[k].l+tree[k].r)/2;
    136     if(right<=mid)
    137         biaoji(left,right,k*2);
    138     else if(left>=mid+1)
    139         biaoji(left,right,k*2+1);
    140     else
    141     {
    142         biaoji(left,mid,k*2);
    143         biaoji(mid+1,right,k*2+1);
    144     }
    145 }
    146 
    147 int main()
    148 {
    149     int i,j,n,m,a,b,c;
    150     getfib();
    151     while(~scanf("%d%d",&n,&m))
    152     {
    153         build(1,n,1);
    154         while(m--)
    155         {
    156             scanf("%d%d%d",&a,&b,&c);
    157             if(a==1)
    158                 add(b,c,1);
    159             if(a==2)
    160                 printf("%d
    ",sum(b,c,1));
    161             if(a==3)
    162                 biaoji(b,c,1);
    163         }
    164     }
    165     return 0;
    166 }
  • 相关阅读:
    软件工程最后一次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第一次作业
    软件工程第二次作业
    软件工程第一次作业
    2020年最后一次软工作业
    2020年第四次软工作业(第二次结对作业)
    2020年第三次软工作业(第一次结对作业)
    2020年第二次软工作业
  • 原文地址:https://www.cnblogs.com/assult/p/3878352.html
Copyright © 2020-2023  润新知