首页 > 其他分享 >CF601B Lipshitz Sequence 题解

CF601B Lipshitz Sequence 题解

时间:2023-11-19 14:33:04浏览次数:29  
标签:Lipshitz lastval last int 题解 top UP CF601B il

给你一个序列 \(v_{1 \dots n}\),定义 \(f(v)\) 为 \(v\) 中斜率最大值(\(\lvert v \rvert = 1\) 则 \(f(v)=0\)),有 \(q\) 组询问,每次给定 \(1 \le l \lt r \le n\),求 \(a_{l \dots r}\) 的每个子区间的 \(f\) 之和。

一个关键的性质是,最大的斜率只在相邻数间取到。

有了这个性质,这题就可以秒了。证明留作练习(

#include <iostream>
#include <vector>
#include <stack>
#define UP(i,s,e) for(auto i=s; i<e; ++i)
using std::cin; using std::cout;
namespace m{ // }{{{
constexpr int N = 1e5;
using ll = long long;
int in, iq;
int ia[N];
void solve(){
    int il, ir; cin >> il >> ir; il--;
    std::stack<std::pair<int, int>> last; // k, place
    last.push({998244353, il-1});
    ll lastval = 0, ans = 0;
    UP(i, il, ir-1){
        int k = (std::abs(ia[i+1]-ia[i]));
        while(last.top().first < k){
            int k1 = last.top().first;
            int e1 = last.top().second;
            last.pop();
            lastval -= k1 * 1ll * (e1-last.top().second);
        }
        lastval += (i-last.top().second) * 1ll * k;
        last.push({k, i});
        ans += lastval;
    }
    cout << ans << '\n';
}
void work(){
    cin >> in >> iq;
    UP(i, 0, in){
        cin >> ia[i];
    }
    UP(i, 0, iq) solve();
}
} // {}}}
int main(){m::work(); return 0;}

标签:Lipshitz,lastval,last,int,题解,top,UP,CF601B,il
From: https://www.cnblogs.com/x383494/p/17842017.html

相关文章

  • NEFU OJ Problem 1489 青蛙赶路 题解【动态规划DP】
    Problem:GTimeLimit:2000msMemoryLimit:65535KDescription有一只青蛙,每秒选择走1米或跳m米,青蛙体力不足,所以不能连续两秒都在跳。青蛙将移动到[l,r]之间,它想知道有多少种不同的方式来实现其目标。两种方式是不同的,当且仅当它们移动不同的米或花费不同的秒,或者是在一秒......
  • NEFU OJ Problem1485 贪吃蛇大作战 题解
    Problem:FTimeLimit:1000msMemoryLimit:65535K题目Description贪吃蛇大家一定都玩过吧,现在宋哥也要玩这个游戏,最初的时候贪吃蛇从屏幕的左下角出发,但是有一个非常不幸的事情,就是宋哥的游戏机的左键和下键坏掉了,这意味着什么?没错!他只能操控他的蛇向右或向上走了,假设屏幕......
  • ICPC2023深圳部分题解(A,D,E,F,G,K,L)
    目录正题A一道好题题目大意解题思路D机器人兄弟题目大意解题思路E二合一题目大意解题思路F见面礼题目大意解题思路G相似基因序列问题题目大意解题思路K四国军棋题目大意解题思路LMary有颗有根树题目大意解题思路正题好像还没上gym所以放不了题目链接,深圳这场的题目我觉......
  • ctf.show 信息泄露部分题解
    源码泄露根据题目可以知道这个是源码泄露,所以是看源代码,查看源代码的三种方式:CTRL+U,F12,右键选择查看源代码,flag就在源代码内前台JS绕过启动靶场后给出的提示是无法查看源代码,右键和F12都无法使用,题目是前台JS绕过,所以我们进入浏览器的设置界面,搜索javascript找到后把他禁用,然后再返......
  • 洛谷 P9869 [NOIP 2023] 三值逻辑 题解
    https://www.luogu.com.cn/problem/P9869?contestId=145259看到要给变量赋初始值,还是T,F,U之类的,容易想到2-SAT。设\(1\simn+m\)的点表示\(x_1,x_2,\dots,x_{n+m}\)为T的点,其中\(x_{k+n}(1\leqk\leqm)\)表示在第\(k\)次操作被操作的变量的值(操作......
  • qemu-kvm: error: failed to set MSR x38d to x0x 【问题解决】
    问题解决创建报错在下面的issues找到解决办法https://github.com/GNS3/gns3-server/issues/1774可以尝试在VM上禁用MSR,然后检查是否可以启动qemu计算机添加内核模块参数临时修改echoY>/sys/module/kvm/parameters/ignore_msrs或者永久修改cat>/etc/modp......
  • AT_code_festival_2018_quala_b题解
    题意给定一个序列,里面的值只有可能是\(a\)或\(b\)(\(a<b\))。有\(m\)个区间,这里面的值必须是\(a\),求如何是序列总和最大。思路因为\(n\)和\(m\)都只有100,所以可以先暴力将所有值设为\(b\),再将区间里的值暴力修改为\(a\),最后统计答案。ACCODE#include<bits/stdc......
  • P9779 题解
    思路因为不一定是只有一个答案,也就是多选题。所以就转化成了在\(n\)个里面选若干个。而每种个数必须都试一次。所以答案为:\[\sum_{i=1}^{i\len}C_n^i\]\(C_n^m\)表示在\(n\)个里面选\(m\)个方案数,即组合问题。众所周知,\[2^n=\sum_{i=0}^{i\len}C_n^i\]而\(......
  • P9782 题解
    题意给定两个字符,分别是两个\(26\)进制数,\(A\)到\(Z\)分别表示\(0\)到\(25\)。求这两个字符的和。答案同样用这种\(26\)进制表示。不包含前导\(0\)。思路先转化成\(10\)进制,再转化成\(26\)进制即可。而因为只有一位所以就不用写循环,直接算出\(10\)进制下的和......
  • SP3889 Closest Number题解
    题意简述有两个\(n\)位十进制数\(a\),\(b\)。要将数字\(b\)的每一位重新排列后,使得得到的数字一个在大于等于\(a\)的情况下更接近\(a\),另一个在小于\(a\)的情况下更接近\(a\)。求这两个数,如果找不到就输出0。思路以大于等于\(a\)的为例。我们可以将\(b\)从小......