zoukankan      html  css  js  c++  java
  • 敌兵布阵 HDU1166

    基础线段树

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,p,a,b,m,x,y,ans;

    struct node
    {
    int l,r,v,f;
    }tree[400001];

    void build(int k,int l,int r)//建树
    {
    tree[k].l=l,tree[k].r=r;
    if(tree[k].l==tree[k].r)
    {
    scanf("%d",&tree[k].v);
    return;
    }
    int m=(l+r)/2;
    build(k*2,l,m);
    build(k*2+1,m+1,r);
    tree[k].v=tree[k*2].v+tree[k*2+1].v;
    }

    void down(int k)//标记下传
    {
    tree[k*2].f+=tree[k].f;
    tree[k*2+1].f+=tree[k].f;
    tree[k*2].v+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
    tree[k*2+1].v+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
    tree[k].f=0;
    }

    int ask_point(int k,int x)//单点查询
    {
    if(tree[k].l==tree[k].r)
    {
    return tree[k].v;
    }

    if(tree[k].f) down(k);
    int m=(tree[k].l+tree[k].r)/2;
    if(x<=m) ask_point(k*2,x);
    else ask_point(k*2+1,x);
    }
    void change_point(int k,int x,int v)//单点修改
    {
    if(tree[k].l==tree[k].r)
    {
    tree[k].v+=v;
    return;
    }
    if(tree[k].f) down(k);
    int m=(tree[k].l+tree[k].r)/2;
    if(x<=m) change_point(k*2,x,v);
    else change_point(k*2+1,x,v);
    tree[k].v=tree[k*2].v+tree[k*2+1].v;
    }
    void ask_interval(int k,int a,int b)//区间查询
    {
    if(tree[k].l>=a&&tree[k].r<=b)
    {
    ans+=tree[k].v;
    return;
    }
    if(tree[k].f) down(k);
    int m=(tree[k].l+tree[k].r)/2;
    if(a<=m) ask_interval(k*2,a,b);
    if(b>m) ask_interval(k*2+1,a,b);
    }
    void change_interval(int k,int a,int b,int v)//区间修改
    {
    if(tree[k].l>=a&&tree[k].r<=b)
    {
    tree[k].v+=(tree[k].r-tree[k].l+1)*v;
    tree[k].f+=v;
    return;
    }
    if(tree[k].f) down(k);
    int m=(tree[k].l+tree[k].r)/2;
    if(a<=m) change_interval(k*2,a,b,v);
    if(b>m) change_interval(k*2+1,a,b,v);
    tree[k].v=tree[k*2].v+tree[k*2+1].v;
    }

    int main()
    {
    int cas;cin>>cas;
    int flag=0;
    while(cas--)
    { printf("Case %d: ",++flag);
    int n;scanf("%d",&n);
    build(1,1,n);
    char s[2000];
    int x,y;
    while(scanf("%s",s)==1)
    { ans=0;
    if(s[0]=='E')break;
    scanf("%d%d",&x,&y);
    if(s[0]=='A')change_point(1,x,y);
    if(s[0]=='S')change_point(1,x,-y);
    if(s[0]=='Q'){ask_interval(1,x,y);printf("%d ",ans);}
    }
    }
    return 0;


    }

    树状数组

    #include<bits/stdc++.h>
    using namespace std;
    
    int c[50001];
    int n;
    int lowbit(int i)
    {
        return i&-i;
    }
    void update(int i,int val)
    {
        while(i<=n)
        {
            c[i]+=val;
            i+=lowbit(i);
        }
    }
    int sum(int i)
    {
        int ans=0;
        while(i>0)
        {
            ans+=c[i];
            i-=lowbit(i);
        }
        return ans;
    }
    
    
    int main()
    {
        int cas;cin>>cas;
       for(int k=1;k<=cas;k++)
        {
          memset(c,0,sizeof(c));
          cin>>n;
          for(int i=1;i<=n;i++)
          {
              int x;scanf("%d",&x);
              update(i,x);
          }
           printf("Case %d:
    ",k);
           char s[20];
           while(scanf("%s",s)==1)
           {
               if(s[0]=='E')break;
               int a,b;scanf("%d%d",&a,&b);
               if(s[0]=='A')update(a,b);
               if(s[0]=='S')update(a,-b);
               if(s[0]=='Q')printf("%d
    ",sum(b)-sum(a-1));
    
           }
    
    
        }
    
    }
  • 相关阅读:
    解决win8无法成功安装Windows Phone 7 sdk的问题
    决定专心写博,学习
    时间管理的首要原则:专注力
    Windows Phone 7 开发环境的搭建
    Windows Phone 8 开发环境的搭建
    学习使用ErrorProvider 转载
    SetTimer函数
    网络工程课程笔记
    IP地址分类及特殊IP地址
    windows消息处理机制
  • 原文地址:https://www.cnblogs.com/bxd123/p/10356081.html
Copyright © 2011-2022 走看看