首页 > 其他分享 >UOJ #758. 【IOI2022】囚徒挑战

UOJ #758. 【IOI2022】囚徒挑战

时间:2023-02-09 19:22:21浏览次数:65  
标签:int ll 758 db IOI2022 using UOJ calc define

题面传送门

奇妙的题目?

首先显然可以拆成二进制按位比较。具体的,第一个人先看 \(A\) 最高位是什么,然后写在白板上,然后第二个人看 \(B\) 最高位是什么,和写在白板上的数字比较,以此类推。需要\(3\log n\)次。

我们发现第二个人只比较不干事有点浪费,不妨采取这样的行动:第一个人看\(A\)最高位,卸载黑板上,然后第二个人看\(B\)的最高位,比较,然后看次高位,写在黑板上,以此类推。当前看什么数可以通过当前轮数模 \(2\) 的余数确定。这样需要\(2\log n\)次。

因为\(3^2>2^3\),因此可以用三进制代替二进制,可以做到\(24\)。

考虑三进制最后一位数的过程,发现如果最后一位是\(0\)那么一定这个数小,如果是\(2\)则一定这个数比较大。则只需要传递一位的信息下去,可以做到\(22\)位。

发现这个性质不止可以在最后一位用,可以每一位都用,将值域去掉最小的和最大的两个,这样会变成\(21\)位。

还有一位,没办法了,怎么办呢,打个表先!

发现最后剩下 \(4\) 个数的时候我们还是用三进制去做非常浪费,这个可以直接用两个数做掉。因此可以做到\(20\)次了。

#include "prison.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=5e3+5,M=N*4+5,K=2e3+5,mod=998244353,Mod=mod-1;const db eps=1e-9;const ll INF=1e18+7;mt19937 rnd(time(0));
vector<vector<int>> s;vector<int> Ts;
void calc(int l,int r,int L,int R,int d,int op,int La){
	int v=(d-1)*3+op,i;s[v][0]=d&1;
	for(i=l;i<=r;i++) s[La][i]=v;
	for(i=L;i<=l;i++) s[v][i]=-1-(d&1);
	for(i=r;i<=R;i++) s[v][i]=-2+(d&1);
	l++;r--;if(l>r) return;
	if(l+3>=r){
		int m=l+r>>1;calc(l,m,l-1,r+1,d+1,1,v);calc(m+1,r,l-1,r+1,d+1,2,v);
	}else{
		int m1=(l*2+r)/3,m2=(l+r*2)/3;
		calc(l,m1,l-1,r+1,d+1,1,v);calc(m1+1,m2,l-1,r+1,d+1,2,v);calc(m2+1,r,l-1,r+1,d+1,3,v);
	}
	
}
vector<vector<int>> devise_strategy(int N) {
	for(int i=0;i<=N;i++) Ts.PB(0);for(int i=0;i<=20;i++) s.PB(Ts);
	calc(1,N,1,N,0,3,0);
	//for(auto i:s) {for(int j:i) cerr<<j<<' '; cerr<<'\n';}
	return s;
}

标签:int,ll,758,db,IOI2022,using,UOJ,calc,define
From: https://www.cnblogs.com/275307894a/p/17106768.html

相关文章

  • P7585 [COCI2012-2013#1] LJUBOMORA 二分 普及-
    赤裸二分#include<iostream>#include<cmath>usingnamespacestd;constintN=300010;intn,m,rr;intc[N];boolcheck(intmid){intcot=0;for(inti......
  • [IOI2022] 最罕见的昆虫
    [IOI2022]最罕见的昆虫题目描述PakBlangkon的房子四周有\(N\)只昆虫,编号为\(0\)至\(N-1\)。每只昆虫有一个类型,以从\(0\)至\(10^9\)(包含\(0\)和\(10^9\))的......
  • BUUOJ——WEB(一)
    WEB[极客大挑战2019]EasySQL一道确实很简单的sql注入题目,但是折磨了我半天,猜测后台语句大概如下:select*fromusr_tablewhereuser='$username'andpassword='$pas......
  • buuoj-pwn-hctf2018_the_end
    buuoj-pwn-hctf2018_the_end总结lb=ELF(...)使用重温了一遍攻击exit指针,还有如何找__libc_atexit虽然改不了反弹shell重定向​ 详细看这个exec1>&0_luooofa......
  • buuoj-pwn-ciscn_2019_final_10
    buuoj-pwn-ciscn_2019_final_10总结题目分析glibcubuntu18.04,对应GLIBC2.27,对于这题,我们知道doublefree没检查就行逆向分析关键函数一第一个箭头所指没法绕过,随便......
  • HZNUOJ-1503公路乘车--DP
    题目传送门:https://acm.hznu.edu.cn/OJ/problem.php?id=1503题解:我们发现后一状态由前一状态决定,即后一公里由前面十公里的状态决定,经典dp,我们直接列出状态转移方程:dp[1]......
  • buuoj-pwn-pwnable_bf
    buuoj-pwn-pwnable_bf总结bss段上存储libc地址的地方有很多,最值得注意的就是stdin、stdoutbrainfuck的认识(虽然这题没用[、]),如下:题目分析简单一看就知道本......
  • buuoj-pwn-gwctf_2019_shellcode
    buuoj-pwn-gwctf_2019_shellcode总结可见字符shellcode优先判断能不能利用\x00非预期一手题目分析IDA打开,看不了main函数,但是汇编也挺简单的,看看汇编就知道是打开沙......
  • buuoj-pwn-starctf_2019_babyshell
    buuoj-pwn-starctf_2019_babyshell逆向分析GLIBCubuntu16,不涉及内存管理也没啥需要讲的关键函数主函数__int64__fastcallmain(__int64a1,char**a2,char**a3......
  • buuoj-[Zer0pts2020]easy strcmp
    1.无壳2.打开直奔main函数啊,又是签到题吗?交上去,不对。。。然后开始一顿乱翻这个看起来很可疑查一下谁调用了这个函数,结果又是一顿乱翻,从程序入口找到了这个:一......