首页 > 其他分享 >P4791 [BalticOI 2018] 蠕虫之忧

P4791 [BalticOI 2018] 蠕虫之忧

时间:2024-12-07 17:59:26浏览次数:6  
标签:int I2 P4791 mid 000 2018 && BalticOI Qry

[BalticOI 2018] 蠕虫之忧

题目描述

题目译自 BalticOI 2018 Day1「Worm Worries

本题是一道交互题。

在一个三维空间(我们限制大小为 N × M × K N\times M\times K N×M×K)内,每个点都有一个正整数参数,记这个参数为 H [ x ,   y ,   z ] H[x,\, y,\, z] H[x,y,z](保证 1 1 1 ⩽ \leqslant ⩽ x x x ⩽ \leqslant ⩽ N N N , , , 1 1 1 ⩽ \leqslant ⩽ y y y ⩽ \leqslant ⩽ M M M , , , 1 1 1 ⩽ \leqslant ⩽ z z z ⩽ \leqslant ⩽ K K K 且每个参数都不超过 1 0 9 10^9 109)。你最多可以询问 Q Q Q 次,找到一个点,使得这个点的参数大于它周围与它有公共边的所有点的参数,即: H [ x ,   y ,   z ] ⩾ max ⁡ ( H [ x + 1 ,   y ,   z ] , H[x,\,y,\,z]\geqslant\max(H[x+1,\,y,\,z], H[x,y,z]⩾max(H[x+1,y,z], H [ x − 1 ,   y ,   z ] , H[x-1,\,y,\,z], H[x−1,y,z], H [ x ,   y − 1 ,   z ] , H[x,\,y-1,\,z], H[x,y−1,z], H [ x ,   y − 1 ,   z ] , H[x,\,y-1,\,z], H[x,y−1,z], H [ x ,   y ,   z + 1 ] , H[x,\,y,\,z+1], H[x,y,z+1], H [ x ,   y ,   z − 1 ] ) . H[x,\,y,\,z-1]). H[x,y,z−1]).

特别地,当一个点不在空间直角坐标系的第一卦限内时,它的参数为 0 0 0。

输入格式

请使用标准输入输出流与交互库进行交互。你可以向交互库询问最多 Q Q Q 次,每次可以询问一个点的参数。

输入的第一行包含四个整数 N ,   M ,   K ,   Q N,\,M,\,K,\,Q N,M,K,Q (请忽略这一行的其他参数)。在此之后,你可以向交互器提出至多 Q Q Q 行形如 ? x y z 的询问,表示“询问坐标为 ( x ,   y ,   z ) (x,\,y,\,z) (x,y,z) 的点的参数是多少”。对于每一组询问,交互器会输出一行一个整数表示坐标为 ( x ,   y ,   z ) (x,\,y,\,z) (x,y,z) 的点的参数。

当你找到一组解时,输出一行 ! x y z 表示你找到的答案是 ( x ,   y ,   z ) (x,\,y,\,z) (x,y,z),并终止程序。此时交互器不会有任何输出。

所有坐标必须满足 1 ⩽ x ⩽ N ,   1 ⩽ y ⩽ M ,   1 ⩽ z ⩽ K 1\leqslant x\leqslant N,\, 1\leqslant y\leqslant M,\, 1\leqslant z\leqslant K 1⩽x⩽N,1⩽y⩽M,1⩽z⩽K。如果不满足坐标的限制、询问不符合格式或询问超过了 Q Q Q 行,交互器会输出 -1 并退出,此时你的程序也应该退出。否则你可能会得到 Runtime ErrorTime Limit Exceeded 的判定结果。

请注意,你必须在每一次询问之后手动刷新缓存,否则你的程序将会超时,对于各语言,刷新缓存的方法如下:

  • Java: 调用 System.out.println() 会自动刷新缓存;
  • Python: 调用 print() 会自动刷新缓存;
  • C++: cout << endl 可以输出一个换行并刷新缓存。如果使用 printf,请使用 fflush(stdout)
  • Pascal: 调用 Flush(Output)

为了帮助你更好地完成交互,我们提供了可以复制到你的程序里的可选代码。可选代码使用了较快的输入输出,可能会提高 IO 较慢的 Python 和 Java 语言的程序效率(只与最后两个子任务有关)。

交互器没有使用随机函数,这意味着,每组测试数据都是固定的,与你的程序的询问无关。

输出格式

为了使你更好地完成交互,下面给出一组交互的示例。在这个示例中, N = 3 ,   M = 3 ,   K = 1 ,   Q = 3 N=3,\,M=3,\,K=1,\,Q=3 N=3,M=3,K=1,Q=3,这三个格子的参数为 { 10 ,   14 ,   13 } \{10,\,14,\,13\} {10,14,13}。以 JUDGE 开头的行表示交互库输出的内容(你的程序的标准输入的内容),以 YOU 开头的行表示你的程序的输出。

JUDGE:      3 1 1 3 123123 fixed 10 14 13
YOU  :      ? 3 1 1
JUDGE:      13
YOU  :      ? 2 1 1
JUDGE:      14
YOU  :      ? 1 1 1
JUDGE:      10
YOU  :      ! 2 1 1

提示

子任务分值限制
1 1 1 10 10 10 M = K = 1 ,   N = 1   000   000 ,   Q = 10   000 M=K=1,\,N=1\,000\,000,\,Q=10\,000 M=K=1,N=1000000,Q=10000
2 2 2 22 22 22 M = K = 1 ,   N = 1   000   000 ,   Q = 35 M=K=1,\,N=1\,000\,000,\,Q=35 M=K=1,N=1000000,Q=35
3 3 3 12 12 12 K = 1 ,   N = M = 200 ,   Q = 4   000 K=1,\,N=M=200,\,Q=4\,000 K=1,N=M=200,Q=4000
4 4 4 19 19 19 K = 1 ,   N = M = 1   000 ,   Q = 3   500 K=1,\,N=M=1\,000,\,Q=3\,500 K=1,N=M=1000,Q=3500
5 5 5 14 14 14 N = M = K = 100 ,   Q = 100   000 N=M=K=100,\,Q=100\,000 N=M=K=100,Q=100000
6 6 6 23 23 23 N = M = K = 500 ,   Q = 150   000 N=M=K=500,\,Q=150\,000 N=M=K=500,Q=150000

感谢 Hatsune_Miku 提供的翻译

#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=2666+5,M=170+5,K=1e5+5,mod=998244353,Mod=mod-1;const ll INF=1e18+7;const db eps=1e-5;mt19937 rnd(time(0));
int n,m,k,Q;map<int,int> f;
int GI(int x,int y,int z){return (x-1)*m*k+(y-1)*k+z-1;}
int Qry(int x,int y,int z){if(x<1||y<1||z<1||x>n||y>m||z>k) return 0;int Id=GI(x,y,z);if(f.count(Id))return f[Id];Q--;assert(Q>=0);cout<<"? "<<x<<' '<<y<<' '<<z<<endl;cin>>f[Id];return f[Id];}
void Succ(int x,int y,int z){cout<<"! "<<x<<' '<<y<<' '<<z<<endl;exit(0);}
int main(){
	cin>>n>>m>>k>>Q;int i,j,h;
	if(m==1&&k==1){
		int l=1,r=n;while(l+1<r){
			int mid=l+r>>1;
			if(Qry(l,1,1)>=Qry(mid,1,1)) r=mid;
			else if(Qry(r,1,1)>=Qry(mid,1,1)) l=mid;
			else if(Qry(mid,1,1)<=Qry(mid+1,1,1)) l=mid;else r=mid;
		}
		int Mx=0,Id=0;for(int i=l;i<=r;i++) {int p=Qry(i,1,1);p>Mx&&(Mx=p,Id=i);}Succ(Id,1,1);
	}
	if(k==1){
		int l1=1,l2=1,r1=n,r2=m,M1=0,I1=0,M2=0,I2=0,Ix1=0,Ip1=0,Ix2=0,Ip2=0;
		while(l1+1<r1){
			if(l1+1<r1){
				int mid=l1+r1>>1;M1=0,I1=0;for(i=l2;i<=r2;i++) Qry(mid,i,1)>M1&&(M1=Qry(mid,i,1),I1=i);
				int p1=Qry(mid+1,I1,1),p2=Qry(mid-1,I1,1);if(M1>=p1&&M1>=p2&&M1>=Qry(mid,I1-1,1)&&M1>=Qry(mid,I1+1,1))Succ(mid,I1,1);
				if(M1<Ix2) {
					if(Ip2<=mid) r1=mid;else l1=mid;
				}
				else if(M1<=p1) l1=mid;else r1=mid; 
				M1>Ix1&&(Ix1=M1,Ip1=I1);
			}
			if(l2<r2){
				int mid=l2+r2>>1;M2=0,I2=0;for(i=l1;i<=r1;i++) Qry(i,mid,1)>M2&&(M2=Qry(i,mid,1),I2=i);
				int p1=Qry(I2,mid+1,1),p2=Qry(I2,mid-1,1);if(M2>=p1&&M2>=p2&&M2>=Qry(I2-1,mid,1)&&M2>=Qry(I2+1,mid,1))Succ(I2,mid,1);
				if(M2<Ix1){
					if(Ip1<=mid) r2=mid;else l2=mid;
				}
				else if(M2<=p1) l2=mid;else r2=mid; 
				M2>Ix2&&(Ix2=M2,Ip2=I2);
			}
		}
		int Mx=0;I1=0,I2=0;for(i=l1;i<=r1;i++) for(j=l2;j<=r2;j++) Qry(i,j,1)>Mx&&(Mx=Qry(i,j,1),I1=i,I2=j);Succ(I1,I2,1);
	} 
	int Mx=0,x=0,y=0,z=0;for(i=1;i<=Q/2;i++){
		int I1=R(n),I2=R(m),I3=R(k),p=Qry(I1,I2,I3);p>Mx&&(Mx=p,x=I1,y=I2,z=I3);
	}while(1){
		int p1=Qry(x,y,z+1),p2=Qry(x,y,z-1),p3=Qry(x,y-1,z),p4=Qry(x,y+1,z),p5=Qry(x+1,y,z),p6=Qry(x-1,y,z);
		if(Mx>=p1&&Mx>=p2&&Mx>=p3&&Mx>=p4&&Mx>=p5&&Mx>=p6) Succ(x,y,z);
		if(Mx<p1) Mx=p1,z++;else if(Mx<p2) Mx=p2,z--;else if(Mx<p3) Mx=p3,y--;
		else if(Mx<p4) Mx=p4,y++;else if(Mx<p5) Mx=p5,x++;else Mx=p6,x--;
	}
}

标签:int,I2,P4791,mid,000,2018,&&,BalticOI,Qry
From: https://blog.csdn.net/zty20120913/article/details/144193918

相关文章

  • P4899 [IOI2018] werewolf 狼人
    P4899[IOI2018]werewolf狼人又是欢乐的kruskal重构树捏。首先我们来仔细研读一下题目:当你是人形时,你必须避开城市\(0,1,\ldots,L_i-1\);而当你是狼形时,则必须避开城市\(R_i+1,R_i+2,\ldots,N-1\)。也就是说,从起点开始,你只能走\([L,n]\)从终点开始,你......
  • [蓝桥杯 2018 省 B] 日志统计
    题目Description小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 NN 行。其中每一行的格式是 tsid,表示在 tsts 时刻编号 idid 的帖子收到一个“赞”。现在小明想统计有哪些帖子曾经是“热帖”。如果一个帖子曾在任意一个长度为 DD 的时间段内收到......
  • CS61B srping 2018 project00 https://sp18.datastructur.es/
    GettingtheSkeletonFiles,网站上应该有仓库地址,这个也行,https://gitee.com/heqilaoge/skeleton-sp18。拉下来找到proj0,就能开始作业。可以不使用IDE。2.ThePlanetClassandItsConstructor创建Planet类publicclassPlanet{publicdoublexxPos;publicdo......
  • CS61B srping 2018 examprep01(?02) https://sp18.datastructur.es/
    1.写出第21、24行的运行结果。(画出box-pointer指示图会对答题很有帮助)1publicclassShock{2publicstaticintbang;3publicstaticShockbaby;4publicShock(){5this.bang=100;6}7publicShock(intnum){8this.bang=num;9baby=starter();10this......
  • linux安装intel编译器2018
    加压软件/public/download/parallel_studio_2018.tgz进入目录后用./install.sh开始安装 按回车 这个选择1,然后需要输入lic激活文件路径。 安装完成后添加PATH到环境变量中1、如果是普通用户,在用户的.bashrc里面添加2、如果是root用户,在/etc/profile文件的最......
  • P5015 [NOIP2018 普及组] 标题统计 C语言
    先说思路:跟着题意来就好,其实更多的是考察fgets()函数的基础运用,之后用循环遍历字符串,若是遇到空格和换行符就不计入,反之count++;这里也可以直接用isalnum()直接对输入的字符是否是字母或是数字进行判断。以下是代码实现:#include<stdio.h>#include<ctype.h>intmain(){......
  • CS61B srping 2018 disc02 sol https://sp18.datastructur.es/
    第19行的变量level是静态方法change方法内部的本地变量,他对main方法里的level或者是实例变量level没什么影响。publicclassPokemon{//一个名为Pokemon的类publicStringname;//实例变量namepublicintlevel;//实例变量levelpublicPokemon(String......
  • CS61B srping 2018 disc02 https://sp18.datastructur.es/
    passbywhat?a.下列程序每一行怎么运行?b.画出box-and-pointer指示图c.在第19行,level被赋值为50,level是什么?是Pokemon的实例变量?(instancevariable)还是change方法的本地变量?(localvariable?)还是main方法里的变量?还是其他什么东西?1publicclassPokemon{2public......
  • 「Luogu P4516」[JSOI2018] 潜入行动
    题目外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSOIer抵御外星人的进攻。在黄金舰队就位之前,JYY打算事先了解外星人的进攻计划。现在,携带了监听设备的特工已经秘密潜入了外星人的母舰,准备对外星人的通信实施监听。外星......
  • CS61B srping 2018 disc01 answer
    1intsize=27;//声明一个int类型的变量size,并把27赋值给他2Stringname="Fido";//声明一个String类型的变量,并把“Fido”赋值给他3DogmyDog=newDog(name,size);//声明一个Dog类型的变量myDog,并调用Dog构造函数,分别把name和size传入其中,生成一个Dog类型的对......