loj #2051. 「HNOI2016」序列
#2051. 「HNOI2016」序列
题目描述
给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na1,a2,⋯,an,记为 a[1:n] a[1 \colon n]a[1:n]。类似地,a[l:r] a[l \colon r]a[l:r](1≤l≤r≤N 1 \leq l \leq r \leq N1≤l≤r≤N)是指序列:al,al+1,⋯,ar−1,ar a_{l}, a_{l+1}, \cdots ,a_{r-1}, a_ral,al+1,⋯,ar−1,ar。若 1≤l≤s≤t≤r≤n1\leq l \leq s \leq t \leq r \leq n1≤l≤s≤t≤r≤n,则称 a[s:t] a[s \colon t]a[s:t]是 a[l:r] a[l \colon r]a[l:r] 的子序列。
现在有 q qq 个询问,每个询问给定两个数 l ll 和 r rr,1≤l≤r≤n 1 \leq l \leq r \leq n1≤l≤r≤n,求 a[l:r] a[l \colon r]a[l:r] 的不同子序列的最小值之和。例如,给定序列 5,2,4,1,3 5, 2, 4, 1, 35,2,4,1,3,询问给定的两个数为 1 11 和 3 33,那么 a[1:3] a[1 \colon 3]a[1:3] 有 6 66 个子序列 a[1:1],a[2:2],a[3:3],a[1:2],a[2:3],a[1:3]a[1 \colon 1], a[2 \colon 2], a[3 \colon 3], a[1 \colon 2],a[2 \colon 3], a[1 \colon 3]a[1:1],a[2:2],a[3:3],a[1:2],a[2:3],a[1:3],这 666 个子序列的最小值之和为 5+2+4+2+2+2=175+2+4+2+2+2=175+2+4+2+2+2=17。
输入格式
输入文件的第一行包含两个整数 n nn 和 q qq,分别代表序列长度和询问数。
接下来一行,包含 n nn 个整数,以空格隔开,第 i ii 个整数为 ai a_iai,即序列第 iii 个元素的值。
接下来 q qq 行,每行包含两个整数 l ll 和 r rr,代表一次询问。
输出格式
对于每次询问,输出一行,代表询问的答案。
样例
样例输入
5 5
5 2 4 1 3
1 5
1 3
2 4
3 5
2 5
样例输出
28
17
11
11
17
数据范围与提示
对于 100%100\%100% 的数据,1≤n,q≤100000,∣ai∣≤109 1 \leq n,q \leq 100000 ,|a_i| \leq 10^91≤n,q≤100000,∣ai∣≤109
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int n,q,a[maxn],L[maxn],R[maxn],to[maxn];
void make(int i){
L[i]=R[i]=i;
int l=i,r=i;
while(a[l-]>=a[i]&&l>)l--;
while(a[r+]>=a[i]&&r<n)r++;
L[i]=l;R[i]=r;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)make(i);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(a[i]==a[j]){to[i]=j;break;}
int x,y;
while(q--){
long long ans=;
scanf("%d%d",&x,&y);
for(int i=x;i<=y;i++){
if(to[i]&&i>=L[to[i]])continue;
int l=max(x,L[i]),r=min(y,R[i]);
ans+=1LL*(i-l+)*(r-i+)*a[i];
}
cout<<ans<<endl;
}
}
40分 暴力
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 200010
using namespace std;
long long lg[maxn],mn[maxn][],a[maxn],mnid[maxn][];
long long belong[maxn],Ans[maxn],fl[maxn],fr[maxn],sta[maxn],top;
struct node{
int l,r,id;
bool operator < (const node &b)const{
if(belong[l]==belong[b.l])return r<b.r;
return belong[l]<belong[b.l];
}
}q[maxn];
long long qread(){
long long i=,j=;
char ch=getchar();
while(ch<''||ch>''){if(ch=='-')j=-;ch=getchar();}
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i*j;
}
void pre(long long n){//st表
lg[]=;
for(int i=;i<=n;i++){
lg[i]=lg[i-];
if(i==(<<lg[i]+))lg[i]++;
}
for(int i=n;i>=;i--){
mn[i][]=a[i];
mnid[i][]=i;
for(int j=;i+(<<j)-<=n;j++){
mn[i][j]=min(mn[i][j-],mn[i+(<<j-)][j-]);
if(mn[i][j]==mn[i][j-])mnid[i][j]=mnid[i][j-];
if(mn[i][j]==mn[i+(<<j-)][j-])mnid[i][j]=mnid[i+(<<j-)][j-];
}
}
}
long long query(long long l,long long r){
long long k=lg[r-l+];
if(mn[l][k]<mn[r-(<<k)+][k])return mnid[l][k];
return mnid[r-(<<k)+][k];
}
void dp(long long n,long long *f){//单调栈
sta[top=]=;
for(int i=;i<=n;i++){
while(a[sta[top]]>a[i])top--;
f[i]=(i-sta[top])*a[i]+f[sta[top]];
sta[++top]=i;
}
}
long long up_r(long long l,long long r){
long long p=query(l,r+);
return (p-l+)*a[p]+fl[r+]-fl[p];
}
long long up_l(long long l,long long r){
long long p=query(l-,r);
return (r-p+)*a[p]+fr[l-]-fr[p];
}
int main(){
freopen("Cola.txt","r",stdin);
int n,Q;
n=qread();Q=qread();
a[]=-(1LL<<);
for(int i=;i<=n;i++)a[i]=qread();
pre(n);dp(n,fl);
reverse(a+,a+n+);
dp(n,fr);
reverse(a+,a+n+);reverse(fr+,fr+n+);
int block=sqrt(n)+;
for(int i=;i<=n;i++)belong[i]=(i/block)+;
for(int i=;i<=Q;i++){
q[i].l=qread();q[i].r=qread();
q[i].id=i;
}
sort(q+,q+Q+);
a[]=;
int l=,r=;long long ans=a[];
for(int i=;i<=Q;i++){
while(r<q[i].r)ans+=up_r(l,r++);
while(r>q[i].r)ans-=up_r(l,--r);
while(l>q[i].l)ans+=up_l(l--,r);
while(l<q[i].l)ans-=up_l(++l,r);
Ans[q[i].id]=ans;
}
for(int i=;i<=Q;i++)cout<<Ans[i]<<endl;
return ;
}
100分 莫队+st表+单调栈
loj #2051. 「HNOI2016」序列的更多相关文章
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- 「HNOI2016」序列 解题报告
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...
- LOJ 3158: 「NOI2019」序列
题目传送门:LOJ #3158. 题意简述: 给定两个长度为 \(n\) 的正整数序列 \(a,b\),要求在每个序列中都选中 \(K\) 个下标,并且要保证同时在两个序列中都被选中的下标至少有 \( ...
- LOJ #2183「SDOI2015」序列统计
有好多好玩的知识点 LOJ 题意:在集合中选$ n$个元素(可重复选)使得乘积模$ m$为$ x$,求方案数对$ 1004535809$取模 $ n<=10^9,m<=8000且是质数,集 ...
- LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分
题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...
- loj#2049. 「HNOI2016」网络(set 树剖 暴力)
题意 题目链接 Sol 下面的代码是\(O(nlog^3n)\)的暴力. 因为从一个点向上只会跳\(logn\)次,所以可以暴力的把未经过的处理出来然后每个点开个multiset维护最大值 #incl ...
- LOJ #2048. 「HNOI2016」最小公倍数
题意 有 \(n\) 个点,\(m\) 条边,每条边连接 \(u \Leftrightarrow v\) 且权值为 \((a, b)\) . 共有 \(q\) 次询问,每次询问给出 \(u, v, q ...
- loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...
- LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)
题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...
随机推荐
- 免Oracle客户端程序监听程序配置
Oracle默认安装时,监听程序和tnsnames程序中的监听方式都是默认的localhost,但免客户端的程序是连接不上的.这时需要: 1.将listener中的(HOST = localhost) ...
- 一个7重嵌套表EF添加语句,注意子表赋值过程中只需写子表主键赋值,不需要写子表外键=父表主键。EF创建时会自动将子表外键设为与父表主键相等
AIRPORT_HELIPORT tt = new AIRPORT_HELIPORT() { AIRPORT_HELIPORT_UUID = Gui ...
- mysql跟踪执行的sql语句
修改my.cnf配置文件 /usr/local/mysql/bin/mysql --verbose --help | grep -A 1 'Default options' Default optio ...
- 01CSS的引入方式
引入CSS方式(重点掌握) 行内样式 内接样式 外接样式 链接式 导入式 css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负 ...
- 通过DG_BROKE搭建Oracle11g_adg
1.环境 db_primary db_stanby db版本 11.2.0.4.0 11.2.0.4.0 os版本 centos 6.4 centos 6.4 db_unique_name newte ...
- Vulkan Tutorial 03 理解Instance
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Creating an instance 与Vulkan打交道,通常的步骤是创建一个 ...
- Redis搭建(三):哨兵模式
一.sentinel介绍 Redis 2.8中提供了“哨兵”工具来实现自动化的系统监控和故障恢复功能. Redis 2.6 版也提供了哨兵工具,但此时的哨兵是1.0版,存在非常多的问题,任何情况下都不 ...
- js的简单介绍及基本用法
1. JS的简介 概述: JavaScript, 是一门弱类型语言, 用来给页面增加动态功能的. //弱类型语言: 对数据的数据类型划分不精细(不明确). 特点: A. JavaScript 是一种轻 ...
- 在cmd中 操作 数据库 MySQL 的一些命令
环境变量配置配置好以后, 打开cmd 连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样) 断开:exit (回车) 创建授权:grant sele ...
- Linux下cacti的安装
Cacti安装手册 第一步. Cacti的架构 第二步. Cacti的工作流程 第三步. Cacti简介 1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用r ...