AtCoder Beginner Contest 176 E - Bomber ###K ###K //K

题目链接:https://atcoder.jp/contests/abc176/tasks/abc176_e

题意:一些坐标上有目标物,放一个炸弹可以炸毁这一行和这一列上的目标物 问能炸到最多的目标物为多少

先找出 每一行和每一列的最大值 ,找出最大值的行有多少,最大值的列有多少

答案是max1+max2 或者max1+max2-1  取决于最大的行和列是否会存在交点

那么每一个每一个目标物的坐标就可以 知道有多少个交点, 如果所有的最大行和列都交的话 最多的交点是 sum1*sum2 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=3e5+10;
 4 const int mod=998244353;
 5 #define ll long long
 6 #define pb push_back
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 int xx[maxn],yy[maxn];
11 pi p[maxn];
12 
13 
14 int main()
15 {
16     ios::sync_with_stdio(0);
17     cin.tie(0);
18     int n,m,k;
19     cin>>n>>m>>k;
20     int max1=0,max2=0;
21     for(int i=0;i<k;i++)
22     {
23         int x,y;
24         cin>>x>>y;
25         p[i]={x,y};
26         xx[x]++,yy[y]++;
27         max1=max(max1,xx[x]);
28         max2=max(max2,yy[y]);
29     }
30     int cnt=0;
31     for(int i=0;i<k;i++)
32     {
33         int x=p[i].fi,y=p[i].sc;
34         if(xx[x]==max1&&yy[y]==max2) cnt++;
35     }
36     int sum1=0,sum2=0;
37     for(int i=1;i<=n;i++)
38         if(xx[i]==max1)
39             sum1++;
40     for(int i=1;i<=m;i++)
41         if(yy[i]==max2)
42             sum2++;
43     if(sum1*sum2==cnt) cout<<max1+max2-1<<'\n';
44     else cout<<max1+max2<<'\n';
45 
46 
47 }
View Code

 

posted @ 2021-01-29 11:26  canwinfor  阅读(104)  评论(0)    收藏  举报