HDU 4267 线段树 离散点区间更新, 自叶子节点至根单点查询
题意:
n个数字
下面n个数字表示数列
2个操作
1 [u, v] k add
[u,v ]区间 (u点要计算)每隔k个位置,该数字+add
2 pos
询问 pos下标的值(下标从1开始)
思路:
因为k很小, 可以直接存 k[11]
注意查询时, 先找到 pos 所在的 叶子节点
再向上 添加 对应k位置的值
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<queue>
#include<string.h>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<math.h>
#define inf 10000000
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Mid(x,y) ((x+y)>>1)
#define ll __int64
using namespace std;
inline ll Min(ll a,ll b){return a>b?b:a;}
inline ll Max(ll a,ll b){return a<b?b:a;} #define N 51000
struct node{
ll l, r;
ll k[11];
}tree[N*16];
ll a[N]; void build(ll l, ll r, ll id){
memset(tree[id].k, 0, sizeof(tree[id].k));
tree[id].l = l, tree[id].r = r; if(l == r) return ; ll mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
} void updata(ll l, ll r, ll pos, ll add, ll id){
if(l > r)return ;
if(l == tree[id].l && tree[id].r == r)
{
tree[id].k[pos] += add;
return;
}
ll mid = Mid(tree[id].l, tree[id].r);
if(r<=mid)
updata(l, r, pos, add, L(id));
else if(mid<l)
updata(l, r, pos, add, R(id));
else
{
updata(l, mid, pos, add, L(id));
updata(l + ((mid-l)/pos+1)*pos,r,pos, add, R(id));
}
} ll find(ll pos){
ll id = 1;
while(1){
if(tree[id].l == tree[id].r) return id; ll mid = Mid(tree[id].l, tree[id].r);
if(pos <= mid) id = L(id);
else id = R(id);
}
} ll query(ll pos, ll id, ll num){
for(ll i =1;i<11 ;i++)
if((pos-tree[id].l) % i==0)
num += tree[id].k[i]; if(id == 1) return num;
return query(pos, id/2, num);
} int main(){
ll i, j, n, que;
ll u, v, mod, add;
while(~scanf("%I64d",&n)){ for(i=1;i<=n;i++)scanf("%I64d",&a[i]);
build(1, n, 1);
scanf("%I64d",&que);
while(que--){
scanf("%I64d",&i);
if(i==2)
{
scanf("%I64d",&j);
printf("%I64d\n",query(j ,find(j), a[j]));
}
else
{
scanf("%I64d %I64d %I64d %I64d",&u,&v,&mod,&add);
updata(u, v, mod, add, 1);
}
}
}
return 0;
}
/*
10
0 0 0 0 0 0 0 0 0 0
99
1 1 10 2 5
2 1
2 2
2 3
2 4
2 5
2 9
2 10
1 3 6 3 10
2 3
2 4
2 5
2 6 ans:
5
0
5
0
5
5
0
15
0
5
10 */
HDU 4267 线段树 离散点区间更新, 自叶子节点至根单点查询的更多相关文章
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- hdu 1698:Just a Hook(线段树,区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- UVA 12436-Rip Van Winkle's Code(线段树的区间更新)
题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- zoj3686(线段树的区间更新)
对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a ...
- Color the ball (线段树的区间更新问题)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
随机推荐
- JVM报错提示
持久代被占满 异常:java.lang.OutOfMemoryError: PermGen space 说明: Perm空间被占满.无法为新的class分配存储空间而引发的异常.这个异常以前是没有的, ...
- perl5 第四章 列表和数组变量
第四章 列表和数组变量 by flamephoenix 一.列表二.数组--列表的存贮 1.数组的存取 2.字符串中的方括号和变量替换 3.列表范围 4.数组的输出 5.列表/数组的长度 ...
- express文件上传
安装express,创建项目,添加sqlite3模块 express --sessions --css stylus --ejs myhotel npm install sqlite3node app ...
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...
- hdu5188 加限制的01背包问题
http://acm.hdu.edu.cn/showproblem.php? pid=5188 Problem Description As one of the most powerful brus ...
- Android中GPS简介及其应用
GPS是Global Positioning System(全球定位系统)的简称,它的作用就是为全球的物体提供定位功能.GPS定位是一门高新技术,但对于Android程序员来说,开发GPS功能的应用程 ...
- plsql developer连接64位Oracle11g的解决方法
1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载地址:http://www.oracle.co ...
- SQL Server:错误处理及事务控制
目录: 解读错误信息 RAISERROR THROW 实例 使用 @@ERROR 使用 XACT_ABORT 使用TRY/CATCH 现实中的事务语句 删除 更新 银行取钱 解读错误信息 Msg 54 ...
- 解决虚拟内存不够导致Eclipse is not responding
安装目录下eclipse.ini中: 修改参数至必要大小. e.g. -vmargs-Djava.net.preferIPv4Stack=true-Dosgi.requiredJavaVersion= ...