CF Global Round 10-E

E.Omkar and Duck

\(Description:\)

(交互题)先告诉你 \(n\),让你给出 \(n\times n\) 的矩阵,然后 \(q\) 组询问,每次会给出矩阵中从左上到右下的某一路径上的数字之和,输出路径长什么样

\(Solution:\)

一开始以为随便构造一个全为\(1\)的矩阵,然后乱输出路径就可以了(雾

看完题才发现原来要求输出的路径得是唯一的。。。

那就必须构造一个矩阵,使得从左上到右下的每一条不同路径的路径和是不一样的,然后还得在\(O(n)\)的复杂度下输出路径

考虑二进制,给每一个从右上到左下的对角线赋一个二的次幂,然后\(01\)交替即可

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
const int N=30;
int t,n,m;
lol a[N][N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		if(i&1){
			for(int j=1;j<=n;j++){
				a[i][j]=1ll<<(i+j-2);
				printf("%lld ",a[i][j]);
			}
		}
		else{
			for(int j=1;j<=n;j++)
				printf("0 ");
		}
		puts("");
	}
	fflush(stdout);
	scanf("%d",&m);
	while(m--){
		lol tmp;
		scanf("%lld",&tmp);
		for(int x=1,y=1;x<n||y<n;){
			printf("%d %d\n",x,y);
			if(x==n){y++;continue;}
			if(y==n){x++;continue;}
			lol s=1ll<<(x+y-1);
			if(tmp&s){
				if(a[x+1][y]>0)x++;
				else y++;
			}
			else{
				if(a[x+1][y]>0)y++;
				else x++;
			}
		}
		printf("%d %d\n",n,n);
		fflush(stdout);
	}
	return 0;
}
posted @ 2020-08-17 16:30  kakakakakaka  阅读(136)  评论(0编辑  收藏  举报

Never forget why you start

//鼠标爆炸特效