IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces 1635 F. Closest Pair —— 树状数组,思维,有一丶丶东西 -> 正文阅读

[数据结构与算法]Codeforces 1635 F. Closest Pair —— 树状数组,思维,有一丶丶东西

This way

题意:

给你长度为n的数组x(x[i]<x[i+1])和w,对于一对i,j,定义他们的val为 ∣ x i ? x j ∣ ? ( w i + w j ) |x_i-x_j|*(w_i+w_j) xi??xj??(wi?+wj?)
每次给你l,r,问你[l,r]中val最小为多少

题解:

第一次挑战28的题目,说实话还是不够难,感觉只有25左右难度。
一开始我想到的是笛卡尔树,但是不太对劲,因为它并不是区间这种东西。
接下来我想到的是斜率优化,然后我就开始写式子…然后就写不下去了。
由于点i一定会找w比它小的点,然后对于每一个开头的右边必然是一个随着x增大,w梯度下降,或者对于左边,随着x减小,w梯度下降,就像下面一样:
在这里插入图片描述
然后维护一下每个点,它相较于上一个点的最优位置区间在哪。但是搞了半天也不行。

真没想到是这么简单一个想法,其实也就是我上面这个想法没有再深入分析一下。
首先要得到一个结论:对于点i,这个点只需要找到左边离它最近的w比它小的点,或者右边离它最近的w比它小的点。比如上图红线就只需要找到紫线或者绿线即可。
但是可能会有这个问题:那说不定对于红线来说,蓝线比紫线更优呢?
要注意w逐渐减小的话,你找红蓝这对线,不如找蓝紫这对线。

那么接下来就很简单了:
我们只需要从前往后维护递增的单调栈找每个点左边的第一个小的值,然后再从右到左做一遍。
那么我们现在找到了不多余n*2对点,那么对于每个询问,答案必然在n*2对点中。如何找到?
那我们只需要从小到大枚举这些点对的右端点R,然后将左端点L的答案加入树状数组中。对于所有询问在R的位置,只需要在树状数组中找到>=L的最小值即可啊。

愚蠢了愚蠢了,应该再动点脑子的,不要被28这个标签吓到。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=6e18;
const int N=3e5+5;
int st[N],top,x[N],w[N];
vector<int>vec[N];
#define pii pair<int,int>
vector<pii>q[N];
ll mi[N];
ll ans[N];
int lowbit(int x){return x&(-x);}
void add(int x,ll v){
    for(int i=x;i;i-=lowbit(i))
        mi[i]=min(mi[i],v);
}
ll query(int x){
    ll ans=inf;
    for(int i=x;i<N;i+=lowbit(i))
        ans=min(ans,mi[i]);
    return ans;
}
int main()
{
    for(int i=0;i<N;i++)mi[i]=inf;
    int n,m,l,r;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&w[i]);
    for(int i=1;i<=m;i++)scanf("%d%d",&l,&r),q[r].push_back({l,i});
    for(int i=1;i<=n;i++){
        while(top&&w[st[top]]>w[i])top--;
        if(top)vec[i].push_back(st[top]);
        st[++top]=i;
    }
    top=0;
    for(int i=n;i;i--){
        while(top&&w[st[top]]>w[i])top--;
        if(top)vec[st[top]].push_back(i);
        st[++top]=i;
    }
    for(int i=1;i<=n;i++){
        for(auto j :vec[i]){
            ll v=1ll*(x[i]-x[j])*(w[i]+w[j]);
            add(j,v);
        }
        for(auto j:q[i])
            ans[j.second]=query(j.first);
    }
    for(int i=1;i<=m;i++)
        printf("%lld\n",ans[i]);
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:29:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:25:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码