zoukankan      html  css  js  c++  java
  • hdu 4027 Can you answer these queries? 线段树

    线段树+剪枝优化!!!

    代码如下:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<iomanip>
     5 #include<cmath>
     6 #include<cstring>
     7 #include<string>
     8 #include<vector>
     9 #include<stdlib.h>
    10 #define ll __int64
    11 #define pi acos(-1.0)
    12 #define lson i<<1
    13 #define rson i<<1|1
    14 #define MAX 100001
    15 using namespace std;
    16 ll a[MAX];
    17 struct tree
    18 {
    19     int l,r;
    20     ll sum;
    21     bool flag;
    22 }T[3*MAX];
    23 void built(int i,int l,int r)
    24 {
    25     T[i].l=l;
    26     T[i].r=r;
    27     T[i].flag=1;
    28     if(l==r){
    29         T[i].sum=a[l];
    30         if(a[l]<=1) T[i].flag=0;
    31         return ;
    32     }
    33     int m=(l+r)>>1;
    34     built(lson,l,m);
    35     built(rson,m+1,r);
    36     T[i].sum=T[lson].sum+T[rson].sum;
    37     T[i].flag=T[lson].flag||T[rson].flag;
    38 }
    39 void update(int i,int l,int r)
    40 {
    41     if(!T[i].flag) return ;
    42     if(T[i].l==l&&T[i].r==r&&l==r){
    43         T[i].sum=(ll)sqrt(T[i].sum*1.0);
    44         if(T[i].sum<=1) T[i].flag=0;
    45         return ;
    46     }
    47     int m=(T[i].l+T[i].r)>>1;
    48     if(r<=m) update(lson,l,r);
    49     else if(l>m) update(rson,l,r);
    50     else{
    51         update(lson,l,m);
    52         update(rson,m+1,r);
    53     }
    54     T[i].sum=T[lson].sum+T[rson].sum;
    55     T[i].flag=T[lson].flag||T[rson].flag;
    56 }
    57 ll query(int i,int l,int r)
    58 {
    59     if(T[i].l==l&&T[i].r==r)
    60         return T[i].sum;
    61     int m=(T[i].l+T[i].r)>>1;
    62     if(r<=m) return query(lson,l,r);
    63     else if(l>m) return query(rson,l,r);
    64     else return query(lson,l,m)+query(rson,m+1,r);
    65     //T[i].sum=T[lson].sum+T[rson].sum;
    66 }
    67 int main()
    68 {
    69     int n,m,ca=0,i,j,q,x,y;
    70     while(scanf("%d",&n)!=EOF)
    71     {
    72         for(i=1;i<=n;i++) scanf("%I64d",&a[i]);
    73         built(1,1,n);
    74         scanf("%d",&m);
    75         printf("Case #%d:
    ",++ca);
    76         for(i=0;i<m;i++){
    77             scanf("%d%d%d",&q,&x,&y);
    78             if(x>y) swap(x,y);
    79             if(q) printf("%I64d
    ",query(1,x,y));
    80             else update(1,x,y);
    81         }
    82         printf("
    ");
    83     }
    84     return 0;
    85 }
    View Code
  • 相关阅读:
    wp8 入门到精通 测量代码执行时间
    过滤器——Filter
    hisui培训笔记
    监听器——servlet
    easyui导出excel表格和遇到的问题
    Java自定义注解
    Json
    Ajax
    探索Java中new一个对象时发生了什么
    SpringBoot常用注解
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3294208.html
Copyright © 2011-2022 走看看