sort之結構體排序1
CSU1409: 集合的並
Description
給出兩個由整陣列成的集合A, B,計算A∪B中包含多少個整數。
Input
輸入的第一行包含一個整數T (T > 0),表示一共有T組測試資料。
對於每組測試資料,第一行包含一個整數n (1 ≤n≤ 105)。第二行包含2n個整數a1, b1, a2, b2, ..., an, bn (0 < a1≤b1 < a2≤b2 < ... < an≤bn < 109),表示A = [a1, b1] ∪ [a2, b2] ∪ ... ∪ [an, bn]。第三行包含一個整數m (1 ≤m≤ 105)。第四行包含2m個整數c1, d
這裡[x, y]表示由x, y之間(包含x, y)所有整陣列成的集合。
Output
對於每組測試資料,輸出A∪B中包含多少個整數。
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}
對樣例2的解釋:A = {1, 2, 3, 4},B = {2, 3},A∪B = {1, 2, 3, 4}。
對樣例3的解釋:A = {1, 2, 4, 5, 6},B = {1, 2, 3, 6, 7, 9, 10},A∪B = {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 ;
}