/*
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 28142 Accepted Submission(s): 12062 Problem Description
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的. Input
第一行一个整数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条命令 Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。 Sample Input
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End Sample Output
Case 1:
6
33
59 Author
Windbreaker Recommend
Eddy */
#include <iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxn 50100
struct node
{
int ld,rd;
int sum;
node *lc,*rc;
};
node* create(int a,int b)
{
node *p = new node;
p->ld=a;
p->rd=b;
p->sum=;
if(a==b)
{
// p->lc=NULL;
// p->rc=NULL;
return p;
}
p->lc=create(a,(a+b)/);
p->rc=create((a+b)/+,b);
return p;
}
/*void insert(node *T,int a,int b,int key)
{
node *p = new node;
if(a<=T->ld&&T->rd<=b)
{
p->sum+=key;
return;
}
if(a<=(T->ld+T->rd)/2)
insert(T->lc,a,b,key);
if(b>(T->ld+T->rd)/2)
insert(T->rc,a,b,key);
}*///插入线段[a,b]
void insert(node *T,int position,int sum)
{
node * p =T;
if(p->ld<=position&&p->rd>=position)
{
p->sum+=sum;
//if(p->lc!=NULL)
if(p->ld!=p->rd)
{
insert(p->lc,position,sum);
//if(p->rc!=NULL)
insert(p->rc,position,sum);
} }
}
int query(node *T,int a,int b)
{
node * p;
int mid,ans;
p=T;
mid=(p->ld+p->rd)/;
if(p->ld==a&&p->rd==b)
return p->sum;
else if(b<=mid)
ans=query(p->lc,a,b);
else if(a>=mid+)
ans=query(p->rc,a,b);
else
{
ans=query(p->lc,a,mid);
ans+=query(p->rc,mid+,b);
}
return ans;
}
int main()
{
node *T;
int t;
scanf("%d",&t);
int k=,n,i,sum,a,b;
char ch[];
while(k<=t)
{
sum=;
scanf("%d",&n);
T=create(,n);
for(i=; i<=n; i++)
{
scanf("%d",&sum);
insert(T,i,sum);
}
printf("Case %d:\n",k);
while(scanf("%s",ch),strcmp(ch,"End"))
{
scanf("%d%d",&a,&b);
if(!strcmp(ch,"Query"))
printf("%d\n",query(T,a,b));
else if(!strcmp(ch,"Add"))
insert(T,a,b);
else if(!strcmp(ch,"Sub"))
insert(T,a,-b);
}
k++;
}
return ;
}
/*经过深入学习后改进的,不容易啊*/
#include <iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxn 50100
struct data
{
int l,r,sum;
}tree[maxn*];
int record[maxn];
void cre(int left,int right,int u)
{
// printf("left = %d right = %d u = %d\n",left,right,u);
tree[u].l=left;
tree[u].r=right;
if(left==right)
{
tree[u].sum=record[left];
// printf("tree[%d].sum = %d\n",u,tree[u].sum);
return ;
}
int mid = (left+right)>>;
cre(left,mid,*u);
cre(mid+,right,*u+);
tree[u].sum=tree[*u].sum+tree[*u+].sum;
}
void Add(int pos,int add,int u)
{
if(tree[u].l<=pos&&tree[u].r>=pos)
{
tree[u].sum+=add;
if(tree[u].l!=tree[u].r)
{
Add(pos,add,*u);
Add(pos,add,*u+);
}
}
}
int qur(int left,int right,int u)
{ int mid = (tree[u].l + tree[u].r)>>;
//printf("mid = %d left = %d right = %d\n",mid,left,right);
//system("pause");
if(tree[u].l==left&&tree[u].r==right)
{
//printf("tree[%d].sum = %d\n",u,tree[u].sum);
return tree[u].sum;
}
else if(left>=mid+)
{
//printf("left>=tree[%d].l\n",u);
qur(left,right,*u+);
}
else if(right<=mid)
{
//printf("right<=tree[%d].r\n",u);
qur(left,right,*u);
}
else
{
//printf(" else \n");
return (qur(left,mid,*u)+qur(mid+,right,*u+)); }
}
int main()
{
int T,n,i,a,b;
scanf("%d",&T);
int k=;
char ch[];
while(k<=T)
{
scanf("%d",&n); for(i=;i<=n;i++)
{
scanf("%d",&record[i]);
}
cre(,n,);
printf("Case %d:\n",k);
while(scanf("%s",ch),ch[]!='E')
{
scanf("%d%d",&a,&b);
if(ch[]=='Q')
{
//printf("a = %d b = %d\n",a,b);
printf("%d\n",qur(a,b,));
}
else if(ch[]=='A')
{
Add(a,b,);
}
else
{
Add(a,-b,);
}
}
//printf("\njie shu\n");
k++;
}
return ;
}
/*
Author style:
在代码前先介绍一些我的线段树风格:
maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍
lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示
以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时候多两个参数,结合lson和rson的预定义可以很方便
PushUP(int rt)是把当前结点的信息更新到父结点
PushDown(int rt)是把当前结点的信息更新给儿子结点
rt表示当前子树的根(root),也就是当前所在的结点
大神的最简洁的方法*/
#include <iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//#define maxn 50100
const int maxn = ;
#define lson l, m , rt<<1
#define rson m+1 , r ,rt<<1|1
int sum[maxn<<];
void PushUP(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void cre(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return ;
}
int m = (l+r)>>;
cre(lson);
cre(rson);
PushUP(rt);
}
void Add(int p,int add, int l,int r,int rt)
{
if(l==r)
{
sum[rt]+=add;
return ;
}
int m = (l + r)>>;
if(p<=m) Add(p,add,lson);
else Add(p,add,rson);
PushUP(rt);
// 和方法2对照发现两个递归有点区别,法2是先把根节点的和更新,而
//法3是先更新叶子节点,然后反过来更新根节点
}
int qur(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
//大神是分数组的区间,而我们是分要求的区间,所以他是小于等于,真妙  
int m = (l + r)>>;
int ret = ;
if(L<=m)
ret+=qur(L,R,lson);
if(R>m)
ret+=qur(L,R,rson);
return ret;
}
int main()
{
int T,n,a,b;
scanf("%d",&T);
int k=;
char ch[];
while(k<=T)
{
printf("Case %d:\n",k);//位置没什么大关系
scanf("%d",&n);
cre(,n,);
while(scanf("%s",ch),ch[]!='E')
{
scanf("%d%d",&a,&b);
if(ch[]=='Q')
{
printf("%d\n",qur(a,b,,n,));
}
else if(ch[]=='A')
{
Add(a,b,,n,);
}
else
{
Add(a,-b,,n,);
}
}
//printf("\njie shu\n");
k++;
}
return ;
}

 

敌兵布阵hdu1166的更多相关文章

  1. 敌兵布阵-HDU1166 点修改+区间查询

    题目:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

  2. 敌兵布阵 HDU1166

    基础线段树 #include<cstdio> #include<iostream> using namespace std; int n,p,a,b,m,x,y,ans; st ...

  3. (线段树)敌兵布阵--hdu--1166 (入门)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1166 自己第一次在没有看题解AC出来的线段树,写的可能不是太好,再贴个学长的代码,学习一下 发现自己的U ...

  4. 暑假集训(2)第四弹 ----- 敌兵布阵(hdu1166)

    D - 敌兵布阵 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit ...

  5. hdu1166敌兵布阵

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. hdu1166 敌兵布阵

    敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动 ...

  7. 线段树 HDU-1166 敌兵布阵

    敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...

  8. HDU-1166敌兵布阵(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...

  9. hdu1166 敌兵布阵(线段树 求区间和 更新点)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. Gradle2.0用户指南翻译——第三章. 教程

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

  2. [置顶] 不再迷惑,也许之前你从未真正懂得 Scroller 及滑动机制

    学习本来就是从困惑中摸索问题答案的过程,能够描述出来问题就已经成功了一半.只要发现了困扰你的东西是什么,那么你就离解答出来不远了.----肯尼斯 R. 莱伯德 一直以来,Android 开发中绕不过去 ...

  3. [Linux] Boot分区满了的处理方法 The volume "boot" has only 0 bytes disk space remaining

    1.查看系统目前正在用的内核 abby@abby:~$ uname -r ..--generic 2.查看/boot保存的所有内核 abby@abby:~$ ls -lah /boot total 3 ...

  4. HDU2604 Queuing 矩阵初识

    Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...

  5. Codeforces 15E Triangles 【组合计数】

    Codeforces 15E Triangles Last summer Peter was at his granny's in the country, when a wolf attacked ...

  6. 在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中

    NuGet 提供了工具类型的包支持,生成一个基于 .NET Core 的 dll 或者基于 .NET Framework 的 exe 之后,你几乎可以对项目做任何事情.但是,默认情况下,NuGet 不 ...

  7. NSURLSession学习笔记(三)Download Task

    NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务. 我们直接从分析Demo入手: 故事板如下: 只有一个View Controll ...

  8. 如何向map和reduce脚本传递参数,加载文件和目录

    本文主要讲解三个问题:       1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数.       2 使用Streaming编写MapReduce程序(C/C++ ...

  9. Could not transfer artifact org.springframework:spring-tx:jar:3.2.3.RELEASE

    在maven中加入依赖时,如果jar下载失败,这时pom文件中就会出现上面的错误,重新添加也不好用, 这时要手动去maven库中删除已经下载的依赖包. 默认库位置:C:\Users\XXX\.m2

  10. k8s helm 包管理私服chartmuseum 安装

    备注:   预备环境需要安装helm  1. 安装chartmuseum  参考 # on Linux curl -LO https://s3.amazonaws.com/chartmuseum/re ...