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 ...
随机推荐
- new Date()的参数
前两天发现手机页面的倒计时在Android上正常显示,在iPhone却不能显示. 后来又发现在ff和ie里也不显示.(以前只在chrome里看过,显示正常). 后来同事改了new Date()里字符串 ...
- php 通过referer防盗链(以图片为例)
1.在网页里访问站外图片时,服务器如何知道是在站外引用的呢? (1)对比本服务器请求与跨服务器请求 图一——本服务器请求 图二——显示盗链的referer信息 通过对比也就知道referer显示的是引 ...
- 过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'
declare @Sql Nvarchar(4000) SET @Sql = ' select * from a_table '要么这样, 要不然在执行存储过程变量前加N'' ALTER PR ...
- Latex调整行距
修改行间距的方法: \usepackage{setspace}%使用间距宏包 \begin{document} \begin{spacing}{2.0}%%行间距变为double-space 双倍行距 ...
- libcprops
Install Howto Download the latest epel-release rpm from http://dl.fedoraproject.org/pub/epel/6/x86_6 ...
- delphi 文件夹权限设置(执行一个小脚本的笨办法)
如题,研究了一天,也没再网上找到比较好的方式,自己做了一个.方法如下: 1.创建一个 cmd 命令文件.2.调用该命令. 代码如下: S:='echo y|cacls h: /t /c /g ev ...
- Python正则表达式一: 基本使用方法
学习python的正则表达式,主要有两个方面学习: 第一,学习如何写正则表达式,主要是掌握其语法规范.正则表达式的语法规范是通用的,对各种开发语言都是一致的. 第二,学习如何使用正则表达式,也就是掌握 ...
- python defaultdict 类型
在Python里面有一个模块collections,解释是数据类型容器模块.这里面有一个collections.defaultdict()经常被用到.主要说说这个东西. 综述: 这里的defaultd ...
- Android蓝牙开发深入解析
1. 使用蓝牙的响应权限 代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /> ...
- ASP.NET 操作配置文件
1.配置文件的各种操作 http://www.cnblogs.com/shimeng3344518/archive/2007/04/23/723999.html 2. http://www.jb51. ...