Codeforces 赛时没想出来的思维题集

1584D Guess the Permutation

【交互题】给定数组 \(a=\{1,2,3,...,n\}\),现在评测机选定 \(i,j,k\in [1,n](i<j-1,j<k)\),并翻转 \(a_{[i,j-1]},a_{[j,k]}\)。你只知道 \(n(4\le n\le 10^9)\),需要在不超过 40 次询问后给出 \(i,j,k\),每次询问“? l r”可以得到子段 \(a_{[l,r]}\) 中的逆序对数。

sol

一句话题解:考虑首先二分求出 \(i\),并由 \(ask(i,n)-ask(i+1,n)+1\) 求得 \([i,j-1]\) 的长度,同理 \(ask(j,n)-ask(j+1,n)+1\) 求得 \([j,k]\) 的长度。


具体地,我们可以利用二分找出最后一个 \(ask(1,p)=0\) 的 \(p\),那么显然 \(i=p\)。接下来考虑 \(ask(i,n)-ask(i+1,n)\) 会得到什么,那么就是减少了 \(a_i\) 跟后面构成的逆序对数,那因为 \(a_i\) 只会跟 \(a_{i+1}...a_{j-1}\) 构成逆序对,所以 \((j-1)-(i+1)+1=ask(i,n)-ask(i+1,n)\),换句话说就是 \(j-1=i+ask(i,n)-ask(i+1,n)\)。那么同理地,\(k=j+ask(j,n)-ask(j+1,n)\)。
notes: long long
submission *2000

上一篇:Codeforces Round #755 部分题解


下一篇:Codeforces Round #754 (Div. 2)