HDU 5239 Doom 线段树
题意:
有\(n(1 \leq n \leq 10^5)\)个数,和\(m(1 \leq m \leq 10^5)\)操作,和一个计算\(s\),一切运算都在模\(MOD\)进行的。
操作\(l, \, m\)表示先将区间\([l, r]\)的数字之和累加到\(s\)上,然后将区间的每个数平方。
输出每次操作后的\(s\)。
分析:
虽然原理不是特别懂,但是有这样一个事实:
任意一个数\(x\)平方超过\(30\)次之后再平方就不会变了。
所以我们维护区间和的同时,再维护一个区间平方次数的最小值。
如果这个区间都平方不少于\(30\)次,那么就不用更新了,因为整个区间的数都不会变。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long LL;
const LL MOD = 9223372034707292160ULL;
LL add(LL a, LL b) { a += b; if(a >= MOD) a -= MOD; return a; }
LL mul(LL a, LL b) {
LL ans = 0;
while(b) {
if(b & 1) ans = add(ans, a);
a = add(a, a);
b >>= 1;
}
return ans;
}
const int maxn = 100000 + 10;
const int maxnode = maxn * 4;
int n, m;
LL sumv[maxnode], mcnt[maxnode], s;
void build(int o, int L, int R) {
if(L == R) {
scanf("%llu", &sumv[o]);
mcnt[o] = 0;
return;
}
int M = (L + R) / 2;
build(o<<1, L, M);
build(o<<1|1, M+1, R);
sumv[o] = add(sumv[o<<1], sumv[o<<1|1]);
mcnt[o] = 0;
}
void query(int o, int L, int R, int qL, int qR) {
if(qL <= L && R <= qR) {
s = add(s, sumv[o]);
return;
}
int M = (L + R) / 2;
if(qL <= M) query(o<<1, L, M, qL, qR);
if(qR > M) query(o<<1|1, M+1, R, qL, qR);
}
void update(int o, int L, int R, int qL, int qR) {
if(mcnt[o] >= 30) return;
if(L == R) {
sumv[o] = mul(sumv[o], sumv[o]);
mcnt[o]++;
return;
}
int M = (L + R) / 2;
if(qL <= M) update(o<<1, L, M, qL, qR);
if(qR > M) update(o<<1|1, M+1, R, qL, qR);
sumv[o] = add(sumv[o<<1], sumv[o<<1|1]);
mcnt[o] = min(mcnt[o<<1], mcnt[o<<1|1]);
}
int main()
{
int T; scanf("%d", &T);
for(int kase = 1; kase <= T; kase++) {
printf("Case #%d:\n", kase);
scanf("%d%d", &n, &m);
build(1, 1, n);
s = 0;
while(m--) {
int qL, qR; scanf("%d%d", &qL, &qR);
query(1, 1, n, qL, qR);
update(1, 1, n, qL, qR);
printf("%llu\n", s);
}
}
return 0;
}
HDU 5239 Doom 线段树的更多相关文章
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu 5239 Doom(线段树)
Doom Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Sub ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- HDU 2795 Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴 ...
- hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- hdu 1828 Picture(线段树 || 普通hash标记)
http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others) Mem ...
随机推荐
- JAVA代码之斗地主发牌
理解很好理解,关键是思路 按照斗地主的规则,完成洗牌发牌的动作: 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. ...
- bug {was not declared in this scope}
使用自己定义的结构体作为返回值的时候,出现了 ...was not declared in this scope 检查了各种头文件,把缓存也都删掉了还是不行. 结果,发现,应该这样用vector< ...
- 获取元素Bytagname区别/for循环应用
一:两种获取元素方式的区别.1.var aLi = oUl.getElementsByTagName('li');TagName前面可以加其他东西,id就只能是document,2,Id是静态的,ta ...
- SGU 258 Almost Lucky Numbers 接近幸运数(数位DP)
题意: 定义一个具有2n位的正整数,其前n位之和与后n位之和相等,则为lucky数.给定一个区间,问有多少个正数可以通过修改某一位数从而变成lucky数?注意不能含前导0. 思路: 我的想法是记录那些 ...
- LeetCode House Robber 家庭劫犯(dp)
题意:有一个整数序列,从中挑出一些数字,使得总和是最大,前提是,相邻的两个数字中只能挑其一.比如1 2 3 就只能挑2或者1和3. 思路:很直观的题,dp思想.降低规模,从小规模开始考虑.如果只有两个 ...
- 【转载】Python实现图书馆预约功能
注释: 1,原博主是:http://blog.csdn.net/cq361106306/article/details/42644001# 2,学校是我现在的学校,我最近也在研究这个,所以转了. 3, ...
- C#的位运算
链接地址: http://www.cnblogs.com/NetBelieve/archive/2012/07/30/2615006.html
- 设置DdtaGridView控件中网格线的样式
实现效果: 知识运用: DataGridView控件的GridColor属性 //用来获取或设置网格线的颜色 public Color GridColor { get; set; } //属性值: C ...
- python_80_模块定义导入优化实例
运行结果 __import__作用: 同import语句同样的功能,但__import__是一个函数,并且只接收字符串作为参数,所以它的作用就可想而知了.其实import语句就是调用这 ...
- linux文本编辑器-VIM基本使用方法
vim [OPTION]... FILE... +/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首vim + file 直接打开file,光标在最后一行 三种主要模式 ...