1. 程式人生 > 實用技巧 >CF Global Round 10-E

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;
}