基础线段树

#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:\n",++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\n",ans);}
}
}
return 0;
  }

树状数组

#include<bits/stdc++.h>
using namespace std; int c[];
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=;
while(i>)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
} int main()
{
int cas;cin>>cas;
for(int k=;k<=cas;k++)
{
memset(c,,sizeof(c));
cin>>n;
for(int i=;i<=n;i++)
{
int x;scanf("%d",&x);
update(i,x);
}
printf("Case %d:\n",k);
char s[];
while(scanf("%s",s)==)
{
if(s[]=='E')break;
int a,b;scanf("%d%d",&a,&b);
if(s[]=='A')update(a,b);
if(s[]=='S')update(a,-b);
if(s[]=='Q')printf("%d\n",sum(b)-sum(a-)); } } }

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

  1. 敌兵布阵hdu1166

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

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

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

  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. mongoDB - 日常操作一

    mongodb 启动方式 # 不启动认证 ./mongod --bind_ip 172.16.2.17 --port --fork --logpath=/opt/mongodb/mongodb.log ...

  2. Linux之安装虚拟机/虚拟操作系统[VisualBox]

    使用VisualBox安装虚拟机步骤: BIOS开启 Visual Technology(或者 visualization) 安装Visual Box 打开Visual Box > 新建虚拟电脑 ...

  3. emacs(考场+平时)配置方案

    考场配置: ;;在配置后面会对语句逐一解释的 (global-set-key (kbd "C-z") 'undo) (global-set-key (kbd "RET&q ...

  4. TCP3次握手和4次挥手及其为什么

    TCP 3次握手 客户端向服务器发送一个SYN(包含了SYN,SEQ). 当服务器接收到客户端发过来的SYN时,会向客户端发送一个SYN+ACK的数据包,其实ACK的ack等于上一次发送SYN数据包的 ...

  5. Linux组管理和权限管理

    ⒈Linux组基本介绍 1)在Linux中的每个用户必须属于一个组,不能独立于组外. 2)Linux中每个文件都有所有者.所在组.其它组的概念 ①所有者 一般(默认)为文件的创建者,谁创建了该文件,就 ...

  6. Python单元测试unittest - 单元测试框架

    一.unittest简介 unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性. 二.unittest相关概念 ...

  7. zabbix实现对tomcat的监控

    zabbix实现对tomcat的监控 工作原理 比如:当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix- ...

  8. [学习笔记]JS 数组Array push相关问题

    前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...

  9. .net core定时任务

    1.HangFire HangFire官网 Hangfire项目实践分享 :  讲解的比较详细 2.Quartz.NET https://www.cnblogs.com/best/p/7658573. ...

  10. 中文多分类 BERT

    直接把自己的工作文档导入的,由于是在外企工作,所以都是英文写的 Steps: git clone https://github.com/google-research/bert prepare dat ...