「杂题乱刷2」CF601B
1.「杂题乱刷」AT_abc020_c2.「杂题乱刷」CF1846E1 & CF1846E23.「杂题乱刷」CF786C4.「杂题乱刷」Zheng Rui 327 【2018普转提day17专题】洗5.「杂题乱刷」CF1759F6.「杂题乱刷」CF1979C7.「杂题乱刷」CF1985F8.「杂题乱刷」P13969.「杂题乱刷」AT_abc360_d10.「杂题乱刷2」CF1454F Array Partition11.「杂题乱刷2」CF1996F12.「杂题乱刷2」CF1486C1 & CF1486C213.「杂题乱刷2」CF1360H14.「杂题乱刷2」CF862D15.「杂题乱刷2」CF1301C16.「杂题乱刷2」CF2036G17.「杂题乱刷2」P1126718.「杂题乱刷2」CF1370F219.「杂题乱刷2」AT_abc140_e
20.「杂题乱刷2」CF601B
21.「杂题乱刷2」CF2069D22.「杂题乱刷2」P11830 [省选联考 2025] 幸运数字23.「杂题乱刷2」P11843 [USACO25FEB] The Best Subsequence G怎么没人写好写的 ST 表呢。
题目链接
CF601B Lipshitz Sequence (luogu)
CF601B Lipshitz Sequence (codeforces)
解题思路
其实一眼可以发现选相邻的是最优的。
证明:
若这个区间中的数字为
-
,此时式子为 ,化简得 ,说明此时选相邻两个数与选 两个数相比不劣。 -
,此时式子为 ,化简得 ,由于 ,因此 ,不符合原命题,说明此时选相邻两个数与选 两个数相比不劣。 -
,此时式子为 ,化简得 ,由于 ,因此 ,不符合原命题,说明此时选相邻两个数与选 两个数相比不劣。 -
,此时式子为 ,化简得 ,由于 ,因此 ,不符合原命题,说明此时选相邻两个数与选 两个数相比不劣。 -
,此时式子为 ,化简得 ,由于 ,因此 ,不符合原命题,说明此时选相邻两个数与选 两个数相比不劣。 -
,此时式子为 ,化简得 ,说明此时选相邻两个数与选 两个数相比不劣。
因此选相邻两个数字一定不劣,此时设
这是一个经典的问题,直接 ST 表加二分即可,注意此时需要预处理每个
直接单调栈也能做,我写的是 ST 表。
参考代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll int
#define forl(i,a,b) for(re ll (i)=(a);i<=(b);(i)++)
#define forr(i,a,b) for(re ll (i)=(a);i>=(b);(i)--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define QwQ return 0;
ll pw(ll x){return 1ll<<x;}
ll _t_;
ll lg[1000110];
void Init(){
forl(i,2,1e6+5)
lg[i]=lg[i>>1]+1;
}
ll n,q;
ll a[100010];
ll b[100010];
ll l,r;
ll maxn[100010][20];
ll nL[100010],nR[100010];
ll query(ll l,ll r)
{
if(l>r)
return (ll)2e9;
ll LG=lg[r-l+1];
return max(maxn[l][LG],maxn[r-pw(LG)+1][LG]);
}
long long ans;
void _clear(){}
void solve()
{
_clear();
cin>>n>>q;
forl(i,1,n)
cin>>a[i];
forl(i,1,n-1)
b[i]=abs(a[i+1]-a[i]),
maxn[i][0]=b[i];
n--;
forl(j,1,19)
forl(i,1,n-pw(j)+1)
maxn[i][j]=max(maxn[i][j-1],maxn[i+pw(j-1)][j-1]);
l=1,r=n;
ans=0;
forl(i,l,r)
{
ll L=l,R=i;
while(L<R)
{
ll Mid=(L+R)/2;
if(query(Mid,i-1)<b[i])
R=Mid;
else
L=Mid+1;
}
ll nl=L;
L=i,R=r;
while(L<R)
{
ll Mid=(L+R+1)/2;
if(query(i+1,Mid)<=b[i])
L=Mid;
else
R=Mid-1;
}
ll nr=L;
if(query(nl,i)==b[i] && query(i,nr)==b[i])
nL[i]=nl,
nR[i]=nr;
else
nL[i]=nR[i]=i;
}
while(q--)
{
cin>>l>>r;
r--;
forl(i,l,r)
{
ll nl=max(nL[i],l),nr=min(nR[i],r);
ans+=1ll*b[i]*(i-nl+1)*(nr-i+1);
}
cout<<ans<<endl;
ans=0;
}
}
int main()
{
Init();
IOS;
_t_=1;
while(_t_--)
solve();
QwQ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2024-01-28 「比赛总结」CF Round 921 Div.2 比赛总结