这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉。

然后还顺便发现了一个规律就是当一个数更新一定次数之后就不会变化了。

然后这个题目就很好写了,就是一个区间求和和一个区间修改。现在还不确定如果不加一个找到的规律是不是会超时。

现在写完了,写的过程你会发现,这个每次必须更新到叶节点才可以,不然这个是有问题的,因为我们要求和,

所以如果不更新到叶节点,那就无法求和,然后我们再计算一下复杂度,如果直接是m*n*logn 那么复杂度就太高了

但是有了这个规律之后你会发现每个数最大平方30次就不变了,所以就是说复杂度就是30*n*logn 这个就可以接受了。

所以这个规律很重要,知道这个之后就很好写了。

这个模数有点特别可以记一下 2^63-2^31

#include <cstring>
#include <queue>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
typedef unsigned long long ull;
typedef long long ll;
const ull mod = ;
ll q_mul(ll a, ll b) {
ll ans = ;
while (b) {
if (b & ) {
ans = (ans + a) % mod;
}
a = (a + a) % mod;
b >>= ;
}
return ans;
}
ull a[maxn], sum[maxn * ], flag[maxn * ]; void push_up(int id) {
sum[id] = (sum[id << ] + sum[id << | ]) % mod;
if (flag[id << ] && flag[id << | ]) flag[id] = ;
} void build(int id, int l, int r) {
flag[id] = ;
if (l == r) {
sum[id] = a[l];
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
push_up(id);
} ull query(int id, int l, int r, int x, int y) {
if (x <= l && y >= r) return sum[id];
int mid = (l + r) >> ;
ull ans = ;
if (x <= mid) ans += query(id << , l, mid, x, y) % mod, ans%mod;
if (y > mid) ans += query(id << | , mid + , r, x, y) % mod, ans %= mod;
return ans % mod;
} void update(int id, int l, int r, int x, int y) {
if (flag[id]) return;
if (l == r) {
ull ans = q_mul(sum[id], sum[id]);
if (ans == sum[id]) flag[id] = ;
sum[id] = ans;
return;
}
int mid = (l + r) >> ;
if (x <= mid) update(id << , l, mid, x, y);
if (y > mid) update(id << | , mid + , r, x, y);
push_up(id);
} int main() {
int t;
scanf("%d", &t);
for (int cas = ; cas <= t; cas++) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) scanf("%llu", &a[i]);
build(, , n);
ull ans = ;
printf("Case #%d:\n", cas);
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
ans += query(, , n, l, r);
ans %= mod;
printf("%llu\n", ans);
update(, , n, l, r);
}
}
return ;
}

线段树+找规律

W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31的更多相关文章

  1. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  2. Doom HDU - 5239 (找规律+线段树)

     题目链接: D - Doom  HDU - 5239  题目大意:首先是T组测试样例,然后n个数,m次询问,然后每一次询问给你一个区间,问你这个这段区间的加上上一次的和是多少,查询完之后,这段区间里 ...

  3. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  5. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 3954 线段树 (标记)

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. hdu 1754 线段树(Max+单点修改)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. vueThink框架搭建与填坑(new)

    自己跟着官网搭建vueThink框架,发现github上文档有很多坑.所以总结一下(仅针对WIN端下载使用) 1.安装node.js 前端部分是基于node.js上运行的,所以必须先安装node.js ...

  2. 如果我选择IT行业,会不会在几年,或者几年后被社会给淘汰??

    IT互联网各行业薪资占比,你能拿到多少?随着移动互联网时代的发展,IT行业的需求量也越来越大,而且每年都会新增,当然也会有淘汰. 人生如此之短,都不喜欢自己虚度光阴,也不希望自己所努力的东西成为历史, ...

  3. XFS文件系统的备份与恢复

    永久修改主机名:hostnamectl set-hostname oldboy临时修改主机名:hostname xfsdump备份xfsdump -f 备份的文件位置 要备份的分区或者磁盘 免交互备份 ...

  4. 从前端到后端实现弹幕的过程(jsp/Jquery.barrager.js)

    Jquery.barrager.js插件,可以去网上下载!下载完后,就把下载文件中的js文件.css文件.图片文件.等等等文件全部拷贝到你们自己的项目中去,千万别拷贝漏了,如果你怕拷贝漏了什么,那就把 ...

  5. E. 数字串

    给你一个长度为 n 的数字串,找出其中位数不超过15位的不包含前导0和后导0的数 x ,使得 x+f(x) 是一个回文数,其中 f(x) 表示将 x 反转过来的数. 输入格式 多组输入,处理到文件结束 ...

  6. Epicor RoHS Overview

    Epicor ERP具有一个旨在帮助符合指令2002/95/EC (RoHS1) and 2011/65/EU (RoHS2)的模块,特别适用于医疗设备公司. 不合格的依据是–最大浓度值和合格声明/ ...

  7. 两种异常(CPU异常、用户模拟异常)的收集

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集  文章的核心:异常收集 ...

  8. django-admin和manage.py用法

    官网文档地址:django-admin和manage.py 金句: 所有的天赋,都来自于你对你喜欢的某种事物的模仿与学习,否则你就不会有这种天赋. 开篇话: 我们在Django开发过程中,命令行执行最 ...

  9. 6、Time & Window

    一.Time & Watermark 1.1.DataStream支持的三种time DataStream有大量基于time的operator Flink支持三种time: EventTime ...

  10. 2019-2020-1 20199308《Linux内核原理与分析》第六周作业

    <Linux内核分析> 第五章 系统调用的三层机制(下) 5.1 给MenuOS增加命令 强制删除当前menu目录,用get clone重新克隆一个新版本的menu,运行make root ...