題目鏈結
好吧,這道題目按理來說應該是套路題,但是我就是不會,所以寫篇題解學習一下。
首先如果 \(x_i+y_i\) 的奇偶性不同就無解,因為每次操作後 \(x_i+y_i\) 的奇偶性都是固定的,不肯能出現奇偶性不同的情況。
如果 \(x_i+y_i\) 的奇偶性全部相同,那麼必定有解,當 \(x_i+y_i\) 為偶數的時候可以通過一次走動變成奇數,所以只考慮 \(x_i+y_i\) 為奇數的情況。
可以使用二進位制來構造,通過序列 \(1,2,4,8,16,\dots,2^k\) 可以從 \((0,0)\) 走到任意乙個滿足 \(\mbox(x)+\mbox(y)<2^\) 並且 \(x+y\) 為奇數的位置 \((x,y)\) ,可以使用歸納法來證明。
\(k=0\) 時,顯然序列 \(1\) 可以到達 \((1,0),(0,1),(-1,0),(0,-1)\) 。
假設 \(1,2,4,\dots,2^\) 滿足該條件,然後我們新加入了乙個數 \(2^k\) ,如果 \((x,y)\) 滿足 \(\mbox(x)+\mbox(y)<2^\) 並且 \(x+y\) 為奇數,那麼 \(\mbox(x)\) 和 \(\mbox(y)\) 中最多只有乙個數的二進位制第 \(k\) 位為 \(1\) ,不妨假設 \(\mbox(x)>\mbox(y)\) (需要注意 \(\mbox(x)\ne \mbox(y)\) ,否則不滿足 \(\mbox(x)+\mbox(y)\) 是奇數),如果 \(\mbox(x)\ge 2^k\) ,那麼我們可以令 \(\mbox(x)\) 變成 \(\mbox(x)-2^k\) ,仍然滿足條件,否則我們可以令 \(\mbox(x)\) 變成 \(2^k-\mbox(x)\) ,則 \(2^k-\mbox(x)+\mbox(y)<2^k\) ,仍然滿足條件。
當然也可以通過圖來理解,每次序列增加乙個數相當於是覆蓋的點向上向下向左向右並起來的所有點:
不難發現,從 \((0,0)\) 通過序列 \(1,2,4,8,\dots,2^k\) 只有唯一的方法走到 \((x,y)\) ,直接遞迴求解即可。
#include#include#include#include#define ch() getchar()
#define pc(x) putchar(x)
using namespace std;
templatevoid read(t&x)
templatevoid write(t x)
const int maxn=1005,base=38;
long long _[base];
long long abs(long long x)
int judge(long long x,long long y,int sp)
void solve(long long x,long long y,int sp)
if(judge(x+_[sp],y,sp-1))
if(judge(x,y-_[sp],sp-1))
if(judge(x,y+_[sp],sp-1)) }}
long long x[maxn],y[maxn];
int main()
if(!ok)puts("-1");
else
} return 0;
}
C Make Good(構造,思維)
題意 給定n個數 1 n 1e5 ai 1 ai 1e9 現在在原陣列種新增最多3個數 範圍為1到1e18 使得新陣列滿足 i 1mai 2 a1 a 2 am sum a i 2 a 1 bigoplus a 2 bigoplus.bigoplus a m i 1m ai 2 a 1 a 2 a ...
HDU Permutation 構造,思維
題目傳送 題意 給你乙個排列n 也就是元素從1到n 現在讓你構造一下這個陣列,使得a i a i a i 2 0 a i a i 2 的絕對值,i 3 思路 如果我使得a i a i 2 1,那麼不就萬能啦?ac include inline long long read while c 0 c 9...
C Palindromifier 思維 構造
思路 看到30次的時候以為有特殊的方法構造,但是看到每次的長度都會是變的,沒能覺得什麼演算法能o n 解決下來吧 畢竟我才疏學淺 最開始的時候構造wa1了。因為沒看到不能用取到第乙個數。如果能用就可以比較方便的2次就能迴轉了。但是這時候可以發現其實只要幾次就能轉變的端倪了。通過abcdef這個串去構...