[HNOI2016]序列(未通过)
题解:
虽然知道有点问题但是并没有debug出来
发现错误了。。相同元素的处理有错误
网上题解大都是分块。。(hn怎么道道分块)
用最普通的思路,可以枚举每个点作为最小值,向左向右延伸
但是多组询问显然我们是要去优化询问过程的
有一种方法就是先找出最大值
(其实也可以是随意一个位置吧,但yy一下应该最大值能扩展的比较快)
然后向两边分别找第一个比它小的值
那么我们会发现,中间这一段元素他们一定是小于两边的值的
也就是说,如果这两个点在区间里,中间的点也全部在区间里
那么就可以用前缀和来预处理了
当比它小的点已经超出边界的时候,显然是可以递归处理的
查找最大值用倍增维护一下(线段树多了个log)
时间复杂度在数据不随机的情况下大概会炸的
并没有ac的代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100100
#define INF 1e9
#define ll long long
ll h,t,n,m;
ll v[maxn],dp1[maxn],dp2[maxn],sum[maxn];
struct re{
ll h,t,pos,x;
}p[maxn*];
struct ree{
ll x1,x2;
}bz1[][maxn];
ll pd1(ll x,ll y)
{
if (v[x]>=v[y]) return(y);
else return(pd1(x,dp1[y]));
}
ll pd2(ll x,ll y)
{
if (v[x]>=v[y]) return(y);
else return(pd2(x,dp2[y]));
}
void updata(ll x)
{
p[x].x=max(p[x*].x,p[x*+].x);
if (p[x*].x>p[x*+].x)
p[x].pos=p[x*].pos;
else p[x].pos=p[x*+].pos;
}
int query(int h,int t)
{
int x=log2(t-h+),ans;
ree a=bz1[x][h],b=bz1[x][t-(<<x)+];
if (a.x1<b.x1) ans=b.x2; else ans=a.x2;
return(ans);
}
ll js(ll x,ll h,ll t)
{
return(v[x]*(min(dp2[x],t+)-x)*(x-max(dp1[x],h-)));
}
ll queryall(ll h,ll t)
{
if (h>t) return();
ll ans=,tmp,x;
tmp=x=query(h,t);
ans+=js(x,h,t);
while (dp2[x]<=t)
{
ans+=sum[dp2[x]-]-sum[x];
x=dp2[x];
ans+=js(x,h,t);
}
ans+=queryall(x+,t); x=tmp;
while (dp1[x]>=h)
{
ans+=sum[x-]-sum[dp1[x]];
x=dp1[x];
ans+=js(x,h,t);
}
ans+=queryall(h,x-);
return(ans);
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
std::ios::sync_with_stdio(false);
cin>>n>>m;
v[]=-INF; v[n+]=-INF;
for (ll i=;i<=n;i++) cin>>v[i];
for (ll i=;i<=n;i++)
{
dp1[i]=pd1(i,i-);
}
for (ll i=n;i>=;i--)
{
dp2[i]=pd2(i,i+);
}
for (int i=;i<=n;i++)
bz1[][i].x1=v[i],bz1[][i].x2=i;
for (int i=;i<=;i++)
for (int j=;j<=n;j++)
if (j+(<<i)-<=n)
{
ree a=bz1[i-][j],b=bz1[i-][j+(<<(i-))];
if (a.x1>b.x1) bz1[i][j].x1=a.x1,bz1[i][j].x2=a.x2;
else bz1[i][j].x2=b.x1,bz1[i][j].x2=b.x2;
}
for (ll i=;i<=n;i++)
{
sum[i]=
sum[i-]+(i-dp1[i])*(dp2[i]-i)*v[i];
}
for (ll i=;i<=m;i++)
{
cin>>h>>t;
cout<<queryall(h,t)<<endl;
}
}
[HNOI2016]序列(未通过)的更多相关文章
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- 【LG3246】[HNOI2016]序列
[LG3246][HNOI2016]序列 题面 洛谷 题解 60pts 对于每个位置\(i\),单调栈维护它往左第一个小于等于它的位置\(lp_i\)以及往右第一个小于它的位置\(rp_i\). 那么 ...
- 4540: [Hnoi2016]序列
4540: [Hnoi2016]序列 https://www.lydsy.com/JudgeOnline/problem.php?id=4540 分析: 莫队+RMQ+单调栈. 考虑加入一个点后,区间 ...
- [BZOJ4540][HNOI2016]序列 莫队
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n ...
- BZOJ4540 Hnoi2016 序列 【莫队+RMQ+单调栈预处理】*
BZOJ4540 Hnoi2016 序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- ...
- 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈
[BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1567 Solved: 718[Submit][Status] ...
- [HNOI2016]序列 CDQ+DP
[HNOI2016]序列 CDQ 链接 loj 思路 一个点最小变为l,最大变为r,不变的时候为v 那么j能在i前面就要满足. \(j<i\) \(r[j]<=v[i]\) \(v[j]& ...
- 题解-[HNOI2016]序列
题解-[HNOI2016]序列 [HNOI2016]序列 给定 \(n\) 和 \(m\) 以及序列 \(a\{n\}\).有 \(m\) 次询问,每次给定区间 \([l,r]\in[1,n]\),求 ...
- P6604 [HNOI2016]序列 加强版
*I. P6604 [HNOI2016]序列 加强版 摘自学习笔记 简单树论 笛卡尔树部分例题 I. 和 P6503 比较类似.我们设 \(f_i\) 表示全局以 \(i\) 结尾的子区间的最小值之和 ...
随机推荐
- (五)bootloader 启动 ucore os
Lab1 : bootloader 启动 ucore os 一.内容提要 x86启动顺序 C函数调用 gcc内联汇编(inline assembly) x86-32下的中断处理 小结 二.x86启动顺 ...
- Python生成唯一id的方法
1. uuid import uuid def create_uid(): return str(uuid.uuid1()) if __name__ == '__main__': print(type ...
- 淘淘商城之Ajax跨域请求
一.什么是跨域 (1)域名不同时: (2)域名相同,端口不同时 二.解决方法 可以使用jsonp解决跨域问题 三.什么是jsonp jsonp其实是一个跨域解决方案,js跨域请求数据是不允许的,但是跨 ...
- MySQL指令
在mysql里:文件夹就是数据库 文件就是表 创建用户: 格式:create user '用户名'@'IP地址' identified by '密码'; 说明:IP地址是用来限制用户只能在哪 ...
- JS的call方法的作用解释,简单易懂
先看看关于call()的官方解释,“调用一个对象的一个方法,以另一个对象替换当前对象.”,看了这样的解释,或许让你更摸不着头脑了.看例子: var x = "我是全局变量"; // ...
- log4j日志日记记录使用教程
注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太多了...... Logger必须作为类的静态变量使用.原因如下: 1 使用static修饰的属性是归这个类使用的2 也就是 ...
- Windows域帐户
域的直观优点: 1.域帐户可以在任意一台已经加入域的电脑上登录. 2.将域用户组加入到SQL Server登录里,域用户组内所有人员便都可以使用域用户登录数据库,继承相关权限. 3.域用户登录Team ...
- kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...
- C/C++:函数调用规则__stdcall,__cdecl,__pascal,__fastcall
__cdecl __cdecl 是 C Declaration 的缩写,表示 C 语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用函数不会要求调用者传递多 ...
- 域名调整 SEO优化(nginx)
=============================================== 2019/3/31_第1次修改 ccb_warlock == ...