Solution -「LOCAL」二进制的世界
给定序列 和一个二元运算 ,对于 ,求出 以及 。
,。
也许算是 Meet in Middle?从左到右在线更新可用的 信息并求出对于当前 的答案,维护一个 ,表示选取的 的高八位是 且 的低八位是 时,低八位能得到的最大值以及方案数。那么更新时,用当前 的低八位更新所有 ;查询时枚举高八位选择的值 ,并用 更新答案。最终复杂度为 。
确实是比较巧妙的复杂度平衡,也是一个实用的 trick√
/*~Rainybunny~*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef std::pair<int, int> PII;
#define fi first
#define se second
const int MAXN = 1e5, MAXSV = 1 << 8;
int n, a[MAXN + 5];
char op[5];
PII f[MAXSV][MAXSV];
inline void update( const int x, const auto& opt ) {
int h = x >> 8, l = x ^ h << 8;
rep ( i, 0, MAXSV - 1 ) {
int v = opt( i, l );
if ( f[h][i].fi < v ) f[h][i] = { v, 1 };
else if ( f[h][i].fi == v ) ++f[h][i].se;
}
}
inline PII query( const int x, const auto& opt ) {
int l = x & ( ( 1 << 8 ) - 1 );
PII ret( 0, 0 );
rep ( h, 0, MAXSV - 1 ) if ( f[h][l].se ) {
int cur = opt( h, x >> 8 ) << 8 | f[h][l].fi;
if ( ret.fi < cur ) ret = { cur, f[h][l].se };
else if ( ret.fi == cur ) ret.se += f[h][l].se;
}
return ret;
}
inline void solve( const auto& opt ) {
update( a[1], opt );
rep ( i, 2, n ) {
PII ans( query( a[i], opt ) );
printf( "%d %d\n", ans.fi, ans.se ), update( a[i], opt );
}
}
int main() {
scanf( "%d %s", &n, op );
rep ( i, 1, n ) scanf( "%d", &a[i] );
if ( op[0] == 'x' ) {
solve( []( const int u, const int v ) { return u ^ v; } );
} else if ( op[0] == 'a' ) {
solve( []( const int u, const int v ) { return u & v; } );
} else {
solve( []( const int u, const int v ) { return u | v; } );
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现