Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\)
给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{and},\operatorname{or},\operatorname{xor}\}\),对于 \(i\in[2,n]\),求出 \(\max_{j\in[1,i)}\{a_i\operatorname{op} a_j\}\) 以及 \(|\arg\max_{j\in[1,i)}\{a_i\operatorname{op} a_j\}|\)。
\(n\le10^5\),\(a_i<2^{16}\)。
\(\mathcal{Solution}\)
也许算是 Meet in Middle?从左到右在线更新可用的 \(a_j\) 信息并求出对于当前 \(i\) 的答案,维护一个 \(f(u,v)\),表示选取的 \(a_j\) 的高八位是 \(u\) 且 \(a_i\) 的低八位是 \(v\) 时,低八位能得到的最大值以及方案数。那么更新时,用当前 \(a_j\) 的低八位更新所有 \(f(u,i)\);查询时枚举高八位选择的值 \(i\),并用 \(f(i,v)\) 更新答案。最终复杂度为 \(\mathcal O(n\sqrt A)\)。
确实是比较巧妙的复杂度平衡,也是一个实用的 trick√
\(\mathcal{Code}\)
/*~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;
}
Solution -「LOCAL」二进制的世界的更多相关文章
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「LOCAL」过河
\(\mathcal{Description}\) 一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...
- Solution -「LOCAL」Drainage System
\(\mathcal{Description}\) 合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...
- Solution -「LOCAL」Burning Flowers
灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\) 给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...
- Solution -「LOCAL」画画图
\(\mathcal{Description}\) OurTeam. 给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...
- Solution -「LOCAL」ZB 平衡树
\(\mathcal{Description}\) OurOJ. 维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...
- Solution -「LOCAL」舟游
\(\mathcal{Description}\) \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...
- Solution -「LOCAL」充电
\(\mathcal{Description}\) 给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...
- Solution -「LOCAL」「cov. 牛客多校 2020 第五场 C」Easy
\(\mathcal{Description}\) Link.(完全一致) 给定 \(n,m,k\),对于两个长度为 \(k\) 的满足 \(\left(\sum_{i=0}^ka_i=n\r ...
随机推荐
- PowerShell 教程
随笔分类 - 教程 转载自:https://www.cnblogs.com/XiaoCY/category/1065141.html PowerShell 管道符之Where-Object的使用方法 ...
- 安装Cacti-plugin
安装pluginunzip cacti-plugin-0.8.7e-PA-v2.6.zip -d cacti-plugin-archcp -R cacti-plugin-arch/* /data/ww ...
- Linux上天之路(五)之Linux基本命令
1. Linux命令格式 命令 命令选项 学会看语法: {必选项}[可选项] 举例 ls -a /tmp 等价 ls –all /tmp ls 命令 -a 命令选项 简写使用- 全写-- /tmp 参 ...
- jsp标签问题
在jsp页面使用标签过程中有时候不注意规则的话,eclipse会提示一些错误,下面针对这些错误提出相应的解决办法:<form></form>标签1. Invalid locat ...
- android ndk下没有pthread_yield,好在std::this_thread::yield()可以达到同样的效果
一个多线程的算法中,发现线程利用率只有47%左右,大量的处理时间因为usleep(500)而导致线程睡眠: 性能始终上不去. 把usleep(500)修改为std::this_thread::yiel ...
- 『德不孤』Pytest框架 — 3、Pytest的基础说明
目录 1.Pytest参数介绍 2.Pytest框架用例命名规则 3.Pytest Exit Code说明 4.pytest.ini全局配置文件 5.Pytest执行测试用例的顺序 1.Pytest参 ...
- java接口概述及特点
1 package face_09; 2 3 4 5 6 abstract class AbsDemo{ 7 abstract void show1(); 8 abstract void show2( ...
- IoC容器(底层原理)
IoC(概念和原理) 1,什么是IoC (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 (2)使用IoC目的:为了降低耦合度 (3)做入门案例就是IoC实现 2,IoC底层原 ...
- python 求模运算符--判断奇偶数
#!/usr/bin/python #coding=utf-8 #好好学习,天天向上 number = input("please enter a number:") number ...
- 学习JAVAWEB第五天
# 今日内容 1. JavaScript基础 ## JavaScript: * 概念: 一门客户端脚本语言 * 运行在客户端浏览器中的.每一个浏览器都有JavaScript的解析引擎 * 脚本语言:不 ...