hihocoder 挑战赛9 A.好配对(思维题目 防止超时)
#1123 : 好配对
时间限制:1000ms
单点时限:1000ms
内存限制:256MB
描述
给定两个序列a和b,每个序列中可能含有重复的数字。
一个配对(i,j)是一个好配对当从第一个序列中选出一个数ai,再从第二个序列中选出一个数bj且满足ai>bj。
给出两个序列,问存在多少个好配对。
输入
输入包含多组数据,数据第一行一个整数T,表示数据组数。(T<=5)
每组数据第一行包含两个整数n和m。(0<n,m<=105)
接下来n行,每行两个整数x和y,表示在第一个序列中有y个x。
接下来m行,每行两个整数x和y,表示在第二个序列中有y个x。(0<x<=109,0<y<=104)
输出
对于每组数据,输出一行一个整数,表示好配对的数量
- 样例输入
-
1 2 2 3 2 4 1 3 1 2 3
- 样例输出
-
10
算法:O(n)的复杂度
代码:1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostream> 6 #include <string> 7 #include <iomanip> 8 #include <vector> 9 #include <queue> 10 #include <algorithm> 11 #define N 100000+10 12 13 using namespace std; 14 int n, m; 15 struct nodea 16 { 17 int x, y; 18 bool operator < (const nodea&dd)const 19 { 20 return x<dd.x; 21 } 22 }a[N]; 23 24 struct nodeb 25 { 26 int x, y; 27 bool operator < (const nodeb&dd)const 28 { 29 return x<dd.x; 30 } 31 }b[N]; 32 33 34 int main() 35 { 36 int t; 37 int i, j; 38 scanf("%d", &t); 39 while(t--) 40 { 41 scanf("%d %d", &n, &m); 42 for(i=0; i<n; i++) 43 { 44 scanf("%d %d", &a[i].x, &a[i].y); 45 } 46 for(i=0; i<m; i++) 47 { 48 scanf("%d %d", &b[i].x, &b[i].y); 49 } 50 sort(a, a+n); 51 sort(b, b+m); 52 long long int cnt=0; 53 long long int sum=0; 54 j=0; 55 for(i=0; i<n; i++) 56 { 57 while(a[i].x > b[j].x && j<m ) 58 { 59 cnt+=b[j].y; 60 j++; 61 } 62 sum=sum+cnt*a[i].y; 63 //printf("%lld---", sum ); 64 } 65 printf("%lld\n", sum ); 66 } 67 return 0; 68 }