hdu 1166 敌兵布阵(线段树详解)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; struct node //用结构体来构建一个线段树
{
int l;//左区间值,此题代表营号
int r;//右区间值,同上
int n;//值,此题代表第l个到第r个营地的总人数
} t[];//线段树的下标 void build(int l,int r,int k)//构建线段树,应用递归思想~
{
if(r==l)//左右区间值相等,此题代表单个营号
{
t[k].l=l;
t[k].r=r;
t[k].n=;//初始化,因为还没有输入营地人数
return ;//递归出口
}
t[k].l=l; // 写入第k个结点中的 左区间
t[k].r=r; // 写入第k个结点中的 右区间
t[k].n=; //初始化
int mid=(r+l)/;//将区间一分为二,这里是二分思想
build(l,mid,*k);//该结点往 左孩子的方向 继续建立线段树
build(mid+,r,*k+);// 该结点往 右孩子的方向 继续建立线段树
} void insert(int n,int d,int k)//单点更新线段树,此题的意思是改变营地人数
{
//n是变化的人数,d是营号,k=1,记住是从根本开始(递归
if(t[k].l==t[k].r&&t[k].l==d)//找到该营地
{
t[k].n+=n;//更新单点,即变化人数
return ;
}
int mid=(t[k].l+t[k].r)/;//一分为二
if(d<=mid) insert(n,d,*k);//如果营号是在左区间里,向左侧递归变化
else insert(n,d,*k+);//如果营号是在右区间里,向右侧递归变化
t[k].n=t[*k].n+t[*k+].n;//更新所有区间里值,即从下往上改变人数
} int ans; void search(int a,int b,int k)//区间查找
{
if(t[k].l==a&&t[k].r==b)//找到区间
{
ans+=t[k].n;//由于会出现区间在树中不连续,即区间被mid截断
return ;
}
int mid=(t[k].l+t[k].r)/;
if(b<=mid) search(a,b,*k);//查询区间被[L,Mid]包含,此时直接在左边查找[a,b]
else if(a>mid) search(a,b,*k+);//查询区间被[mid,r]包含,此时直接在右查找[a,b]
else//区间被mid截断
{
search(a,mid,*k);//分开查找!
search(mid+,b,*k+);
}
} int main()
{
int c,n,a,b;
char ch[];
scanf("%d",&c);
for(int m=;m<=c;m++)
{
scanf("%d",&n);
build(,n,);
int num;
for(int i=;i<=n;i++)
{
scanf("%d",&num);
insert(num,i,);
}
printf("Case %d:\n",m);
while(scanf("%s",ch),strcmp(ch,"End"))
{
scanf("%d%d",&a,&b);
if(strcmp(ch,"Add")==) insert(b,a,);
else if(strcmp(ch,"Sub")==) insert(-b,a,);
else
{
ans=;
search(a,b,);
printf("%d\n",ans);
}
}
}
return ;
}
hdu 1166 敌兵布阵(线段树详解)的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1166 敌兵布阵 (线段树、单点更新)
敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题
题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...
- HDU 1166 敌兵布阵 线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- C# .NETWEB开发6大内置对象
ASP.NET 内置对象包括 1.Response 2.Request 3.Server 4.Application 5.Session 6.Cookie 1 Request对象主要是让 ...
- Mybatis(一)
jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建和销毁, ...
- C++虚函数继承的bug
闲来无事想测试一下:如果在派生类中重写基类的虚函数,那么允不允许改变虚函数的访问权限,结果颠覆了三观..... 基类Base,拥有public方法test(),test()为虚函数 派生类Derive ...
- PHP来实现文件上传
文件php <?phpif ($_FILES["file"]["error"] > 0){ echo '错误: ' . $_FILES[" ...
- 今天写动态canvas柱状图小结
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- FR javascript 时间设置上个月最后一天后当月最后一天
//设置上月最后一天 var date1 =new Date(); date1.setDate(1); //first day; date1.setMonth(date1.getMonth()); / ...
- delphi 关键字
下面的关键字不能被重新定义或用作标志符:and array as asm begin case class const constructor destructor dispinterface div ...
- Unity3d中Dictionary和KeyValuePair的使用
using UnityEngine; using System.Collections; using System.Collections.Generic;public class test : Mo ...
- How to solve java.net.SocketTimeoutException:60000millis problem in HDFS
Many HDFS users encounter the following error when DFSClient ready file from a certain Data Node. & ...
- 大数据时代之hadoop(二):hadoop脚本解析
“兵马未动,粮草先行”,要想深入的了解hadoop,我觉得启动或停止hadoop的脚本是必须要先了解的.说到底,hadoop就是一个分布式存储和计算框架,但是这个分布式环境是如何启动,管理的呢,我就带 ...