当前位置: 首页 > news >正文

CF1482E Skyline Photo

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

首先发现划分成若干个段,设一个 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;
}
http://www.jsqmd.com/news/24757/

相关文章:

  • sqlserver 添加或修改字段
  • 最小瓶颈生成树
  • 小程序语音通话让智能设备会“说话”
  • 易基因: NG (IF29):颠覆认知!深圳仙湖植物园刘阳团队WGBS及超级泛基因组分析揭示苔藓植物基因家族比维管植物更丰富|项目文章
  • 2025年口碑好的工业制冷供应厂家推荐
  • 2025 年 150 吨地磅,180 吨地磅,200 吨地磅厂家最新推荐,产能、专利、环保三维数据透视!
  • MySql8.0公共表表达式『CTE』
  • 2025 年进口地磅,出口地磅,100 吨地磅,120 吨地磅厂家最新推荐,产能、专利、环保三维数据透视!
  • 精通CTS与低功耗时钟设计
  • GISDataMgr(数据管理工具)
  • 202510月年口碑好的板式家具品牌前十榜单推荐
  • 2025年板式家具品牌行业趋势与top5排名解析
  • 2025年10月口碑好的板式家具厂家前十名推荐
  • 学习笔记510—怎么去除”想要访问你的钥匙串中的密钥“Adobe Licensing ”若要给予许可
  • 蓝狐家庭维修小程序系统:一站式家庭维修服务解决方案
  • 打造智慧体育场馆的“视觉中枢”:国标GB28181算法算力平台EasyGBS助力体育中心实现全域感知与智能升级
  • 完整教程:【强化学习】#8 DQN(深度Q学习)
  • 达梦删除数据文件后恢复
  • 贪心训练
  • 漫格搭子交友系统:一站式同城社交解决方案
  • 多功能名片小程序系统:助力企业与个人高效拓展人脉
  • ETL调度最佳实践:避免高峰期任务冲突与资源争抢 - 指南
  • 多线程基础-创建线程
  • dataframe 和 numpy 数组有什么不同?
  • 《植物大战僵尸:重植版》无障碍补丁 | An accessibility mod for Plants vs. Zombies™: Replanted
  • rac日常维护
  • 2025年上海直连全球云网络公司权威推荐榜单:AIGPU专用算力/GPU计费模式/GPU弹性算力源头厂家精选
  • 打开双wifi STA+AP并发 - M
  • drools脚本中 matches 的用法
  • 2025年重庆别墅装修公司权威推荐榜单:大宅设计/大平层设计/别墅设计源头厂家精选