• 数据结构--线段树--成段更新(poj 3468 裸题)


    鉴于在网上找的代码和我心中的好代码相差较大,贴个自己写的,不好莫怪哈~~

    题目链接:http://poj.org/problem?id=3468

    代码实现:

      1 #include "stdio.h"  //线段树成段更新 poj 3468
      2 #include "string.h"
      3 #include "stdlib.h"
      4 #define N 100005
      5 
      6 typedef struct node {
      7     int x;
      8     int y;
      9     __int64 sum;
     10     __int64 add;
     11 }point;
     12 
     13 point a[3*N];
     14 
     15 void PushDown(int t);
     16 __int64 query(int t,int x,int y);
     17 void update(int t,int x,int y,int k);
     18 void CreatTree(int t,int x,int y);
     19 
     20 int main()
     21 {
     22     int Q,n;
     23     int x,y,z;
     24     char ch[2];
     25     while(scanf("%d%d",&n,&Q)!=-1)
     26     {
     27         CreatTree(1,1,n);
     28         while(Q--)
     29         {
     30             scanf("%s",ch);
     31             if(ch[0]=='Q')
     32             {
     33                 scanf("%d %d",&x,&y);
     34                 printf("%I64d
    ",query(1,x,y));
     35             }
     36             else
     37             {
     38                 scanf("%d %d %d",&x,&y,&z);
     39                 update(1,x,y,z);
     40             }
     41 
     42         }
     43     
     44     }
     45     return 0;
     46 }
     47 
     48 void update(int t,int x,int y,int k)
     49 {
     50     if(a[t].x==x && a[t].y==y)
     51     {
     52         a[t].add+=(__int64)k;
     53         a[t].sum+=(__int64)k*(a[t].y-a[t].x+1);
     54         return ;
     55     }
     56     
     57     PushDown(t);
     58     
     59     int temp=2*t;
     60     int mid=(a[t].x + a[t].y)/2;
     61 
     62     if(y<=mid)
     63         update(temp,x,y,k);
     64     else if(x>mid)
     65         update(temp+1,x,y,k);
     66     else
     67     {
     68         update(temp,x,mid,k);
     69         update(temp+1,mid+1,y,k);
     70     }
     71     a[t].sum=a[temp].sum+a[temp+1].sum;
     72 }
     73 
     74 
     75 void PushDown(int t)  //主要是这儿延迟一步更新。
     76 {
     77     if(a[t].add)
     78     {
     79         int temp=2*t;
     80         a[temp].add  += a[t].add;
     81         a[temp+1].add+= a[t].add;
     82         
     83         a[temp].sum  += a[t].add*(a[temp].y - a[temp].x+1);
     84         a[temp+1].sum+= a[t].add*(a[temp+1].y - a[temp+1].x+1);
     85         a[t].add=0;
     86     }
     87 }
     88 
     89 
     90 __int64 query(int t,int x,int y)
     91 {
     92     if(a[t].x==x && a[t].y==y)
     93         return a[t].sum;
     94     
     95     int mid=(a[t].x + a[t].y)/2;
     96     int temp=2*t;
     97     PushDown(t);
     98     if(y<=mid)
     99         return query(temp,x,y);
    100     else if(x>mid)
    101         return query(temp+1,x,y);
    102     else
    103         return query(temp,x,mid) + query(temp+1,mid+1,y);
    104 
    105 }
    106 
    107 void CreatTree(int t,int x,int y)  //还是建树
    108 {
    109     a[t].x=x;
    110     a[t].y=y;
    111     a[t].add=a[t].sum=0;
    112     if(a[t].x==a[t].y)
    113     {
    114         scanf("%I64d",&a[t].sum);
    115         return ;
    116     }
    117     int mid=(a[t].x + a[t].y)/2;
    118     int temp=2*t;
    119     CreatTree(temp,x,mid);
    120     CreatTree(temp+1,mid+1,y);
    121     a[t].sum+=a[temp].sum + a[temp+1].sum;
    122     return ;
    123 }



  • 相关阅读:
    Printing a DataGridView on DotNet Framework
    对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式
    PetShop配置readme
    关于DGVPrinter.cs中的PrintRange
    foobar2000 0.9.5正式版放出
    Another DataGridView Printer
    getline及读文件总结
    C++中文件的读取操作,如何读取多行数据,如何一个一个的读取数据
    vector的clear和swap
    写程序前不需指定数组中的常量,而是动态编译中决定
  • 原文地址:https://www.cnblogs.com/ruo-yu/p/4412097.html
Copyright © 2020-2023  润新知