兔子的逆序對

2021-09-13 15:22:28 字數 1500 閱讀 2627

兔子的逆序對

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 131072k,其他語言262144k

64bit io format: %lld

第一行乙個整數 n,表示序列的大小。

第二行 n 個整數ai 表示序列的各個元素。

第三行乙個整數m,表示操作個數。

接下來 m 行,每行兩個整數 l,r,表示反轉的區間。

輸出共m行每行乙個字串,表示反轉後序列逆序對個數的奇偶性,如果是逆序對個數奇數,輸出"dislike"(不含引號),如果是偶數,輸出"like"。
示例1

複製

4

1 2 3 4

41 2

3 41 4

2 3

複製

dislike

like

like

dislike

注意:以下的(i,j)指的是位置 i 和位置 j

a= 的逆序對是 (1,2) 共1個,1是奇數,所以是dislike

a= 的逆序對是 (1,2) (3,4)共2個,2是偶數,所以是like

a= 的逆序對是 (1,3) (1,4) (2,3) (2,4)共4個,4是偶數,所以是like

a= 的逆序對是 (1,2) (1,4) (3,4) 共3個,3是奇數,所以是dislike

對於20%的資料

1 ≤ n ≤ 100

1 ≤ m ≤ 10

對於40%的資料

1 ≤ n ≤ 2000

1 ≤ m ≤ 50

對於60%的資料

1 ≤ n ≤ 2000

1 ≤ m ≤ 104

對於100%的資料

1 ≤ n ≤ 105

1 ≤ m ≤ 2*106

對於所有資料 l ≤ r且 ai 是n的乙個排列,即ai互不相同且ai ≤ n

由於讀入資料較大,建議使用快速讀入。

使用歸併排序可以查詢逆序對

下面這個公式可以查詢區間翻轉後逆序對的個數是奇數還是偶數

x為區間左側 y為區間右側 ans為翻轉前逆序對是奇數個(為1)還是偶數個(為0)

int pr=y-x+1;pr=(pr*(pr-1)/2)%2;

if(pr)  ans^=1;

#includeusing namespace std;

int n,t,x,y,a[100005],ans,r[100005];

void pai(int s,int e)

}while(i<=mid)

r[k++]=a[i++];

while(j<=e)

r[k++]=a[j++];//把沒放完的一邊的數放入r陣列的末尾

for(int i=s;i<=e;i++)

a[i]=r[i];//把r陣列的數複製到a陣列中

}int main()

return 0;

}

兔子的逆序對

輸出描述 輸出共m行每行乙個字串,表示反轉後序列逆序對個數的奇偶性,如果是逆序對個數奇數,輸出 dislike 不含引號 如果是偶數,輸出 like 示例1輸入 41 2 3 4 41 2 3 41 4 2 3輸出 dislike like like dislike 說明注意 以下的 i,j 指的是...

兔子的逆序對

兔子的逆序對 歸併排序做法 序言題目描述 輸入格式 第一行乙個整數 n,表示序列的大小。第二行 n 個整數ai 表示序列的各個元素。第三行乙個整數m,表示操作個數。接下來 m 行,每行兩個整數 l,r,表示反轉的區間。輸出格式 輸出共m行每行乙個字串,表示反轉後序列逆序對個數的奇偶性,如果是逆序對個...

NC20861兔子的逆序對

首先吐槽 這只兔子的事真多 首先,啊,不對,假裝沒寫 second,一定要看備註 用快讀 第三 cout會t,printf不會 這其實就是先求出逆序對的數量 就是歸併排序 然後就非常簡單了 這裡有一條重要資訊 乙個排序中任意兩個元素對換,排列會改變逆序數 於是我們可以在反轉區間上找找規律 設反轉區間...