Problem Description
给你n个人,每个人都有一个彩票,每个彩票有3个号码,一共会开m次奖,每次开奖会会随机开出两个随机位置的号码,如果有一张彩票和开奖的彩票在相同位置上的号码是一样的,那么被视为中奖,不管其他位置的数字是多少。求中奖次数最多的人,如果中奖次数一样多的人有多个,取编号最小的人。
Input
第一行输入n,m(1<= n,m <=2e5 )
下面 n 行,每行3个数字ai,bi,ci(1<=ai,bi,ci<=1e9)表示第i个人,编号从1开始。三个位置的号码。
下面 m 行,每行四个数字aj,bj,cj,dj,(1<=aj,cj<=3,1<=bj,dj<=1e9)第一个号码数的位置,彩票号码数,第二个号码数的位置,彩票号码数。
Output
输出一个整数为中奖次数最多的人的号码数,如果有多个最多中奖次数相同的人,输出编号最小的。
Sample Input
2 2
1 1 1
1 1 2
1 1 2 1
2 1 3 2
Sample Output
2
Hint
如果某次开奖是2 1 3 2,那么所有号码为(x,1,2)(x可以是任何数),都被视为中奖。
正常的map是里面两个变量比如map<int, string> ma。 如何存好几个,比如
map< pair<int, int>, int> ma1;
或者
struct node{ int x, int y};
map<node, string> ma2;
还有我之前博客提到的map<int, map<int, int>空格> ma3;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[200005], b[200005], c[200005];
int main()
{
map<pair<int, int>, int> ma12;
map<pair<int, int>, int> ma13;
map<pair<int, int>, int> ma23;
int m, n;
cin >> n >> m;
for(int i = 1; i <= n; i++)
scanf("%d %d %d",&a[i], &b[i], &c[i]);
int ai, bi, ci, di;
pair<int, int> p1;
while(m--)
{
scanf("%d %d %d %d", &ai, &bi, &ci, &di);
if(ai > ci)
{
swap(ai, ci);
swap(bi, di);
}
if(ai == 1 && ci == 2)
{
p1 = make_pair(bi, di);
ma12[p1]++;
}
else if(ai == 1 && ci == 3)
{
p1 = make_pair(bi, di);
ma13[p1]++;
}
else if(ai == 2 && ci == 3)
{
p1 = make_pair(bi, di);
ma23[p1]++;
}
}
int k = 0;
int max = -1;
pair<int, int> p2;
pair<int, int> p3;
for(int i = 1; i <= n; i++)
{
p1 = make_pair(a[i], b[i]);
p2 = make_pair(a[i], c[i]);
p3 = make_pair(b[i], c[i]);
if(ma12[p1] + ma13[p2] + ma23[p3] > max)
{ 如果没有一个人中奖,都是零次,就输出序列最小的也就是1。i=1时就让k=1了。
max = ma12[p1] + ma13[p2] + ma23[p3];
k = i;
}
}
cout << k << endl;
return 0;
}
给个ma3的用法代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[200005], b[200005], c[200005];
int main()
{
map<int, map<int, int> > ma12;
map<int, map<int, int> > ma13;
map<int, map<int, int> > ma23;
int m, n;
cin >> n >> m;
for(int i = 1; i <= n; i++)
scanf("%d %d %d",&a[i], &b[i], &c[i]);
int ai, bi, ci, di;
pair<int, int> p1;
while(m--)
{
scanf("%d %d %d %d", &ai, &bi, &ci, &di);
if(ai > ci)
{
swap(ai, ci);
swap(bi, di);
}
if(ai == 1 && ci == 2)
{
ma12[bi][di]++;
}
else if(ai == 1 && ci == 3)
{
ma13[bi][di]++;
}
else if(ai == 2 && ci == 3)
{
ma23[bi][di]++;
}
}
int k = 0;
int max = -1;
for(int i = 1; i <= n; i++)
{
if(ma12[a[i]][b[i]] + ma13[a[i]][c[i]] + ma23[b[i]][c[i]] > max)
{
max = ma12[a[i]][b[i]] + ma13[a[i]][c[i]] + ma23[b[i]][c[i]];
k = i;
}
}
cout << k << endl;
return 0;
}