比赛链接

A.四舍五入

虽然让找 \(i\),但枚举 \(i\) 很没前途啊,所以考虑找到所有 \(j\) 的个数

发现对于一组合法的 \(i、j\) 需要满足 \(i\in [kj,\ kj+0.5j)\ kj<=n\)

那么我们对于每一个 \(j\),找到所有的 \(k\) 使得 \(kj<=n\),查分维护区间 \([kj,\ kj+0.5j)\)

时间复杂度为调和级数级别的

B.填算符

题解单飞咯!

题解链接

下发题解说的神马东西,赛时根本想不到

讲一个赛时想得到的 \(O(n\log 值域)\) 的思路,很好理解

我们处理出二进制下每一位上的 1 的最后一次出现的位置,将第 \(i\ (i\in[0,60])\) 位上的 1 最后一次出现的位置记作 \(pos_i\)

同时我们设 \(H=n-k-1\) 为总共有的 bitor 的操作数

有以下结论:由于 \(pos_i\) 是 \(i\) 位上最后一个 1,所以一旦它后面放了一个 与,这一位上就是 0 了;若我们想要这一位为 1,必须至少满足从 \(pos_i\) 到最后的运算符全是 bitor

发现有以下情况:

  • 若 \(n-pos_i>H\),即 \(pos_i\) 之后需要放的运算符的数量比 bitor 的总操作数多,也就是说在 \(pos_i\) 之后我一定需要放 bitand 操作,所以这种情况下这一位一定不对答案有贡献

  • 若 \(n-pos_i<H\),也就是说我可以从 \(pos_i\) 的前一个位置开始到最后全放 bitor 操作,那么这样第 \(i\) 位上可以是 1,为了使值最大,所以第 \(i\) 位上一定要是 1,所以从第 \(pos_i\) 位到最后必须全是 bitor 操作,对于这种情况的 \(i\) 我们记为合法位

  • 若 \(n-pos_i=H\),也就是说从第 \(pos_i\) 到最后的运算符可以全是 bitor 操作,但 \(pos_i\) 的前一位只能是 bitand

    所以我们特判从第 1 个位置到 \(pos_i\) 的前一位全放 bitand 能不能让到第 \(pos_i\) 个数时得到的值第 $\forall $ \(j 满足 [pos_j=pos_i]\) 位为 1,若能则该位也为合法位,否则不合法

对于所有合法位的 \(pos\) 取最小值设为 \(end\),因为已经保证 \(end\) 到最后的预算符全是 bitor,此时有一下两种可能,而我们想尽量构成第二种可能:

  1. \(end\) 的前一位预算符也为 bitor,这样我们一定能达到答案最大了,想使答案最优直接让从 \(end-2\) 开始的 \(k\) 个运算符为 bitor 就好了

  2. \(end\) 的前一位在某些情况为 bitand 也是可以使答案最大的,所以我们判断能不能让 \(end\) 的前一位为 bitand 同样使答案最大;

    发现可以的条件相当于从第 \(end-1\) 个数到最前面用仅剩的 bitor 操作得到一个答案,使得这个答案第 $\forall $ \(i 满足 [pos_i=end]\) 位为 1,若能满足条件则第 \(end-1\) 个操作符为 bitand

满足条件的判断又和上述的第三个情况判断一致了,相当于以 \(end-1\) 为下界,再做一次求 \(min(合法的\ pos)\),实质上是不断的递归。

形式化如下:

所以一个递归 \(dfs(end, H)\) 表示下界为 \(end\),还剩 \(H\) 个 bitor 操作,判断能不能得到我想要的答案:

若不能则直接从第 \(end-2\) 开始的 \(k-res\) 个运算符全为 bitand 就是答案(\(res\) 为在之前的递归中已经确定的 bitand 的个数)

若能则第 \(end-1\) 个位置可以为 bitand,并设 \(end'=min(这一层中合法的\ pos)\),继续递归 \(dfs(end',H-(end-end'))\) 判断第 \(end'-1\) 个位置能不能为 bitand

code:

#include<bits/stdc++.h>
#define Aqrfre(x, y) freopen(#x ".in", "r", stdin),freopen(#y ".out", "w", stdout)
#define mp make_pair
#define Type ll
#define qr(x) x=read()
typedef __int128 INT;
typedef long long ll;
using namespace std; inline ll read(){
char c=getchar(); ll x=0, f=1;
while(!isdigit(c)) (c=='-'?f=-1:f=1), c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48), c=getchar();
return x*f;
} const int N = 1e6 + 5;
const int maxn = 1e8; int n, k, K; ll a[N], b[N]; int la[62], pre[62][N], zh[62], X;
vector<int>v[N], ans, tem, num; inline bool check(int pos, int op){ // 判断从第一个运算符到第 pos 个全为 & 能不能使得到的值满足条件
int now = pos + 1; ll x = 0;
for(int i : v[now]) x += (1 << i);
if(~X) x += (1 << X);
int y = a[1];
for(int i=2; i<=now; i++)
y = y & a[i];
if(y & x == x) return true;
return false;
} inline void dfs(int pos, int H){ // 递归函数
if(pos <= 0 and H <= 0) return;
int now = pos + 1, end = 2e9;
bool f = true; X = -1;
for(int x : tem) v[pre[x][now]].clear(); //为方便更新新的一层的 V ,先清空
for(int x : tem){
if(pos - pre[x][now] > H or !pre[x][now]){
f = false; break;
}
else if(pos - pre[x][now] < H) // 合法则更新 end 并加入 V
end = min(end, pre[x][now] - 1), v[pre[x][now]].emplace_back(x);
else{
X = x;
if(pre[x][now] == 1 or check(pre[x][now] - 1, 1))
end = min(end, pre[x][now] - 1), v[pre[x][now]].emplace_back(x);
else f = false;
}
}
if(f) ans.emplace_back(pos), k--; // pos 位可以为 &,加到答案中
if(!k) return;
if(f and end >= k){
tem.clear(); for(int x : v[end+1]) tem.emplace_back(x);
dfs(end, H-(pos-end-1)); //继续递归判断 end 位可否为 &
}
else{
int cnt = k; // pos 位不可以为 &,则最优方案为从 pos-1 到 pos-cnt 全为 &
for(int i=pos-cnt; i<pos; i++)
k--, cout<<i<<" ";
return;
}
} signed main(){ // bitop
Aqrfre(bitop, bitop); qr(n); qr(k); K = k;
for(int i=1; i<=n; i++){
qr(a[i]);
for(int j=0; j<62; j++){
if(a[i] & (1ll << j)) pre[j][i] = la[j], la[j] = i;
else pre[j][i] = pre[j-ans.size()][i-1]; // 二进制下第 j 位为 1 在第 i 个数之前一次出现的位置
}
} if(k == n - 1){
for(int i=1; i<=k; i++) cout<<i<<" ";
return 0;
} for(int j=0; j<62; j++) // V 存当前这一层递归的下界包含的 最后一个 1 出现在这个下界的 二进制位
if(la[j]) zh[j] = la[j], v[zh[j]].emplace_back(j); int H = n - 1 - k, endi = 1e9; bool go = false;
for(int i=0; i<62; i++){ // 把第一次递归剖出来单独做
if(!zh[i]) continue;
if(n - zh[i] > H) continue;
if(n - zh[i] < H){
endi = min(endi, zh[i] - 1);
continue;
}
if(go) continue;
if(n - zh[i] == H){
if(check(zh[i] - 1, 0)){ //特殊的:合法直接输出
for(int i=1; i<=k; i++)
cout<<i<<" ";
return 0;
}
go = true;
}
} for(int x : v[endi+1]) tem.emplace_back(x); //tem 暂存下界这个数的 V H -= (n - endi - 1); dfs(endi, H);
sort(ans.begin(), ans.end()); for(int x : ans) cout<<x<<" "; return 0;
}

「模拟赛」多校 A 层联训 16的更多相关文章

  1. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  2. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  3. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  4. python爬虫22 | 以后我再讲python「模拟登录」我就是狗

    接下来就是 学习python的正确姿势 做爬虫 绕不开模拟登录 为此小帅b给大家支了几招 python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定! 有些网站的登录很弱鸡 传个用户名和密 ...

  5. 「NOIP模拟赛」数位和乘积(dp,高精)

    统计方案数,要么组合数,要么递推(dp)了. 这是有模拟赛历史以来爆炸最狠的一次 T1写了正解,也想到开long long,但是开错了地方然后数组开大了结果100->0 T3看错题本来简单模拟又 ...

  6. 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵

    佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...

  7. 「CSP-S模拟赛」2019第二场

    目录 T1 Jam的计数法 题目 考场思路(正解) T2 「TJOI / HEOI2016」排序 题目 考场思路(假正解) 正解 T3 「THUWC 2017」随机二分图 题目 考场思路 正解 这场考 ...

  8. 「CSP-S模拟赛」2019第一场

    目录 T1 小奇取石子 题目 考场思路 正解 T2 「CCO 2017」专业网络 题目 考场思路 题解 T3 「ZJOI2017」线段树 题目 考场思路 正解 这场考试感觉很奇怪. \(T1.T2\) ...

  9. Taro 周报 #7: 收获「e代驾」案例,发布 v2.2.16 和 v3.2.0-canary.2

    Taro 周报 2020 年 12 月 05 日 - 2020 年 12 月 12 日 ,更多的Taro周报点击 Taro 大事件 58 技术发布文章<开源 | Taro 3 支持 React ...

  10. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

随机推荐

  1. Github Dorisoy网盘项目

    相关github地址 https://github.com/dorisoy/Dorisoy.Pan?tab=readme-ov-file mysql8 sudo rpm -ivh mysql80-co ...

  2. TwinCAT3 - 实现CiA402

    目录 1,起缘 2,想办法 3,开搞 3.1,CANOpen通信 3.1.1 对象字典 3.1.2 通信建立 3.2,CiA402伺服状态机 3.3,伺服运行 3.3.1 操作模式 3.3.2 轮廓位 ...

  3. 操作 JAR 文件

    列出 JAR 文件内容 使用 jar 命令来列出 JAR 文件的内容: jar tf myapp.jar -t 选项表示列出文件,-f 表示指定 JAR 文件. 解压 JAR 文件 使用 jar 命令 ...

  4. 编译器实现之旅——第十六章 代码装载、链接器、全局变量与main函数

    在上一章的旅程中,我们已经实现了函数调用的代码生成器分派函数,但在上一章的末尾,我们留下了三个问题: 我们需要为全局变量压栈 main函数需要在程序启动时被自动调用 我们需要实现一个链接器,以将所有的 ...

  5. Docker网络下-自定义网络实战

    通过前面两篇的学习,我们对docker网络及四大网络类型都了解了.本文,咱们就来学习docker的自定义网络.我们为什么需要自定义网络呢?是为了让各个主机分门别类,井井有条.方便关联,使得网络之间可以 ...

  6. MRI roi图像合并

    笔记来源:MRI roi的图像合并 dpabi小工具_哔哩哔哩_bilibili 1. 如果几个图像的维度不一致,需要先进行reslice 1)如何看图像的维度 以软件MRIcron为例, windo ...

  7. 【YashanDB知识库】ycm纳管主机安装YCM-AGENT时报错“任务提交失败,无法连接主机”

    问题现象 执行安装ycm-agent命令纳管主机时报错 问题的风险及影响 会导致ycm-agent纳管不成功,YCM无法监控主机和数据库 问题影响的版本 yashandb-cloud-manager- ...

  8. ASP.NET Core – Dependency Injection

    前言 很久很久以前就写过了 Asp.net core 学习笔记 ( DI 依赖注入 ), 这篇只是整理一下而已. 参考 Using dependency injection in a .Net Cor ...

  9. Yarn 3.0 Plug'n'Play (PnP) 安装和迁移

    前言 以前用 npm, 后来 yarn 火了就用 yarn. 后来 yarn 2.0 大改版, Angular 不支持就一直没用. 一直到去年的 Angular 13 才开始支持. 最近又开始写 An ...

  10. Identity – Introduction & Scaffold

    主要参考: Introduction to Identity on ASP.NET Core Start by command dotnet new webapp --auth Individual ...