Codeforces-1682B: AND Sorting 【构造、排序、位运算】
Codeforces-1682B: AND Sorting
題目傳送門:Codeforces-1682B: AND Sorting
題目
題目截圖
樣例描述
題目大意
? 給定一個長度為 nnn 的排列(數值在 [0,n?1][0,n-1][0,n?1] 之間),如果兩個數 pi&pj=Xp_i \& p_j = Xpi?&pj?=X,我們可以交換它們,稱為 X?交換X-\text{交換}X?交換,如果我們用 X?交換X-\text{交換}X?交換 可以排序整個數組,那么我們稱數組為 X?可排序的X-\text{可排序的}X?可排序的。問,對于給定的數組,可排序的最大的 XXX 是多少。
題目解析
? 首先,000 的存在保證了最小的值為 X=0X=0X=0,因為我們可以利用 000 來作為中間變量交換其它的兩個元素。那么還有沒有這樣的元素呢,是有的,那就是所有不在正確位置上的所有數的 ANDANDAND 值。首先,這個值一定不超過任何不正確的數,因此一定在排列中,之后,我們知道對 pi&X=X,pj&X=Xp_i \& X=X,p_j \& X=Xpi?&X=X,pj?&X=X,那么我們可以利用 XXX 去置換 pi,pjp_i,p_jpi?,pj?,這樣 XXX 就可以起到 000 的作用了,因此,我們直接輸出所有不在正確位置上的所有數的 ANDANDAND 值即可。顯然,這個數是最大的,若給更大的數,那么有的錯序數不能只靠 XXX 進行交換,與題目不符。
Code
#include <bits/stdc++.h> using namespace std;typedef long long LL; const int maxn = 2e5 + 7; int p[maxn];int main() {int t, n;cin >> t;while(t--) {cin >> n;int ans = -1;for(int i=0; i<n; ++i) {cin >> p[i];if(ans == -1 && p[i] != i) ans = p[i];else if(p[i] != i) ans &= p[i];}cout << max(ans, 0) << endl;}return 0; }總結
以上是生活随笔為你收集整理的Codeforces-1682B: AND Sorting 【构造、排序、位运算】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache Archiva搭建Mave
- 下一篇: java四种权限修饰符 (private