
Lv.1
啊?
签名:你说的对,但是斜率优化后面忘了
在 C++测试题 中回复
【白白的第一题】线段计数
题目背景
小白白有一个数组,他懒得算区间最大值和最小值…………
题目描述
有一个正整数序列a1,a2,…an。给定一个范围[x,y],求这个范围内的最大值与最小值的差。
输入格式:
输入文件包第一行包含2个整数 n,m;n表示序列的长度,m表示给定的范围的数量。
第二行包含 n 个整数,相邻两数间用一个空格隔开,第 i 个整数为 ai 。
第3~m+2行,每行两个数字x,y,代表范围[x,y]。0<x<=y<=n
输出格式:
输出文件包含m个整数,每个整数一行;代表第i个范围内的最大值和最小值之差。
样例1输入: 6 1 4 3 2 5 3 5 3 5 样例1输出: 3 样例1解释:
[3,5]之间,三个数2,5,3 ,最大值与最小值之差为3
说明提示:
【数据规模与约定】
1< ai<10000
对于 30% 的数据:1< =m< n < =100
对于 70% 的数据: 1< =m< n < =10000
对于 100% 的数据: 1< =m< n < =1000000
提示:
数据规模较大,可以用线段树做
2022-07-01T17:15:51 点赞:0
在 关于社区接入防沉迷系统的公告 中回复
嘿嘿,大家都在发c++,那我就发个线段树模板吧,《》《》
#include <iostream>
using namespace std;
long long n,m,p;
long long a[100005];
struct Tre{
long long left,right;
long long num;
long long delta;
}tree[400005];
void build(long long id,long long l,long long r){
tree[id].left=l;tree[id].right=r;
if(l==r){
tree[id].num=a[l];
tree[id].delta=0;
}
else{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].delta=0;
tree[id].num=(tree[id*2].num+tree[id*2+1].num);
}
}
long long query(long long id,long long l,long long r){
if(tree[id].left>r||tree[id].right<l) return 0;
if(tree[id].left>=l&&tree[id].right<=r) return tree[id].num;
if(tree[id].delta){
tree[id*2].num+=((tree[id*2].right-tree[id*2].left+1)*tree[id].delta);
tree[id*2].delta+=tree[id].delta;
tree[id*2+1].num+=((tree[id*2+1].right-tree[id*2+1].left+1)*tree[id].delta);
tree[id*2+1].delta+=tree[id].delta;
tree[id].delta=0;
}
tree[id].num=(tree[id*2].num+tree[id*2+1].num);
return query(id*2,l,r)+query(id*2+1,l,r);
}
void update(long long id, long long l, long long r, long long delta){
if(tree[id].left>r||tree[id].right<l) return ;
if(tree[id].left>=l&&tree[id].right<=r){
tree[id].num+=((tree[id].right-tree[id].left+1)*delta);
tree[id].delta+=delta;
return ;
}
if(tree[id].delta){
tree[id*2].num+=((tree[id*2].right-tree[id*2].left+1)*tree[id].delta);
tree[id*2].delta+=tree[id].delta;
tree[id*2+1].num+=((tree[id*2+1].right-tree[id*2+1].left+1)*tree[id].delta);
tree[id*2+1].delta+=tree[id].delta;
tree[id].delta=0;
}
update(id*2,l,r,delta);
update(id*2+1,l,r,delta);
tree[id].num=(tree[id*2].num+tree[id*2+1].num);
}
int main(){
return 0;
}
记住,这是 基础中的基础 ,一定 要会》》》》
2022-07-11T10:07:17 点赞:0
在 关于我的C++回帖引起争相模仿…… 中回复
#include <iostream>
using namespace std;
long long n,m,p;
long long a[100005];
struct Tre{
long long left,right;
long long num;
long long delta;
}tree[400005];
void build(long long id,long long l,long long r){
tree[id].left=l;tree[id].right=r;
if(l==r){
tree[id].num=a[l];
tree[id].delta=0;
}
else{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].delta=0;
tree[id].num=(tree[id*2].num+tree[id*2+1].num);
}
}
long long query(long long id,long long l,long long r){
if(tree[id].left>r||tree[id].right<l) return 0;
if(tree[id].left>=l&&tree[id].right<=r) return tree[id].num;
if(tree[id].delta){
tree[id*2].num+=((tree[id*2].right-tree[id*2].left+1)*tree[id].delta);
tree[id*2].delta+=tree[id].delta;
tree[id*2+1].num+=((tree[id*2+1].right-tree[id*2+1].left+1)*tree[id].delta);
tree[id*2+1].delta+=tree[id].delta;
tree[id].delta=0;
}
tree[id].num=(tree[id*2].num+tree[id*2+1].num);
return query(id*2,l,r)+query(id*2+1,l,r);
}
void update(long long id, long long l, long long r, long long delta){
if(tree[id].left>r||tree[id].right<l) return ;
if(tree[id].left>=l&&tree[id].right<=r){
tree[id].num+=((tree[id].right-tree[id].left+1)*delta);
tree[id].delta+=delta;
return ;
}
if(tree[id].delta){
tree[id*2].num+=((tree[id*2].right-tree[id*2].left+1)*tree[id].delta);
tree[id*2].delta+=tree[id].delta;
tree[id*2+1].num+=((tree[id*2+1].right-tree[id*2+1].left+1)*tree[id].delta);
tree[id*2+1].delta+=tree[id].delta;
tree[id].delta=0;
}
update(id*2,l,r,delta);
update(id*2+1,l,r,delta);
tree[id].num=(tree[id*2].num+tree[id*2+1].num);
}
int main(){
return 0;
}2022-07-11T10:14:19 点赞:0
在 【㵘】晒出你最早的消息 中回复
吉吉喵 9个月前 【限时福利】编程猫皮肤限时放送 三步即可获得,限量编程猫皮肤 1.进入神岛任一已发布地图游玩 快速入口喵ao.cn/p/weapon-to-try 2.点击右上角菜单内【分享地图】按钮,获得邀请链接 3.将邀请链接发送给2名神岛新人好友,好友成功注册即可获得
2022-07-15T13:20:40 点赞:0
在 [NOC复赛】难道没有人考Python吗? 中回复
都没有我学的………………………………………………………………………………………………我只学过C++
2022-07-18T10:09:28 点赞:0
在 一定得点进来看看!666! 中回复
#include<bits/stdc++.h>
using namespace std;
void awa(int a){
if(a>=114514)return;
puts(6+'0');
f(a+1);
}
int main(){
f(1);
cout<<"才怪";
cout<<"NOC这么水谁去啊";
}2022-07-20T18:58:09 点赞:0