CF Global Round 10-E
阿新 • • 發佈:2020-08-17
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; }