Link:http://hihocoder.com/problemset/problem/1123
#1123 : 好配对
时间限制:
1000ms
单点时限:
1000ms
内存限制:
256MB
-
1 2 2 3 2 4 1 3 1 2 3
样例输出
-
10
描述
给定两个序列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)
输出
对于每组数据,输出一行一个整数,表示好配对的数量
AC code:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<map>
#define MAX 100000+10
using namespace std;
long long ans,num;
struct node{
int v;
int cnt;
bool operator < (const node&dd)const
{
return v<dd.v;
}
}a[MAX],b[MAX];
int main()
{
//freopen("D:\\in.txt","r",stdin);
int i,j,t,n,m,k,cnt;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].v,&a[i].cnt);
}
for(i=0;i<m;i++)
{
scanf("%d %d",&b[i].v,&b[i].cnt);
}
sort(a,a+n);
sort(b,b+m);
j=0;
ans=0;
num=0;
for(i=0;i<n;i++)
{
while(a[i].v>b[j].v&&j<m)
{
num+=b[j].cnt;
j++;
}
ans=ans+a[i].cnt*num;
}
printf("%lld\n",ans);
}
return 0;
}