每日练习 25.2.7

news/2025/2/7 19:09:49/文章来源:https://www.cnblogs.com/AokiHina/p/18703124

Guess the K-th Zero (Hard version)

题目

这是一个交互问题。

这是问题的困难版本。与简单版不同的是,在困难版中,查询次数为 \(1 \le t \le \min(n, 10^4)\),查询总数限制为 \(6 \cdot 10^4\)

波利卡普正在玩一个电脑游戏。在这个游戏中,一个由 \(0\)\(1\) 组成的数组被隐藏起来。如果波利卡普猜中了左边第 \(k\)\(0\) 的位置 \(t\) 次,那么他就赢了。

波利卡普可以提出不超过 \(6 \cdot 10^4\) 个以下类型的请求:

  • ? \(l\) \(r\) - 求出 \(l\)\(r\) ( \(1 \le l \le r \le n\) ) 位置上所有元素的和。

为了增加游戏的趣味性,每次猜中的 \(0\) 都会变成 \(1\),然后游戏在变化后的数组中继续进行。更正式地说,如果 \(k\) 第三个零的位置是 \(x\),那么在波利卡普猜中这个位置之后,数组中 \(x\) 第三个元素将从 \(0\) 被替换到 \(1\)

分析

简单版本中是一个二分,多次询问的版本有一个显然的 \(O(t \log_2 n)\),二分每次 \(\log\) 的询问是卡满的。

所以想法自然转移到优化二分上面,比较 native 的想法是分块,快速定位块然后块内二分。

然后回顾一下每次询问点“下放”的过程,用分块的标记定位询问还是低效了,进一步的,这就是线段树动态开点的过程。

通过模拟动态开点的单点构建过程,可以很顺手的修改和利用线段树二分进行询问。

#include<bits/stdc++.h>
//#define int long long
int read() {int x=0; bool f=false; char ch=(char)getchar();while(! isdigit(ch)) f|=(ch == '-'),ch=(char)getchar();while(isdigit(ch)) x=x*10+(ch^48),ch=(char)getchar();return f ? -x : x;
}
using namespace std;
const int N=2e5+10;
int n,t,k,tr[N]; bitset<N> st;
int lowbit(int x) {return x&-x;}
void add(int x,int v) {for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;}
void modify(int l,int r,int v) {add(l,v); if(r < n) add(r+1,-v);}
int query(int x) {int res=0;for(int i=x;i;i-=lowbit(i)) res+=tr[i];return res;
}
int qur(int x) {if(st[x]) return query(x); st[x]=1;cout<<"? 1 "<<x<<endl; int kl=read();modify(x,x,kl-query(x));return kl;
}
signed main() {n=read(); t=read();while(t -- ) {k=read();int l=1,r=n,res=0;while(l <= r) {int mid = (l + r) >> 1;if(mid - qur(mid) >= k) res=mid,r=mid-1;else l=mid+1;}cout<<"! "<<res<<endl;modify(res,n,1);}return 0;
}

To Go Or Not To Go?

题目

迪马居住的城市是一个面积为 \(n \times m\) 的长方形区域。田地上的每个单元格 \((i, j)\) 都用一个数字 \(a_{ij}\) 表示:

  • 数字 \(-1\) 表示禁止通过该单元
  • 数字 \(0\) 表示牢房是自由的,迪马可以穿过
  • 数字 \(x\) ( \(1 \le x \le 10^9\) )表示该小区包含一个花费为 \(x\) 的入口。有入口的单元格也被认为是自由的

迪玛可以从任意一个入口到达其他任意一个入口,而从入口 \((i, j)\) 到入口 \((x, y)\) 的移动时间相当于它们的费用总和 \(a_{ij} + a_{xy}\)

除了在传送门之间移动之外,迪马还可以在 \(w\) 时间内在相邻的未被占用的单元格之间移动。尤其是,他可以进入一个有传送门的单元格而不使用它。

最初,迪马位于左上方的单元格 \((1, 1)\),而学校位于右下方的单元格 \((n, m)\)

分析

传送门只会用一次,如果可以 \(a \rightarrow b \rightarrow c\),我们为什么不能直接 \(a \rightarrow c\) 呢?

然后就变成了一个两层分层图的问题,然后过不去。

从起点终点分别 bfs,每次都在可以传送的点处加上传送值取个 \(\min\),两段拼起来,再和直达取个 \(\min\)

#include<bits/stdc++.h>
#define ll long long
int read() {int x=0; bool f=false; char ch=(char)getchar();while(! isdigit(ch)) f|=(ch == '-'),ch=(char)getchar();while(isdigit(ch)) x=x*10+(ch^48),ch=(char)getchar();return f ? -x : x;
}
using namespace std;
const int N=2e3+10; ll mn1=1e18,mn2=1e18;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int n,m,w,a[N][N];
struct node {int x,y;
}; queue<node> q;
ll d[2][N][N];
signed main() {n=read(); m=read(); w=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) {a[i][j]=read();}for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=1;k++) d[k][i][j]=1e18;d[0][1][1]=0; q.emplace(node{1,1});while(! q.empty()) {auto x=q.front().x,y=q.front().y; q.pop();if(a[x][y]) mn1=min(mn1,d[0][x][y]+a[x][y]);for(int i=0;i<4;i++) {int nx=x+dx[i],ny=y+dy[i];if(nx < 1 || nx > n || ny < 1 || ny > m) continue ;if(a[nx][ny] == -1) continue ;if(d[0][nx][ny] > d[0][x][y] + w) {d[0][nx][ny] = d[0][x][y] + w;q.emplace(node{nx,ny});}}}d[1][n][m]=0; q.emplace(node{n,m});while(! q.empty()) {auto x=q.front().x,y=q.front().y; q.pop();if(a[x][y]) mn2=min(mn2,d[1][x][y]+a[x][y]);for(int i=0;i<4;i++) {int nx=x+dx[i],ny=y+dy[i];if(nx < 1 || nx > n || ny < 1 || ny > m) continue ;if(a[nx][ny] == -1) continue ;if(d[1][nx][ny] > d[1][x][y] + w) {d[1][nx][ny] = d[1][x][y] + w;q.emplace(node{nx,ny});}}}ll ans = min(d[0][n][m],mn1+mn2);if(ans >= 1e18) puts("-1");else printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880175.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树上邻域理论(树上圆理论) 小记

邻域:记 \(f(u, r)\) 表示距离 \(u\) 不超过 \(r\) 的点组成的邻域。令 \(x, y\) 为点集 \(S\) 中两个距离最远的点,设 \(u\) 为 \(x, y\) 中点(可能是一条边的中心),设 \(d\) 为 \(x, y\) 的距离,那么覆盖 \(S\) 的最小邻域为 \(f(u, \frac d2)\)。邻域 \(f(u_1, r_1)\)…

Docker搭建Jenkins并共用宿主机Docker部署服务(一)搭建Jenkins及插件配置 -转载

前言 公司项目多忙着开发,所有项目服务都是博主一个个部署的,时间久了也是心累,所以抽时间把Jenkins部署上,之后让其他开发人员自己部署(让我解脱吧!!)。 部署Jenkins容器 Docker安装就不在赘述了,可以看我之前的文章(懒了);直接开始拉取jenkins镜像。 拉取镜像 docker…

Adam优化器、其与策略梯度法结合

一.Adam优化器旨在根据历史梯度信息来调整每个参数的学习率,从而实现更高效的网络训练。Adam算法的核心思想是同时计算梯度的一阶矩(均值)和二阶矩(未中心的方差)的指数移动平均,并对它们进行偏差校正,以确保在训练初期时梯度估计不会偏向于0。Adam优化器是一种梯度下降…

ES6-3 Babel转码器

Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着你可以用ES6的方式编写程序,又不用担心现有的环境是否支持浏览器支持性查看:https://caniuse.com/Babel官网:https://babeljs.io/ 1、转码示例原始代码用了箭头函数,Babel将…

c++专题三

C++专题三学习日记 stack(栈) 仅支持查询或删除最后一个加入的元素(栈顶元素)函数名 功能 时间复杂度top() 返回栈顶元素 O(1)empty() 判断是否为空 O(1)size() 返回元素个数 O(1)push() 在栈顶插入元素 O(1)pop() 删除栈顶元素 O(1)queue(队列) 仅支持查询或删除第一个加入的…

mower 明日方舟自动化脚本的docker镜像构建以及使用

一、前言碎碎念 由于我目前使用的arm开发板,默认没有启用桌面可视化环境,而且又不想装一大堆软件和包影响实机环境,所以使用docker进行mower的镜像构建以及使用 测试平台如下,x64和arm64平台均已经过构建以及使用测试二、mower构建以及部署过程 接下来使用arm平台ubuntu进行…

我的公众号接入AI了

背景 近期,DeepSeek等AI应用的爆火让我深刻意识到AI技术在各个领域中的巨大潜力。为了更好地拥抱AI,我决定在我的所有工作生活场景中尽可能地加入AI,以提升效率和体验。 作为拥抱AI的一环, 我选择了为我的微信公众号接入AI功能,使其能够智能回复用户消息,提供更丰富的交互…

大模型时代的软件进化论:恐龙式软件 vs. 猴群式软件

春节期间,IT圈内两件大事持续发酵,一件是中国大模型DeepSeek R1的开源震动全球AI界,让中国科技界扬眉吐气,廉价大模型走入千家万户;另一件是SAP被客户居然之家告上法庭,要求索赔590万开发费用和1700万软件费用,最终法院判SAP退还350万研发费用。这两件事的背后,实际上映…

xtrabackup 命令备份

Percona XtraBackup 安装下载地址: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-32/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.35-32.1.el8.x86_64.rpm 官方YUM安装说明: Percona 版本和 YUM - Percona XtraBackup在…

React—03—类组件中事件处理函数的this绑定、事件处理函数的传参;jsx的条件判断渲染;jsx的循环渲染

零、如何给html元素加事件监听 1.原生方式:通过querySelector()方法,捕捉到元素,比如说button元素,然后通过btn.onclick = () =>{}或者通过btn.addEventListensers(click, ()=>{})的方式 2.vue的方式,在元素上使用v-on指令,比如@click 3.react方式,在元素上使用事…

巧用通义灵码,提升前端研发效率

本次分享,主题是利用通义灵码提升前端研发效率。分享内容主要包括以下几部分:首先,我将从前端开发的角度介绍对通义灵码的基本认识;其次,我将展示通义灵码在日常研发中的应用案例;然后,我将通过实例说明,良好的设计能够显著提升通义灵码的效果。在第四个部分,我将介绍…

linux服务器离线安装ollama

一、前言 公司服务器在线安装ollama总是超时连接不上,想着本质就是个安装包,离线安装也可以。固有了这样的一篇博客记录一下。 二、流程 1、查看服务器cpu架构 执行指令 lscpu# x86_64 CPU选择下载ollama-linux-amd64 # aarch64|arm64 CPU选择下载ollama-linux-arm642、下载对…