Pjudge #21651. 【PR #4】猜猜看
感觉上挺高妙一道题。
首先我们来考虑怎么做,显然是进行次询问,然后会出现两种取值,在两个较小取值都出现的点就是两个较小的点,在两个较大的取值都出现的点就是两个较大的点。然后再用两次操作区分出较小中较大的和较大中较小的。
这启发我们利用最小的两个和最大的两个以及较小值,较大值确定每个数的取值,我们先用做出这个答案,然后每次单独加点,先取较小的和较大的询问得到一个答案,然后分类讨论:
若,则当前询问的值为。
若,则再询问一次即可分出要被淘汰的那个。同理。最后用操作分出答案即可。
code:
#include "guess.h"
#include<bits/stdc++.h>
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=1e6+5,M=N*25+5,K=2e3+5,mod=1e9+7,Mod=mod-1;const db eps=1e-5;const int INF=1e9+7;
int p1,p2,p3,p4,a1,a2,a3,a4,L,R;vector<int> Ans;
vector<int> solve(int n, int m) {
int i;for(i=0;i<n;i++) Ans.PB(0);a1=query2(1,2,3);a2=query2(0,2,3);a3=query2(0,1,3);a4=query2(0,1,2);
L=min(min(a1,a2),max(a3,a4));R=max(max(a1,a2),max(a3,a4));
if(a1==L&&a2==L) p3=0,p4=1,p1=2,p2=3;if(a1==L&&a3==L) p3=0,p4=2,p1=1,p2=3;if(a1==L&&a4==L) p3=0,p4=3,p1=1,p2=2;
if(a2==L&&a3==L) p3=1,p4=2,p1=0,p2=3;if(a2==L&&a4==L) p3=1,p4=3,p1=0,p2=2;if(a3==L&&a4==L) p3=2,p4=3,p1=0,p2=1;
for(i=4;i<n;i++) {
a1=query2(p1,p3,i);if(a1>L&&a1<R) {Ans[i]=a1;continue;}
if(a1<=L) {
a2=query2(p2,p3,i);if(a1==L) Ans[p1]=L,p1=i,L=a2;else Ans[p2]=L,p2=i,L=a1;
}else{
a2=query2(p1,p4,i);if(a1==R) Ans[p3]=R,p3=i,R=a2;else Ans[p4]=R,p4=i,R=a1;
}
}if(query1(p1,p2)) Ans[p1]=1,Ans[p2]=2;else Ans[p2]=1,Ans[p1]=2;
if(query1(p3,p4)) Ans[p3]=n-1,Ans[p4]=n;else Ans[p3]=n,Ans[p4]=n-1;return Ans;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现