zoukankan      html  css  js  c++  java
  • 【生活没有希望】hdu1166敌兵布阵 线段树

    线段树水题刷刷,生活没有希望

    最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树

    于是拿道水题练练手

    短到让人身无可恋

    1 void add(int pos,int x){    for(pos+=M+1;pos;pos/=2)    a[pos]+=x;}
    2 int que(int l,int r){    for(l+=M,r+=M+2,ans=0;l^r^1;l>>=1,r>>=1)ans+=((l&1)?0:a[l|1])+((r&1)?a[r-1]:0);return ans;}

    单点修改和区间查询(通过前缀和可以变成区间修改单点查询,再加特技标记可以变成区间修区间查)

    1         M=1;n+=2;
    2         while(M<n)
    3             M*=2;
    4         M--;
    5         for(int i=1;i<=M+n+1;i++)
    6             a[i]=0;

    初始化(赋初值0是因为这道题多组数据,不然还不用)

     1 #include <cstdio>
     2 int t,n,M,p,l,r,ans,a[131073];char ch;
     3 void add(int pos,int x){    for(pos+=M+1;pos;pos/=2)    a[pos]+=x;}
     4 int que(int l,int r){    for(l+=M,r+=M+2,ans=0;l^r^1;l>>=1,r>>=1)ans+=((l&1)?0:a[l|1])+((r&1)?a[r-1]:0);return ans;}
     5 int main()
     6 {
     7     scanf("%d",&t);
     8     for(int T=1;T<=t;T++)
     9     {
    10         printf("Case %d:
    ",T);
    11         scanf("%d",&n);
    12         M=1;n+=2;
    13         while(M<n)
    14             M*=2;
    15         M--;
    16         for(int i=1;i<=M+n+1;i++)
    17             a[i]=0;
    18         for(int i=1;i<=n;i++)
    19             scanf("%d",&p),add(i,p);
    20         for(ch=getchar();ch!='E' && ch!='Q' && ch!='A' && ch!='S';ch=getchar());
    21         while(ch!='E')
    22         {
    23             switch(ch)
    24             {
    25                 case'Q':
    26                     getchar();getchar();getchar();getchar();
    27                     scanf("%d%d",&l,&r);printf("%d
    ",que(l,r));
    28                     break;
    29                 case 'A':
    30                     getchar();getchar();
    31                     scanf("%d%d",&l,&r);add(l,r);
    32                     break;
    33                 case 'S':
    34                     getchar();getchar();
    35                     scanf("%d%d",&l,&r);add(l,-r);
    36                     break;
    37             }
    38             for(ch=getchar();ch!='E' && ch!='Q' && ch!='A' && ch!='S';ch=getchar());
    39         }
    40         getchar();getchar();
    41     }
    42     return 0;
    43 }

    这道水题理论上不需要常数那么小,但是代码短所以还是这么打了

    主程序基本都是在输入输出,,,

  • 相关阅读:
    51Nod 1052/1053/1115 最大M子段和V1/V2/V3
    51Nod1207 内存管理
    51Nod1207 内存管理
    51Nod1444 破坏道路
    51Nod1444 破坏道路
    51Nod1349 最大值
    51Nod1349 最大值
    51nod1485 字母排序
    aspx页面中的html标签中的值传到aspx.cs文件中的方法
    C#属性的使用
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5760615.html
Copyright © 2011-2022 走看看