洛谷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)} ...
随机推荐
- MongoDB 实现 create table tab2 as select
1. var result = db.foo.aggregate(...);db.bar.insert(result.result); 2. var temp1 = db.mtb1.find(name ...
- nightwatch 基于Webdriver的端到端自动化测试框架
nightwatch 是使用nodejs编写的,基于Webdriver api 的端到端自动化测试框架 包含以下特性 清晰的语法,基于js 以及css 还有xpath 的选择器 内置测试runner, ...
- http响应消息
1. 请求消息:客户端发送给服务器端的数据 * 数据格式: 1. 请求行 2. 请求头 3. 请求空行 4. 请求体 2. 响应消息:服务器端发送给客户端的数据 * 数据格式: 1. 响应行 1. 组 ...
- 数据库MySQL调优实战经验总结<转>
数据库MySQL调优实战经验总结 MySQL 数据库的使用是非常的广泛,稳定性和安全性也非常好,经历了无数大小公司的验证.仅能够安装使用是远远不够的,MySQL 在使用中需要进行不断的调整参数或优化设 ...
- node.js 自启动工具 supervisor
supervisor 会不停的watch 你应用下面的所有文件,发现有文件被修改,就重新载入程序文件这样就实现了部署,修 改了程序文件后马上就能看到变更后的结果.麻麻再也不用担心我的重启 nodejs ...
- CAP原则 (阿里)
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance).CAP 原则指的是,这三 ...
- ROLLUP、CUBE、GROUP BY的使用区别
1.ROLLUP:根据维度在数据结果集中进行的聚合操作,可多维度SELECT count(*) num,MONTH(register_time) times,`status` FROM `user` ...
- sumdoc t411 dir.txt
C:\Users\zhoufeiyue\Documents\sumdoc t411\(9+条消息)redis Jedis存取list对象和map - shenjianxz的博客 - CSDN博客.mh ...
- 运维笔记--SqlServer相关版本&下载&安装&配置远程连接
下载地址:SqlServer2008为例 SqlServer2008:https://www.microsoft.com/en-us/download/details.aspx?id=1695 Sql ...
- Scrapy爬虫Demo 爬取资讯分类
爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(sys) sys.se ...