尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CF1482E Skyline Photo

CF1482E Skyline Photo
📅 发布时间:2026/6/18 17:29:03

绝世唐题,为啥没有人写题解啊。

首先发现划分成若干个段,设一个 DP \(f_i\) 表示以 \(i\) 结尾的分段方式的最大贡献,那么朴素转移就是你去枚举区间取 \(\max\)。

发现是求 \(h\) 的最小值所对应的 \(b\),比较典的做法是扔进单调栈里,用一棵线段树维护,每次弹栈就将原本 \(b\) 的贡献删掉,入栈就加上目前 \(b\) 的贡献,由于单调栈的性质保证了每个 \(b\) 都是目前区间中最小的 \(h\) 所对应的。

线段树维护一个单点更改,区间加,区间求 \(\max\) 即可,时间复杂度 \(O(n \log n)\)。

code:

#include <bits/stdc++.h>using namespace std;#define int long long
#define fir first
#define sec second
#define mkp make_pair 
#define pb push_back
#define lep( i, l, r ) for ( int i = ( l ); i <= ( r ); ++ i )
#define rep( i, r, l ) for ( int i = ( r ); i >= ( l ); -- i )typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair < int, int > pii;namespace IO{const int SIZE=1<<21;static char ibuf[SIZE],obuf[SIZE],*iS,*iT,*oS=obuf,*oT=oS+SIZE-1;int qr;char qu[55],c;bool f;#define getchar() (IO::iS==IO::iT?(IO::iT=(IO::iS=IO::ibuf)+fread(IO::ibuf,1,IO::SIZE,stdin),(IO::iS==IO::iT?EOF:*IO::iS++)):*IO::iS++)#define putchar(x) *IO::oS++=x,IO::oS==IO::oT?flush():0#define flush() fwrite(IO::obuf,1,IO::oS-IO::obuf,stdout),IO::oS=IO::obuf#define puts(x) IO::Puts(x)template<typename T>inline void read(T&x){for(f=1,c=getchar();c<48||c>57;c=getchar())f^=c=='-';for(x=0;c<=57&&c>=48;c=getchar()) x=(x<<1)+(x<<3)+(c&15); x=f?x:-x;}template<typename T>inline void write(T x){if(!x) putchar(48); if(x<0) putchar('-'),x=-x;while(x) qu[++qr]=x%10^48,x/=10;while(qr) putchar(qu[qr--]);}inline void Puts(const char*s){for(int i=0;s[i];i++)putchar(s[i]);putchar('\n');}struct Flusher_{~Flusher_(){flush();}}io_flusher_;
}
using IO::read;
using IO::write;template < class type > inline void chkmin ( type &x, type y ) { x = ( x <= y ? x : y ); }
template < class type > inline void chkmax ( type &x, type y ) { x = ( x >= y ? x : y ); }const int N = 3e5 + 5;int n;
int h[N], b[N], f[N];int tree[N << 2], tag[N << 2];void pushup ( int node ) {tree[node] = max ( tree[node << 1], tree[node << 1 | 1] );
}void addtag ( int node, int k ) {tree[node] += k;tag[node] += k;
}void pushdown ( int node ) {if ( tag[node] != 0x3f3f3f3f3f3f3f3f ) {addtag ( node << 1, tag[node] ), addtag ( node << 1 | 1, tag[node] );tag[node] = 0x3f3f3f3f3f3f3f3f;}
}void assgin ( int node, int lt, int rt, int x, int k ) {if ( lt == rt ) {tree[node] = k;return ;}pushdown ( node );int mid = lt + rt >> 1;if ( x <= mid ) {assgin ( node << 1, lt, mid, x, k );}else {assgin ( node << 1 | 1, mid + 1, rt, x, k );}pushup ( node );
}void update ( int node, int lt, int rt, int x, int y, int k ) {if ( x <= lt && rt <= y ){addtag ( node, k );return ;}pushdown ( node );int mid = lt + rt >> 1;if ( x <= mid ) {update ( node << 1, lt, mid, x, y, k );}if ( mid + 1 <= y ) {update ( node << 1 | 1, mid + 1, rt, x, y, k );}pushup ( node );
}int query ( int node, int lt, int rt, int x, int y ) {if ( x <= lt && rt <= y ) {return tree[node];}pushdown ( node );int mid = lt + rt >> 1, res = -1e18;if ( x <= mid ) {res = max ( res, query ( node << 1, lt, mid, x, y ) );}if ( mid + 1 <= y ) {res = max ( res, query ( node << 1 | 1, mid + 1, rt, x, y ) );}return res;
}stack < int > stk;void Solve () {ios :: sync_with_stdio ( false );cin.tie ( 0 ), cout.tie ( 0 );memset ( tag, 0x3f, sizeof ( tag ) );memset ( tree, 0xcf, sizeof ( tree ) );cin >> n;for ( int i = 1; i <= n; i ++ ) {cin >> h[i];}for ( int i = 1; i <= n; i ++ ) {cin >> b[i];}memset ( f, 0x3f, sizeof ( f ) );f[0] = 0;assgin ( 1, 1, n, 1, 0 );for ( int i = 1; i <= n; i ++ ) {int lst = i - 1;while ( !stk.empty () && ( h[i] < h[stk.top ()] || h[i] == h[stk.top ()] && b[i] > b[stk.top ()] ) ) {int r = stk.top ();stk.pop ();int l = ( !stk.empty () ? stk.top () + 1 : 1 );update ( 1, 1, n, l, r, -b[r] );}int l = ( !stk.empty () ? stk.top () + 1 : 1 );update ( 1, 1, n, l, i, b[i] );stk.push ( i );f[i] = query ( 1, 1, n, 1, i );assgin ( 1, 1, n, i + 1, f[i] );}cout << f[n];
}signed main () {
#ifdef judgefreopen ( "Code.in", "r", stdin );freopen ( "Code.out", "w", stdout );freopen ( "Code.err", "w", stderr );
#endifSolve ();return 0;
}

相关新闻

  • MySql8.0公共表表达式『CTE』
  • 2025 年进口地磅,出口地磅,100 吨地磅,120 吨地磅厂家最新推荐,产能、专利、环保三维数据透视!
  • GISDataMgr(数据管理工具)

最新新闻

  • PC无法读取SD卡并提示格式化的修复方法
  • 39钝刀工艺:让篆刻白文重现金石苍劲之美 - 资讯焦点
  • 2026年投票制作平台怎么选 五家服务商横向对比供参考 - 深度智识库
  • 2026 年南通工字钢批发厂家实测测评,工程采购避坑指南 - LYL仔仔
  • Retrospected AI教练功能详解:ChatGPT如何优化你的敏捷回顾流程
  • 汕尾足不出户卖黄金,正规回收流程详解 - 余生黄金回收

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号