首页 > 其他分享 >P5309 [Ynoi2011] 初始化

P5309 [Ynoi2011] 初始化

时间:2022-11-15 19:57:24浏览次数:44  
标签:初始化 ch int Ynoi2011 sqrt P5309 RE Add res

P5309 [Ynoi2011] 初始化

考虑暴力,模拟题意,时间复杂度竟是\(O(\frac{n^2}{x})\),那么对于\(x \ge \sqrt{n}\)的修改就可以暴力了,这不是根号分治吗。
再去考虑\(x < \sqrt{n}\)的修改,那么不同的\(x\)最多只有\(\sqrt{n}\)个,维护一个余数的前缀和和一个后缀和即可,对询问\(l,r\)按\(x\)分块,就可以算贡献了,总时间复杂度为\(O(n\sqrt{n})\)。

Code
#include<cstdio>
#include<iostream>
#include<cmath>
#define IN inline
#define RE register
#define LL long long
using namespace std;
const int N = 2e5 + 5, M = 800, P = 1e9 + 7;
int bl[N], g[M][M], f[M][M], a[N], vis[M], B, st[M], ed[M], n, m;

IN int read() {
	LL res = 0; char ch = getchar();
	for (; !isdigit(ch); ch = getchar());
	for (; isdigit(ch); ch = getchar()) res = ((res << 3) + (res << 1) + (ch ^ 48)) % P;
	return res;
}
IN int Add(int x, int y){return x + y >= P ? x + y - P : x + y;}
IN int query(int l, int r) {
	int res = 0;
	for (RE int i = 1; i < B; i++) {
		int q = (l + i - 1) / i, p = (r + i - 1) / i;
		int L = l - (q - 1) * i, R = r - (p - 1) * i;
		(p - q > 1) && (res = Add(res, (LL)(p - q - 1) * f[i][i] % P));
		(p == q) && (res = Add(res, Add(f[i][R] - f[i][L - 1], P)));
		(p != q) && (res = Add(res, Add(g[i][L], f[i][R])));
	}
	int x = bl[l], y = bl[r];
	if (x == y) {
		for (RE int i = l; i <= r; i++) res = Add(res, a[i]);
		return res;
	}
	for (RE int i = l; i <= ed[x]; i++) res = Add(res, a[i]);
	for (RE int i = st[y]; i <= r; i++) res = Add(res, a[i]);
	for (RE int i = x + 1; i < y; i++) res = Add(res, vis[i]);
	return res;
}
int main() {
	n = read(), m = read(), B = sqrt(n);
	if (B > 200) B -= 200;
	for (RE int i = 1; i <= n; i++) a[i] = read();
	int len = n / B;
	for (RE int i = 1; i <= len; i++) st[i] = ed[i - 1] + 1, ed[i] = i * B;
	ed[len] = n;
	for (RE int i = 1; i <= len; i++)
		for (RE int j = st[i]; j <= ed[i]; j++) bl[j] = i, vis[i] = Add(vis[i], a[j]);
	for (; m; m--) {
		int opt = read(), x = read(), y = read(), z;
		if (opt == 1) {
			z = read();
			if (x < B) {
				for (RE int i = y; i <= x; i++) f[x][i] = Add(f[x][i], z);
				for (RE int i = 1; i <= y; i++) g[x][i] = Add(g[x][i], z);
			}
			else for (RE int i = y; i <= n; i += x) a[i] = Add(a[i], z), vis[bl[i]] = Add(vis[bl[i]], z); 
		}
		else printf("%d\n",query(x, y));
	}
}

标签:初始化,ch,int,Ynoi2011,sqrt,P5309,RE,Add,res
From: https://www.cnblogs.com/nibabadeboke/p/16893665.html

相关文章

  • vue创建项目、初始化项目
    vue创建项目、初始化项目、vue请求代理条件:@vue/cli5.0.4node/v14.0.0一、安装脚手架工具 @vue/clinpminstall-g@vue/clinpminstall-g@vue/[email protected]......
  • 激活函数---->反向传播----》更新参数----》初始化
    神经元包含了非线性计算,用g()来表示,非线性计算由激活函数来实现,激活函数统一表示成g(z),常见的激活函数:1、sigmoid函数如果神经元采用sigmoid函数作为激活函数,那么单个神经元......
  • WinDBG详解进程初始化dll是如何加载的
    一:背景1.讲故事有朋友咨询个问题,他每次在调试WinDbg的时候,进程初始化断点之前都会有一些dll加载到进程中,比如下面这样:Microsoft(R)WindowsDebuggerVersion10.0.252......
  • initContainer 初始化容器
    initContainer1.概述1.1初始化容器的用途Init容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码;Init容器可以安全地运行这些工具,避免这些工具导致......
  • shell 的初始化流程
    目录shell初始化基本概念loginshellinteractiveshell不同的组合读取配置文件的区别这套神秘机制造成的麻烦~/.bashrc与~/.bash_profile之间的互动cron......
  • <四>构造函数初始化列表
    示例代码1点击查看代码classCDate{public:CDate(int_year,int_month,int_day){this->year=_year;this->month=_month;this->d......
  • CSP 202203-1 未初始化警告 C++
    1#include<iostream>2#include<vector>3intmain(){4intx{},y{};5std::cin>>x>>y;//读入第一行6std::vector<std::vector<int>>k......
  • 02-类与对象 进行试验--Java字段初始化的规律
    1.类的构造方法(1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。(2)如果类没有定义构造函数,Java编译器......
  • 洛谷P5309 Ynoi 2011 初始化 题解
    题面。我也想过根号分治,但是题目刷得少,数组不敢开,所以还是看题解做的。这道题目要用到根号分治的思想,可以看看这道题目和我的题解。题目要求处理一个数组a,支持如下操作......
  • 静态初始化块
    构造方法用于对象的普通属性初始化。静态初始化块,用于类的初始化操作,初始化静态属性。在静态初始化块中不能直接访问非static成员。......