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分布式爬虫抓取知乎用户信息并进行数据分析

    在以前的文章中,我写过一篇使用selenium来模拟登录知乎的文章,然后在很长一段时间里都没有然后了... 不过在最近,我突然觉得,既然已经模拟登录到了知乎了,为什么不继续玩玩呢?所以就创了一个项目, ...

  2. bin/postconf: error while loading shared libraries: libmysqlclient

    今天在编译安装postfix的时候 make install 出现如下错误 bin/postconf: error while loading shared libraries: libmysqlcl ...

  3. POJ:3190-Stall Reservations

    传送门:http://poj.org/problem?id=3190 Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total ...

  4. 笔记-python-lib-lxml

    笔记-python-lib-lxml 1.      lxml简介 lxml是一个实现解析网页文件的库,python中自带有解析库,但没有lxml方便好用. The lxml XML toolkit ...

  5. Android 拍照或相册选择照片进行显示缩放位图 Demo

    拍照后直接使用 BitmapFactory.decodeStream(...) 进行创建 Bitmap 并显示是有问题的. Bitmap 是个简单对象,它只存储实际像素数据,也就是说,即使原始照片已压 ...

  6. Flume使用(案例分析)

    Flume官方文档 Usage: bin/flume-ng <command> [options]... commands: help display this help text age ...

  7. Robolectric

    今天学习了单元测试框架,Robolectric.初步感觉,可能我测试的少,没有感觉Robolectric能有多大的帮助.虽然可以帮助创建activity.可以模拟点击事件.可是有什么呢. 好吧,讲下使 ...

  8. 跨站请求伪造(csrf)中间件整理

    一. CSRF中间件 字面意思跨站请求伪造; 即模仿个请求朝服务器发送,django中对跨站伪造的请求有相应的校验 from django.views.decorators.csrf import c ...

  9. 如何高性能的给 UIImageView 加个圆角?

    不好的解决方案 使用下面的方式会强制Core Animation提前渲染屏幕的离屏绘制, 而离屏绘制就会给性能带来负面影响,会有卡顿的现象出现 self.view.layer.cornerRadius ...

  10. 《Cracking the Coding Interview》——第14章:Java——题目5

    2014-04-26 19:06 题目:Java中的对象反射机制是什么?有鼠么用? 解法:完全不了解,因为java编程经验太少,完全没用过.查了一些资料后,感觉反射机制是个强大并需要边用边体会的强大工 ...