兔子的逆序對(歸併排序做法)
序言題目描述
輸入格式
第一行乙個整數 n,表示序列的大小。
第二行 n 個整數ai 表示序列的各個元素。
第三行乙個整數m,表示操作個數。
接下來 m 行,每行兩個整數 l,r,表示反轉的區間。
輸出格式
輸出共m行每行乙個字串,表示反轉後序列逆序對個數的奇偶性,如果是逆序對個數奇數,輸出"dislike"(不含引號),如果是偶數,輸出"like"。
標準輸入
41 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 //此為最大的資料量輸入 1e5,所以我們建陣列要大一點
1 ≤ m ≤ 2*106
對於所有資料 l ≤ r且 ai 是n的乙個排列,即ai互不相同且ai ≤ n
由於讀入資料較大,建議使用快速讀入。
**
#includeusing namespace std;
int q[100005],temp[100005];//建立資料輸入所需要的的陣列和臨時陣列
int ans;//進行奇偶性判斷
void mergesort(int q,int l ,int r)//歸併排序模板
} while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
for(int i=l,j=0;i<=r;i++,j++) q[i]=temp[j];
}int main()
{ int n,m;
cin>>n;
for(int i=0;i解題思路
思路可參考:
兔子的逆序對
兔子的逆序對 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 第一行乙個整數 n,表示序列的大小。第二行 n 個整數ai 表示序列的各個元素。第三行乙個整數m,表示操作個數。接下來 m 行,每行兩個整數 l,r,...
兔子的逆序對
輸出描述 輸出共m行每行乙個字串,表示反轉後序列逆序對個數的奇偶性,如果是逆序對個數奇數,輸出 dislike 不含引號 如果是偶數,輸出 like 示例1輸入 41 2 3 4 41 2 3 41 4 2 3輸出 dislike like like dislike 說明注意 以下的 i,j 指的是...
NC20861兔子的逆序對
首先吐槽 這只兔子的事真多 首先,啊,不對,假裝沒寫 second,一定要看備註 用快讀 第三 cout會t,printf不會 這其實就是先求出逆序對的數量 就是歸併排序 然後就非常簡單了 這裡有一條重要資訊 乙個排序中任意兩個元素對換,排列會改變逆序數 於是我們可以在反轉區間上找找規律 設反轉區間...