Codeforces Round #113 (Div. 2) D. Shoe Store

来源:互联网 发布:机械编程学习 编辑:程序博客网 时间:2024/06/06 05:31
D. Shoe Store
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The warehouse in your shop has n shoe pairs. Each pair is characterized by two integers: its price ci and its size si. We know that on this very day all numbers si are different, that is, there is no more than one pair of each size.

The shop has m customers who came at the same time. The customer number i has di money and the size of his feet equals li. The customer number i can buy the pair number j, if cj ≤ di, and also if li = sj or li = sj - 1; that is, it is necessary that he has enough money to pay for the shoes. It is also necessary that the size of his feet equals to or is less by 1 than the size of the shoes he chooses.

Your task is to sell some customers pairs of shoes (a pair per person) so as to maximize the sum of the sold pairs cj that is, the profit. It is guaranteed that each customer buys no more than one pair and each pair will be bought by no more than one customer.

Input

The first input line contains the only integer n (1 ≤ n ≤ 105) — the number of shoe pairs in the warehouse. Then n lines contain the descriptions of pairs of shoes as two integers ci and si (1 ≤ ci, si ≤ 109), the numbers are separated by a space. It is guaranteed that all numbers si are different.

The next line contains an integer m (1 ≤ m ≤ 105) — the number of customers in the shop. Next m lines contain the customers' descriptions as two integers di and li (1 ≤ di, li ≤ 109), the numbers are separated by a space.

Output

In the first line print the only integer — the maximum profit you can get from selling shoes. In the second line print an integer k — the number of shoe pairs you will sell. In the following k lines print the descriptions of the sold pairs — two space-separated integers where the first number is the customer's number and the second number is the number of the shoes the customer will buy.

You can print pairs of numbers "the customer's number and the shoes' number" in any order, the customers and the pairs of shoes are numbered starting from 1 in the order in which they are given in the input. If there are several optimal answers, you are allowed to print any of them.

Please do not use the %lld specificator to read or write 64-bit numbers in С++. It is preferred to use the cincout streams or the %I64d specificator instead.

Sample test(s)
input
310 130 220 3220 120 2
output
3022 31 1
input
310 420 530 6270 450 5
output
5022 31 2
/*一失足成千古恨啊~少写了一个等号,调了一个晚上。。。比赛的时候自动给自己加条件限制啊,自己把题目给想难了,赛后听完思路后恍然大悟,不过大悟之后,依然发现,代码实现并不简单啊(我是菜鸟。。。。)首先,每一双鞋最多只能对应两个人选,也就是说,有三种情况第一种是在一双鞋对应两个人的情况下,这双鞋也同时作为唯一选择对应另一个人,所以,优先把鞋给唯一对应的人,然后进行相应的分配 第二种是有两个人同时对应了相同的两双鞋所以,一人对应一双鞋,主要注意分配后的前后选择 第三种是连续的人都对应两双鞋所以,剔除最小的那双鞋,然后一一对应 */#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<vector>#include<cstring>#include<string>#include<queue>using namespace std;#define maxn 1000000#define INF 1000000000struct in{int s,c,num;}shoes[maxn];long long sum=0,k=0;//主要sum可能暴int struct xx {int d,l,num;}people[maxn];struct yy{int a,b;}final[maxn];int cmp (in a,in b){return a.s<b.s;}int cmp1(xx a,xx b){return a.l<b.l;}int one[maxn],two[maxn][2];bool test1(int l,int r){for(int i=l;i<=r;i++){if(one[i])//如果有一双鞋是唯一对应 {   for(int j=l;j<i;j++)   {                 final[k].a=two[j+1][0];  final[k++].b=shoes[j].num;  sum+=shoes[j].c;        }   final[k].a=one[i];        final[k++].b=shoes[i].num;        sum+=shoes[i].c;        for(int j=i+1;j<=r;j++)        {                 final[k].a=two[j][0];  final[k++].b=shoes[j].num;  sum+=shoes[j].c;           }return true;}}return false;}bool test2(int l,int r){for(int i=l+1;i<=r;i++){if(two[i][0] && two[i][1])//如果有两双鞋被两个人对应 {for(int j=l;j<i-1;j++){  final[k].a=two[j+1][0];  final[k++].b=shoes[j].num;  sum+=shoes[j].c;}              final[k].a=two[i][0];    final[k++].b=shoes[i-1].num;    sum+=shoes[i-1].c;    final[k].a=two[i][1];    final[k++].b=shoes[i].num;    sum+=shoes[i].c;    for(int j=i+1;j<=r;j++)    {  final[k].a=two[j][0];  final[k++].b=shoes[j].num;  sum+=shoes[j].c;    }    return true;}}return false;}int main(){int n,m;while(cin>>n){for(int i=0;i<n;i++){scanf("%d%d",&shoes[i].c,&shoes[i].s);shoes[i].num=i+1;}scanf("%d",&m);for(int i=0;i<m;i++){scanf("%d%d",&people[i].d,&people[i].l);people[i].num=i+1;}sort(shoes,shoes+n,cmp);//从小到大的排序 sort(people,people+m,cmp1);memset(one,0,sizeof(one));memset(two,0,sizeof(two));sum=0,k=0;int i,j;for(i=0,j=0;i<n&&j<m;){if(shoes[i].s<people[j].l){i++;}else if(shoes[i].s==people[j].l && i+1<n && shoes[i+1].s==people[j].l+1){if(shoes[i].c<=people[j].d && shoes[i+1].c<=people[j].d){if(two[i+1][0]==0){two[i+1][0]=people[j].num;}else{two[i+1][1]=people[j].num;}}else if(shoes[i].c<=people[j].d){one[i]=people[j].num;}else if(shoes[i+1].c<=people[j].d){one[i+1]=people[j].num;}j++;}else if(shoes[i].s==people[j].l||shoes[i].s==people[j].l+1){if(people[j].d>=shoes[i].c){one[i]=people[j].num;}j++;}elsej++;}i=0;while(i<n){int l,r;l=i;for(r=i+1;r<n && two[r][0];r++);r--;i=r+1;if(l==r){if(one[l]){final[k].a=one[l];final[k++].b=shoes[l].num;sum+=shoes[l].c;}}else{if(!test1(l,r)){if(!test2(l,r)){int minx=INF+1,id;for(int j=l;j<=r;j++){if(minx>shoes[j].c){minx=shoes[j].c;//选出最小的,剔除后进行挑选 id=j;}}for(int j=l;j<id;j++){final[k].a=two[j+1][0];final[k++].b=shoes[j].num;sum+=shoes[j].c;}for(int j=id+1;j<=r;j++){final[k].a=two[j][0];final[k++].b=shoes[j].num;sum+=shoes[j].c;}}}}}cout<<sum<<endl;cout<<k<<endl;for(int i=0;i<k;i++){printf("%d %d\n",final[i].a,final[i].b);}}return 0;}


原创粉丝点击