这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当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. 解决xcode ***is missing from working copy

    这是由于SVN置顶文件导致的,cd 至项目根目录 命令行 输入 find . -type d -name .svn | xargs rm -rf

  2. JS生成随机颜色(rgb)

    /*随机获取颜色*/ function getRandomColor() { var r = Math.floor(Math.random() * 256); var g = Math.floor(M ...

  3. Python-气象-大气科学-可视化绘图系列(一)——利用xarray读取netCDF文件并画图(代码+示例)

    本文原创链接:https:////www.cnblogs.com/zhanling/p/12192978.html 1 import numpy as np import xarray as xr i ...

  4. openssl进行RSA加解密(C++)

    密钥对根据RSA的加密机制(自行查找RSA工作原理),通常可以私钥加密-公钥解密(多用于签名),公钥加密-私钥解密(多用于数据传输加密),私钥可以生成公钥. 密钥对生成生成私钥,长度为2048,默认格 ...

  5. web form常用控件

    表单元素一共12个分三大类 文本类<input type="text" />             文本框<input type="password& ...

  6. 详解 Hashtable

    至于HashTable,本人只想说,除了它们各自的特点是截然相反外,其余性质 以及 用法和HashMap的性质几乎一样, (有关Map集合的基本性质,请观看本人博文-- <详解 Map集合> ...

  7. vue使用trackingjs

    前言:因为公司是做人工智能-AI的,所有一个web数据平台为了装X,需要做个人脸登陆.前台需要把人脸的base64发给后台去做人脸校验. 功能很简单,需要注意的是web需要实现“调用摄像头”和“自动拍 ...

  8. C# 静态变量、静态函数、实体变量、实体函数在一个类中的执行顺序

    为了弄清这个代码,写了个测试,但是测试的结果和往上的代码有所差别,仁者见仁,智者见智了.如果我的测试用例用问题,欢迎指出. 首先,方法的是在被调用时执行,但是静态方法在所有地方都可以调用,应该在很早的 ...

  9. 设计可靠的udp

    推荐链接: https://www.cnblogs.com/lixiang-share/p/7152870.html

  10. Openstack Swift 如何查找 slave node 挂载的 VD 的 IP

    1. 在 /etc/swift/container-server.conf 或者 object-server.conf 中的 devices= 一行 可以找到 /srv/node. 在 /srv/no ...