HDU1166线段树板子

#我大爷的读入被卡了

#对于ADD,END什么的处理,开个char,然后判断s[0],嘛

自己调的代码~

复制代码
#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,input[500000];
struct node{
    int l,r,sum;
}tree[500000];
void build(int i,int l,int r)
{
    tree[i].l=l;
    tree[i].r=r;
    if(l==r)
    {
        tree[i].sum=input[l];
        return;
    }
    int mid=(l+r)>>1;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
void update(int i,int id,int k)
{
    if(tree[i].l==tree[i].r&&tree[i].l==id)
    {
        tree[i].sum+=k;
        return;
    }
    int mid=(tree[i].r+tree[i].l)>>1;
    if(id<=mid)
    {
        update(i*2,id,k);
    }
    else {
        update(i*2+1,id,k);
    }
    tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
int query(int i,int l,int r)
{
if(tree[i].l>=l&&tree[i].r<=r)
     {
         return tree[i].sum;
     }
     int  ans=0;
     if(tree[i*2].r>=l)
     {
         ans+=query(i*2,l,r);
     }
     if(tree[i*2+1].l<=r)
     {
         ans+=query(i*2+1,l,r);
     }
     return ans;
}
int main( )
{  
/*
第一行一个整数T,表示有T组数据。 
每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 
接下来每行有一条命令,命令有4种形式: 
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30) 
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30); 
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数; 
(4)End 表示结束,这条命令在每组数据最后出现; 
每组数据最多有40000条命令 */
//freopen("925.in","r",stdin);
int t;
cin>>t;
for(int i=1;i<=t;i++)
 {
     cin>>n;
     cout<<"Case "<<i<<":"<<endl;
     for(int j=1;j<=n;j++)
     {
         int a;
         scanf("%d",&input[j]);
     }
     
     build(1,1,n);
     
     int ok=0;
/*     cout<<tree[1].sum<<endl;
     cout<<tree[2].sum<<endl;
     cout<<tree[3].sum<<endl;
     cout<<tree[4].sum<<endl;
     cout<<tree[5].sum<<endl;
     cout<<tree[6].sum<<endl;
     */
     while(ok==0)
     {
         char s[10];
         cin>>s;
         if(s[0]=='E')
         {
             ok=1;break;
         }
         if(s[0]=='A'||s[0]=='S')
         {
             int i,k;
             scanf("%d%d",&i,&k);
             if(s[0]=='S') 
             {
                 k=-k;
            }
            update(1,i,k);
         }
         else {
             int i,j;
             scanf("%d%d",&i,&j);
             int ans=query(1,i,j);
             cout<<ans<<endl;
         }
     }
 }
}
复制代码

 

posted @   liyishui  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示