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 }

浙公网安备 33010602011771号