洛谷P3984-数据结构 题解
这题精,真的精
前言:不要被题目背景和描述误导!
Solution:
题目大意
给定一段序列,请你做到区间修改和区间询问。
区间询问即 在 \(L\) 到 \(R\) 区间内,乘上下标后取模的值在条件范围内的元素的个数 。
暴力方法
时间不充裕者跳过
一道题目, 正解都是由简单到困难一步一步推导出来的 。我们不如先使用暴力来做。
暴力为了优化一点,我们不妨用 差分 进行区间修改的优化
差分是什么?
比如一次需要你对 \(X\) 到 \(Y\) 区间内的所有数加上 \(K\) ,正常都是for(int i : x~y)a[i]++,之间复杂度明显为 N。
而差分,只需要另外那一个数组,在 \(X\) 位置加上 \(K\) , 在 \(Y + 1\) 位置减去 \(K\) ,到最后询问时累加前缀和即可。
差分数组定义: 差分数组 [ i ] 即 原始数组 [ i ] - 原始数组 [ i - 1 ]
差分模板:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 10000 + 5;//定义常量
int a[MAXN];//原始序列
int b[MAXN];//差分序列
inline int read(){//快速读入
int f = 1, x = 0;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return f * x;
}
int main(){
int n = read();//输入元素个数
for(int i = 1;i <= n; i += 1){//+= 1会比 ++ 更快(某机房巨佬说的)
a[i] = read();
b[i] = a[i] - a[i - 1];//初始化差分数组
}
int m = read();//输入操作次数
while(m--){
int x = read(),y = read(),z = read();
//左边界 右边界 修改数量
b[x] += z,b[y + 1] -= z;//差分操作
}
for(int i = 1;i <= n; i++){
b[i] += b[i - 1];//累加差分数组(前缀和)
cout<<b[i]<<" ";//输出
}
return 0;
}
回归正题
修改操作使用差分进行优化,而查询操作就需要动态暴力枚举完成了。
暴力查询操作代码:
int query(int x,int y){
int num = 0;
ll B[MAXN];//临时用来累加差分数组的数组
memset(B,0,sizeof(B));
for(int i = 1;i <= n + 1; i++){
B[i] = b[i] + B[i - 1];
//cout<<B[i]<<" ";
}
//cout<<"\n";
for(int i = x;i <= y; i++){
ll shit = MOD(B[i] * i);//取模操作需要单独处理负数情况,这里我单独用了一个函数
//cout<<i<<" "<<shit<<"\n";
if(shit >= Min && shit <= Max) num++;
}
return num;
}
我们再认真读一遍题,会发现,前面的 Q 次操作是动态的(由于数组会修改),所以我们
不得不暴力查询。但是后面那只“非三次元仓鼠”的询问时静态的(数组不会变了)。
所以:
我们只要预处理前 i 位有多少个符合要求的元素即可!
正解思路总结:
首先对于前面 Q 次操作,使用差分进行修改,暴力进行查询。后面 \(F\) 次静态查询通过预处理后 O(1) 复杂度即可求出答案。 注意:该题对于long long的要求极其之严格,需要大家注意!
AC代码:
#include<bits/stdc++.h>//潇洒的万能头
#define ll long long//懒人必备
using namespace std;
const int MAXN = 80000 + 5;//定义常量
int n,q,Min,Max;//如题所述,Q为操作次数
ll mod;//mod的值
ll b[MAXN];//差分数组
ll a[MAXN];//预处理数组
inline ll read(){//快速读入
ll f = 1, x = 0;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return f * x;
}
ll MOD(ll xxx){//单独处理负数取模
if(xxx > 0)return xxx % mod;
return -1 * ((-xxx) % mod);
}
int query(int x,int y){//暴力询问
int num = 0;//累加器
ll B[MAXN];//临时用来累加差分数组的数组
memset(B,0,sizeof(B));
for(int i = 1;i <= n + 1; i++){
B[i] = b[i] + B[i - 1];//累加前缀和
//cout<<B[i]<<" ";
}
//cout<<"\n";
for(int i = x;i <= y; i++){
ll shit = MOD(B[i] * i);
//cout<<i<<" "<<shit<<"\n";
if(shit >= Min && shit <= Max) num++;//合法则累加
}
return num;
}
int main(){//开始了
// freopen("dis.out","w",stdout);
n = read(),q = read(),mod = read(),Min = read(),Max = read();//快速读入
for(int i = 1;i <= q; i++){//循环操作次数
char c;
cin>>c;//读入操作
if(c == 'A'){//如果是区间修改
int x = read(),y = read();//读入左边界和右边界
ll z = read();//读入修改的值
b[x] += z,b[y + 1] -= z;//差分数组 O(1) 修改
}
if(c == 'Q'){//如果是询问
int x = read(),y = read();//入左边界和右边界
cout<<query(x,y)<<"\n";//输出答案
}
}
ll F = read();//“非三次元仓鼠”静态操作
for(int i = 1;i <= n + 1; i++){
b[i] += b[i - 1];//先累加差分的前缀和
}
for(int i = 1;i <= n; i++){
ll shit = MOD(b[i] * i);
if(shit >= Min && shit <= Max) a[i]++;//合法则累加
a[i] += a[i - 1];//预处理前缀和
}
while(F--){//循环
int x = read(),y = read();//读入左边界和右边界
cout<<a[y] - a[x - 1]<<"\n";//输出
}
return 0;//end
}
洛谷P3984-数据结构 题解的更多相关文章
- [洛谷P3948]数据结构 题解(差分)
[洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...
- 洛谷P3948 数据结构——题解
题目传送 感觉这道题秀了我一地的智商... 审题没审好,没确定带修改的操作中询问的次数<=1000,且max和min都是事先给好.不变的.想了半天线段树.分块,却忘了最基础的暴力. 写不出题时先 ...
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 洛谷P2827 蚯蚓 题解
洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...
- 洛谷P1816 忠诚 题解
洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
- [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解
原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
- 洛谷 P5221 Product 题解
原题链接 庆祝!第二道数论紫题. 推式子真是太有趣了! \[\prod_{i=1}^n \prod_{j=1}^n \frac{\operatorname{lcm}(i,j)}{\gcd(i,j)} ...
随机推荐
- 大文件断点续传插件webupload插件
java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接 ...
- Wbbpack --3配置
Wbbpack --3配置 什么是webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包(modulebundler)当 webpack 处理应用程序时,它会递归地构 ...
- Netflix-mantis 实时数据流开发平台
mantis 是netflix 开源的已经在netflix 使用了多年的实时流处理平台,目前从官方文档的介绍,在netflix使用场景很多 使用场景 上下文报警 监控netflix 的微服务 异常追踪 ...
- ent 基本使用四 图遍历查询
接上文,我们已经创建了基本的关系以及表实体,以下是通过图方式的查询 参考关系图 代码处理 创建图数据 func CreateGraph(ctx context.Context, client *ent ...
- Python 11 提取括号中间的内容
原文:https://blog.csdn.net/your_answer/article/details/80456550 import re string = 'abe(ac)ad)' p1 = r ...
- 单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)
拷贝这两个文件到自己的工程 测试1://单片机发送AT+RST\r\n 如果单片机串口接收到OK 或者ready 执行下一条 测试视频: https://qqqqqbucket.oss-cn-bei ...
- Tensorflow 损失函数(loss function)及自定义损失函数(三)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/limiyudianzi/article ...
- What is the difference between UNION and UNION ALL?
What is the difference between UNION and UNION ALL? UNION removes duplicate records (where all colum ...
- Linux下如何测试网速
本文链接:https://blog.csdn.net/Beyond_F4/article/details/80497118在Linux下如何测量下载和上传的速度? 这里用到一个Python工具spee ...
- win7上手机ADB interface无法安装驱动
解决办法: https://blog.csdn.net/riyuexingchen1204/article/details/84594061