zoukankan      html  css  js  c++  java
  • 指针版线段树

    只是作一下,以后必须得写数组版的。。。???(然而很好写?

    哦对,唯一的好处就是内存少一点,没了。(coding量似乎并不会少很多?也不会多很多?雾)

    还有很重要的一点就是慢。。。(尽管虽然没有慢多少?该卡还是卡?)

    哎呀真是好纠结。。。

    问了些神犇,似乎大家并不知道线段树还能用数组写。。。

    呵呵。。。

    然后看了一眼内存,指针严格开2n-1就好,而数组其实是要开4n的。。。。

    COJ上的数据太水了,数据只有大概。。。

    所以呢。。。。。要不我先用指针写几次再说?

    不过是真心写着舒服。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<algorithm>
      5 #include<queue>
      6 #include<cstring>
      7 #define PAU putchar(' ')
      8 #define ENT putchar('
    ')
      9 #define CH for(int d=0;d<=1;d++) if(ch[d])
     10 using namespace std;
     11 const int maxn=1000000+10,maxnode=1080000+10,inf=-1u>>1;
     12 struct node{
     13     node*ch[2];int mi,mx,sm;
     14     void sett(int tag){mi=mx=sm=tag;return;}
     15     void update(){
     16         mi=inf;mx=-inf;sm=0;
     17         CH{mi=min(mi,ch[d]->mi);mx=max(mx,ch[d]->mx);sm+=ch[d]->sm;}
     18         return;
     19     }
     20 }seg[maxnode],*root,*nodecnt=seg;
     21 int A[maxn],n,Q;
     22 void build(node*&x,int L,int R){
     23     x=nodecnt++;
     24     if(L==R) x->sett(A[L]);
     25     else{
     26         int M=L+R>>1;
     27         build(x->ch[0],L,M);
     28         build(x->ch[1],M+1,R);
     29         x->update();
     30     } return;
     31 }
     32 int _mi,_mx,_sm,pos,cv,ql,qr;
     33 void query(node*x,int L,int R){
     34     if(ql<=L&&R<=qr){
     35         _mi=min(_mi,x->mi);
     36         _mx=max(_mx,x->mx);
     37         _sm+=x->sm;
     38     }
     39     else{
     40         int M=L+R>>1;
     41         if(ql<=M) query(x->ch[0],L,M);
     42         if(qr>M) query(x->ch[1],M+1,R);
     43     }
     44 }
     45 void update(node*&x,int L,int R){
     46     if(L==R) x->sett(cv);
     47     else{
     48         int M=L+R>>1;
     49         if(pos<=M) update(x->ch[0],L,M);
     50         else update(x->ch[1],M+1,R);
     51         x->update();
     52     }
     53 }
     54 inline int read(){
     55     int x=0,sig=1;char ch=getchar();
     56     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
     57     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
     58     return x*=sig;
     59 }
     60 inline void write(int x){
     61     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
     62     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
     63     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
     64 }
     65 inline char readc(){
     66     char x=getchar();
     67     while(!isalpha(x)) x=getchar();
     68     return x;
     69 }
     70 void init(){
     71     n=read();
     72     for(int i=1;i<=n;i++) A[i]=read();
     73     build(root,1,n);
     74     return;
     75 }
     76 void work(){
     77     Q=read();char tp;
     78     while(Q--){
     79         tp=readc();ql=read();qr=read();
     80         if(tp=='Q'){
     81             _sm=0;_mx=-inf;_mi=inf;
     82             query(root,1,n);
     83             putchar('M');
     84             putchar('a');
     85             putchar('x');
     86             putchar('N');
     87             putchar('u');
     88             putchar('m');
     89             putchar(':');
     90             putchar(' ');
     91             write(_mx);
     92             putchar(',');
     93             putchar(' ');
     94             putchar('M');
     95             putchar('i');
     96             putchar('n');
     97             putchar('N');
     98             putchar('u');
     99             putchar('m');
    100             putchar(':');
    101             putchar(' ');
    102             write(_mi);
    103             putchar(',');
    104             putchar(' ');
    105             putchar('S');
    106             putchar('u');
    107             putchar('m');
    108             putchar(':');
    109             putchar(' ');
    110             write(_sm);
    111             ENT;
    112         }
    113         else{
    114             pos=ql;cv=qr;
    115             update(root,1,n);
    116         }
    117     }
    118     return;
    119 }
    120 void print(){
    121     return;
    122 }
    123 int main(){init();work();print();return 0;}
  • 相关阅读:
    vector存入共享内存(了解)
    vector内存分配
    关于传值的小问题
    c++11 lambda(匿名函数)
    std::function,std::bind复习
    项目分析(人物上线消息)
    mongo 1067错误
    随笔1
    随笔
    交换机的体系结构和各部件说明
  • 原文地址:https://www.cnblogs.com/chxer/p/4567735.html
Copyright © 2011-2022 走看看