/*
敌兵布阵 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. flowable IdmEngine和IdmEngineConfiguration

    IdmEngineConfiguration 继承了 AbstractEngineConfiguration. 一.创建EngineConfiguration实例 IdmEngineConfigura ...

  2. Kotlin Reference (三) Coding Conventions

    most from reference 命名规则 1.使用驼峰式命名规则,尽量避免在命名中使用下划线 2.类型以大写字母开头 3.方法和属性以小写字母开头 4.使用4个空格缩进 5.public的方法 ...

  3. 【剑指offer】10A--求裴波那切数列的第n项,C++实现

    #本文是牛客网<剑指offer>刷题笔记 1.题目 写入一个函数,输入n,输出裴波那切数列的第n项 2.思路 递归--时间和空间复杂度高 循环--时间和空间复杂度低,通过循环迭代计算第n项 ...

  4. BZOJ4550: 小奇的博弈(NIMK博弈& 组合数& DP)

    4550: 小奇的博弈 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 159  Solved: 104[Submit][Status][Discuss] ...

  5. BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)

    Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...

  6. ajax完成团队信息异步添加【实际项目】

    第一:ajax往后台传参如何串(目前理解是json数组直接传给对象) 第二:ajax返回的数值通过PrintWriter.print方法返回 [参考前台页面关于团队信息是如何实现的] 参考页面user ...

  7. threejs Object的点击(鼠标)事件(获取点击事件的object)

    objects=[]; raycaster = new THREE.Raycaster(); mouse = new THREE.Vector2(); //监听全局点击事件,通过ray检测选中哪一个o ...

  8. 监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  9. 数字证书在web应用中实现登陆

    1数字证书登录认证的优点 作为企业信息系统的第一道大门,身份认证是确保企业信息资源只能被合法用户所访问的重要保障. 传统的口令认证方式虽然简单,但是由于其易受到窃听.重放等攻击的安全缺陷,使其已无法满 ...

  10. jquery ajax 超时设置

    自:jquery ajax超时设置 var ajaxTimeoutTest = $.ajax({ url:'',  //请求的URL timeout : 1000, //超时时间设置,单位毫秒 typ ...