5

题意

给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间开方,区间求和。

思路

用\(tag\)记录这一块是否已全为\(1\).

除分块外,还可用 树状数组+并查集(链表) 或者 线段树 做,见 Educational Codeforces Round 37 F

Code

#include <bits/stdc++.h>
#define maxn 50010
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;
typedef long long LL;
int n, blo, a[maxn], sum[maxn], bl[maxn];
bool tag[maxn];
void modify(int l, int r) {
int temp;
F(i, l, min((bl[l]+1)*blo, r+1)) sum[bl[l]] += (temp=sqrt(a[i]))-a[i], a[i] = temp;
if (bl[l]!=bl[r]) F2(i, bl[r]*blo, r) sum[bl[r]] += (temp=sqrt(a[i]))-a[i], a[i] = temp;
F(i, bl[l]+1, bl[r]) {
if (tag[i]) continue;
bool flag = true;
F(j, i*blo, (i+1)*blo) {
sum[i] += (temp=sqrt(a[j]))-a[j], a[j] = temp;
if (temp > 1) flag = false;
}
tag[i] = flag;
}
}
int query(int l, int r) {
int ret = 0;
F(i, l, min((bl[l]+1)*blo, r+1)) ret += a[i];
if (bl[l]!=bl[r]) F2(i, bl[r]*blo, r) ret += a[i];
F(i, bl[l]+1, bl[r]) ret += sum[i];
return ret;
}
int main() {
scanf("%d", &n); blo = sqrt(n);
F(i, 0, n) scanf("%d", &a[i]), bl[i] = i/blo;
int num = (n+blo-1) / blo;
F(i, 0, num-1) {
F(j, i*blo, (i+1)*blo) sum[i] += a[j];
}
F(j, (num-1)*blo, min(num*blo, n+1)) sum[num-1] += a[j];
F(i, 0, n) {
int op, l, r, c;
scanf("%d%d%d%d", &op, &l, &r, &c); --l, --r;
if (op) printf("%d\n", query(l, r));
else modify(l, r);
}
return 0;
}

7

题意

给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间乘法,区间加法,单点询问。

思路

用\(mtag\)记录每个块整体的倍数,用\(atag\)记录每个块整体的增量。

并且约定\(mtag\)优先级更高,即真实值为\(x*mtag+atag\)

对于不完整的块,先将\(tag\)下放,再直接修改元素;

对于完整的块,修改\(tag\):

  1. \(+c\):即\((x*mtag+atag)+c=x*mtag+(atag+c)\),于是atag += x;
  2. \(\times c\):即\((x*mtag+atag)*c=x*(mtag*c)+(atag*c)\),于是atag *= x, mtag *= x

Code

#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define mod 10007
#define maxn 100010
#define maxm 1010
using namespace std;
typedef long long LL;
int n, blo, bl[maxn], a[maxn], mtag[maxm], atag[maxm];
void reset(int p) {
F(i, p*blo, (p+1)*blo) {
(((a[i]*=mtag[p])%=mod)+=atag[p])%=mod;
}
mtag[p] = 1, atag[p] = 0;
}
void work(int op, int l, int r, int c) {
reset(bl[l]);
F(i, l, min(r+1, (bl[l]+1)*blo)) {
if (op) (a[i]*=c)%=mod;
else (a[i]+=c)%=mod;
}
if (bl[l]!=bl[r]) {
reset(bl[r]);
F2(i, bl[r]*blo, r) {
if (op) (a[i]*=c)%=mod;
else (a[i]+=c)%=mod;
}
}
F(i, bl[l]+1, bl[r]) {
if (op) {
(mtag[i]*=c)%=mod;
(atag[i]*=c)%=mod;
}
else (atag[i]+=c)%=mod;
}
}
int main() {
scanf("%d", &n); blo = sqrt(n);
F(i, 0, n) {
scanf("%d", &a[i]);
mtag[bl[i] = i/blo] = 1;
}
int num=(n+blo-1)/blo;
F(i, 0, n) {
int op, l, r, c;
scanf("%d%d%d%d",&op,&l,&r,&c); --l, --r;
if (op==2) printf("%d\n", (a[r]*mtag[bl[r]]%mod+atag[bl[r]])%mod);
else work(op, l, r, c);
}
return 0;
}

8

题意

给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及询问等于一个数\(c\)的元素,并将这个区间的所有元素改为\(c\).

思路

类似上面两题。

用\(tag\)维护这一块是否均为同一个数。

对于不完整的块:先下放\(tag\)后逐个统计修改元素

对于完整的块:直接针对\(tag\)进行统计和修改

Code

#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 100010
#define maxm 1010
using namespace std;
typedef long long LL;
int a[maxn], bl[maxn], n, blo, tag[maxm];
bool flag[maxm];
void reset(int p) {
if (!flag[p]) return;
flag[p] = false;
F(i, p*blo, min(n, (p+1)*blo)) a[i] = tag[p];
}
int query(int l, int r, int c) {
int ret=0;
if (flag[bl[l]]&&tag[bl[l]]==c) ret += min(r+1, (bl[l]+1)*blo)-l;
else {
reset(bl[l]);
F(i, l, min(r+1, (bl[l]+1)*blo)) {
ret += a[i]==c;
a[i] = c;
}
}
if (bl[l]!=bl[r]) {
if (flag[bl[r]]&&tag[bl[r]]==c) ret += r-bl[r]*blo+1;
else {
reset(bl[r]);
F2(i, bl[r]*blo, r) {
ret += a[i]==c;
a[i] = c;
}
}
}
F(i, bl[l]+1, bl[r]) {
if (flag[i]) {
if (tag[i]==c) ret += blo;
}
else {
flag[i] = true;
F(j, i*blo, (i+1)*blo) ret += a[j]==c;
}
tag[i] = c;
}
return ret;
}
int main() {
scanf("%d", &n); blo = sqrt(n);
F(i, 0, n) {
scanf("%d", &a[i]);
bl[i] = i/blo;
}
int num = (n+blo-1)/blo;
F(i, 0, n) {
int l, r, c;
scanf("%d%d%d", &l,&r,&c); --l, --r;
printf("%d\n", query(l, r, c));
}
return 0;
}

loj 数列分块入门 5 7 8的更多相关文章

  1. [Loj] 数列分块入门 1 - 9

    数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...

  2. loj 数列分块入门 6 9(区间众数)

    6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...

  3. LOJ 数列分块入门系列

    目录 1.区间加+单点查 每个块维护tag,散的暴力改. code: #include<bits/stdc++.h> using namespace std; const int maxn ...

  4. LOJ 6277:数列分块入门 1(分块入门)

    #6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...

  5. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

    #6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给 ...

  6. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  7. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

    #6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  8. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  9. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

随机推荐

  1. python-4函数式编程

    1-高阶函数 变量可以指向函数.   def add(x, y, f): 例如f参数为函数 编写高阶函数,就是让函数的参数能够接收别的函数. Python内建了map()和reduce()高阶函数. ...

  2. 使用.gitignore忽视项目中的文件/文件夹

    在项目开发的过程中,我们经常需要IDE来提高编程效率.然而,不同的IDE会生成各种各样的临时文件.在项目生命周期中,我们往往不需要关注这类文件的变更记录,因而我们是不需要将它们加入到源代码管理器中. ...

  3. HTML介绍和head标签-01

    主要内容 web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 HTML规范 HTML结构详解 一.web标准 web准备介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织 ...

  4. HUAWEI TAG-AL00 找IMEI的过程

    前几天,遇到一台华为机型,IMEI获取有问题,然后就找了一下. 以下是解决过程,权当记录一下,尽管为知笔记已经有备份了 :) 0x01: 起因 测试小哥发现,一台机型IMEI获取不全,有问题,拨号页面 ...

  5. springboot配多数据源

    多数据源配置 https://blog.csdn.net/neosmith/article/details/61202084 https://www.cnblogs.com/zhangboyu/p/7 ...

  6. day06_03 购物车讲解01

    1.0 思路 1.1 列表嵌套 # name1 = ['mac','book','bike','kindle'] a = [[1,2,3],'alex',(2,3,4)] print(a[0]) #& ...

  7. springboot集成shiro——使用RequiresPermissions注解无效

    在Springboot环境中继承Shiro时,使用注解@RequiresPermissions时无效 @RequestMapping("add") @RequiresPermiss ...

  8. HDU 1171 Big Event in HDU 母函数

    欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory ...

  9. poj 2151 概率DP(水)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5750   ...

  10. PHP异常处理类(文件上传提示)

    知识点: 大部分时候我们的代码总有各种各样的bug,新手程序员(比如我)最经常的工作就是不停的报错和echo变量,一个好的异常处理类可以帮我们更快+更容易理解报错代码的问题,同时,异常处理还可以避免一 ...