hdu4267线段树段更新,点查找,55棵线段树.
题意:
给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新.
思路:(别人的)
(i - a) % k == 0 等价于 i % k == a % k 一共有10中情况
还有枚举所有情况中的小情况
(1)1 2 3 4 5 6 7 8 9.....
(2)1 3 5 7 9 11 13 ......
2 4 6 8 10 12 14......
(3)1 4 7 10 13...
2 5 8 11 14...
3 6 9 12 15...
一共1 + 2 +....+ 10 = 55种
其实每一个数字必然在这55种情况中的10种,对于每次更新就是更新这个数组在这55种情况中的1种,而查询就是查询这个数字的10种情况的和,数组num[t][key],t是线段树上的点,key是这55中情况中的一种,对于每一个点a ,key = a % k + k * (k - 1) / 2 ,这样相当于我们直接建了55棵树,对于每个区间更新的时候,我们直接可以用线段树的短更新,
比如1--5,k = 2,我们直接找到 key = 1 % 2 + 2 * (2 - 1) / 2 = 2,则可以确定的是在第二课树上,我们把所有1--5的在第二棵树上的都更新看下上面发现第2课树上没有2,4我们也更新了num[2][2] ,num[4][2],虽然更新了,但在查找的时候永远不可能查找的到的,同时它把操作变成了连续的,这样就可以用线段树的 段更新点查找模板AC了...
#include<stdio.h>
#include<string.h> #define lson l,mid,t<<1
#define rson mid+1,r,t<<1|1
int num[150000][55];
int aa[50000]; void update(int l ,int r ,int t , int a ,int b ,int c ,int key)
{
if(a <= l && r <= b)
{
num[t][key] += c;
return ;
}
int mid = (l + r) >> 1;
if(a <= mid)
update(lson ,a ,b ,c ,key);
if(b > mid)
update(rson ,a ,b ,c ,key);
return;
} int query(int l ,int r ,int t ,int a)
{
int ans = 0;
for(int i = 1 ;i <= 10 ;i ++)
ans += num[t][a % i + i * (i-1) / 2];
if(l == r)
return ans;
int mid = (l + r) >> 1;
if(a <= mid)
ans += query(lson ,a);
else
ans += query(rson ,a);
return ans;
} int main ()
{
int n ,q ,qq ,a ,b ,c ,k;
while(~scanf("%d" ,&n))
{
for(int i = 1 ;i <= n ;i ++)
scanf("%d" ,&aa[i]);
memset(num ,0 ,sizeof(num));
scanf("%d" ,&qq);
while(qq--)
{
scanf("%d" ,&q);
if(q == 1)
{
scanf("%d %d %d %d" ,&a ,&b ,&k ,&c);
update(1 ,n ,1 ,a ,b ,c ,a % k + k * (k - 1) / 2);
}
else
{
scanf("%d" ,&a);
printf("%d\n" ,aa[a] + query(1 ,n ,1 ,a));
}
}
}
return 0;
}
hdu4267线段树段更新,点查找,55棵线段树.的更多相关文章
- UVA11992不错的线段树段更新
题意: 给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v 2 x ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- hdu1556 线段树段更新(简单题)
题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ...
- HDU-4614 Vases and Flowers(线段树区间更新+二分查找)
http://acm.hdu.edu.cn/showproblem.php?pid=4614 Time Limit: 4000/2000 MS (Java/Others) Memory Limi ...
- POJ2528线段树段更新逆序异或(广告牌)
题意: 可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路: 一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...
- HDU 3308 线段树单点更新+区间查找最长连续子序列
LCIS Time Limit: 6000/2000 MS (Java/Oth ...
- POJ3277 线段树段更新,点询问+二分离散化+暴力
题意: x轴上有一些矩形,问你这些矩形覆盖的面积和是多少. 思路: 首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了, ...
- poj3468A Simple Problem with Integers(线段树,在段更新时要注意)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- POJ 2528 Mayor's posters 贴海报 线段树 区间更新
注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...
随机推荐
- 一文了解Python的迭代器的实现
本文对迭代器的解释参考自:https://www.programiz.com/python-programming/iterator 最后自己使用迭代器实现一个公平洗牌类. 博主认为,理论来自实践,假 ...
- vue修改elementUI的分页组件视图没更新问题
转: vue修改elementUI的分页组件视图没更新问题 今天遇到一个小问题平时没留意,el-pagination这个分页组件有一个属性是current-page当前页.今天想在methods里面手 ...
- 【Android笔记】Thread类中关于join()方法的源码分析
1.join()方法的作用: 例如有一个线程对象为Thread1,在main()方法中调用Thread1.join()方法可使得当前线程(即主线程)阻塞,而执行Thread1线程. 2.源码分析(以上 ...
- CVE-2019-2618 任意文件上传
漏洞描述:CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Ma ...
- freebsd升级时出错,没有ntp用户解决
freebsd升级出错,没有ntp用户 终端执行命令 pw groupadd ntpd -g 123 pw useradd ntpd -u 123 -g ntpd -h - -d /var/db/nt ...
- linux安装mysql8.0
linux 上安装mysql8.0 mysql版本8.0.16 MySQL Community 操作系统centos7 准备工作: mysql8.0 rpm文件 安装步骤: 1. 下载mysql的re ...
- HiveHA机制源码分析
hive让大数据飞了起来,不再需要专人写MR.平常我们都可以用基于thrift的任意语言来调用hive. 不过爱恨各半,hive的thrift不稳定也是出了名的.很容易就出问题,让人无计可施.唯一的办 ...
- Linux 三剑客之 awk 实战详解教程
我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...
- Linux Python2 升级到 Python3
国内企业服务器用 CentOS 系统的比较多,CentOS8 系统已经将系统默认 Python 版本调整为了 Python3,但是 CentOS7 的存量还是很大,毕竟对企业生产服务来说稳定大于一切, ...
- 北航OO第四单元作业总结(4.1~4.3)及课程总结
前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...