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,但是第二 ...
随机推荐
- MySql 基础使用(一)
参考网址:http://c.biancheng.net/view/7143.html 1. 安装完成后,登录mysql. //登录mysql mysql -u root -p(mysql -u roo ...
- Lua生成Guid(uuid)
全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) .GUID是一种由算法生成的二进制长度为 ...
- rsyslog日志总结
rsyslog日志总结 一 rsyslog介绍 syslogd被rsyslog取代 将日志写入数据库 可以利用模块和插件控制输入输出 rsyslog程序管理本地和远程日志 安装软件 根据需求修改配置文 ...
- MyBatis中模糊查询
接口 // 模糊查询 List<User> getUserLike(String value); Mapper.xml文件 <!-- 模糊查询 --> <select i ...
- dom_bom学习
1. bom是什么? browser object model(浏览器对象模型) 在浏览器中 window指的就是bom对象 //网页重定向 // window.location.href=" ...
- WebSocket与即时通讯
HTTP 协议有一个缺陷:通信只能由客户端发起!HTTP 协议做不到服务器主动向客户端推送信息.这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦.我们只能使用"轮 ...
- Java8 BiFunction 简单用用
最近来了新公司,主要用到了ElasitcSearch,大家都知道在底层查询代码中往往需要判断传入某个参数是否为空来判断设置查询,例如下方代码: BoolQueryBuilder query = Que ...
- MySQL基础知识:Character Set和Collation
A character set is a set of symbols and encodings. A collation is a set of rules for comparing chara ...
- python对一个文本的解析
# 定义Tag的签注 controlAreaStart ="<ControlArea::黄冈>" controlAreaEnd = "</Control ...
- 开灯问题3_2(JAVA语言)
package 第三章; public class 开灯问题3_2 { public static void main(String[] args) { // TODO Auto-generated ...