1. 程式人生 > >sort之結構體排序1

sort之結構體排序1

CSU1409: 集合的並

Description

給出兩個由整陣列成的集合AB,計算AB中包含多少個整數。

Input

輸入的第一行包含一個整數T (T > 0),表示一共有T組測試資料。

對於每組測試資料,第一行包含一個整數n (1 ≤n≤ 105)。第二行包含2n個整數a1b1a2b2, ..., anbn (0 < a1b1 < a2b2 < ... < anbn < 109),表示A = [a1b1 [a2b2 ...  [anbn]。第三行包含一個整數m (1 ≤m≤ 105)。第四行包含2m個整數c1d

1c2d2, ..., cmdm (0 < c1d1 < c2d2 < ... < cmdm < 109),表示B = [c1d1 [c2d2 ...  [cmdm]

這裡[xy]表示由xy之間(包含xy)所有整陣列成的集合。

Output

對於每組測試資料,輸出AB中包含多少個整數。

Sample Input

3

1

7 7

1

3 3

2

1 2 3 4

1

2 3

2

1 2 4 6

3

1 3 6 7 9 10

Sample Output

2

4

9

HINT

對樣例1的解釋:A = {7}B = {3}

AB = {3, 7}

對樣例2的解釋:A = {1, 2, 3, 4}B = {2, 3}AB = {1, 2, 3, 4}

對樣例3的解釋:A = {1, 2, 4, 5, 6}B = {1, 2, 3, 6, 7, 9, 10}AB = {1, 2, 3, 4, 5, 6, 7, 9, 10}

這題剛開始只看到了10的5次方,沒看到後面還有一個10的9次方。就去敲程式碼後提交。直接RE因為記憶體開小了,後來看清題目去改大記憶體然後直接記憶體超限。然後去網上搜了一下解題報告,最初一看好熟悉的,sort結構體排序,加上計算單個區間和長度。好好熟悉的。

然後就開始敲程式碼,因為上次有人說過一個類似的題目,當時順便看了一下c++中的sort排序特別是sort結構體排序,因此先說一下sort結構體排序;

C++中的sort函式的標頭檔案是#include<algorithm>;

sort函式的三個引數

第一個;開始值的地址

第二個;結束值的地址

第三個;排序的函式,若沒有則預設為升序排列;記住函式return中大於為降序,小於為升序

現在說對結構體陣列的排序;

#include<iostream>

#include<algorithm>

using namespacestd;

struct node

{

       int a;

       int b;

       double c;

}arr[100];

bool cmp(node x, node y)//要定義成bool形

{

       if(x.a !=y.a)       return x.a < y.b;

       if(x.b != y.b)      return x.b > y.b;

       return x.c > y.c;

}//先根據a升序排列若相等則根據b來降序排列 否則 按照c降序排列;

sort(arr, arr+90,cmp);//直接加+90而不是作為下標,

正如程式碼;

定義bool函式,形參為結構體變數,用結構體變數元素來排序;

現在我們再來分析題目;

簡化就是很多集合求他們的並集中的整數個數;有點注意的是一個集合也就是一個範圍,並且是一個連續整數的範圍;則這個集合內的整數個數就是end-st+1;

現在再看我們知道很多集合了,要怎麼統計他們呢。集合與集合之間還有重複的,記得原來做過一道類似的,這就要用到排序的問題了。將集合的st按升序排列,若相同按照end降序排列;這裡就需要上面的sort排列了。

再怎麼計算呢;;剩下的就簡單了,按順序排列好了後在就是計算每個集合的,這裡有個小技巧要自己注意。

看程式碼;

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;//因為要用sort所以要用到 c++; 
struct jh
{
long long int a;
long long int b;
}zs[200008];//所有集合都用zs表示; 
bool cmp(jh l, jh m)
{
if(l.a == m.a)return l.b > m.b;//結構體按照b元素的降序排列;
return l.a < m.a;//結構體按照a元素的升序排列。 
}
int main()
{
long long int n, sz, sb, sa, st, count, i;

scanf("%lld",&n);
while(n--){
scanf("%lld",&sa);
for(i = 0; i < sa; i++){
scanf("%lld %lld",&zs[i].a, &zs[i].b);
}
scanf("%lld",&sb);
for(i = sa; i < sa+sb; i++){
scanf("%lld %lld",&zs[i].a, &zs[i].b);
}
sort(zs,zs+sa+sb,cmp);
st = 0;
count = 0;
for(i = 0; i < sa+sb; i++){
if(zs[i].a >= st)st = zs[i].a;
if(zs[i].b >= st){
count += zs[i].b-st+1;
st = zs[i].b+1;
}
}
printf("%lld\n",count);
}

return 0 ;
}