摘要
题意
平面上n个点,最少用几条平行或垂直于x轴的直线才可以全部覆盖。(注意:要求全部同向,第一次交没看到- -)
题解
代码
390A.cpp代码已折叠
展开折叠内容
|
- #include<cstdio>
- #include<iostream>
- #include<string>
- #include<vector>
- #include<iomanip>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<bitset>
- #include<set>
- #include<sstream>
- #include<utility>
- using namespace std;
- //数据类型//
- #define llu unsigned long long
- #define lld long long
- //定义默认类型//
- typedef lld num;
- #define dsi(n) num n;scanf("%lld",&n)
- #define si(n) scanf("%lld",&n)
- //其它//
- #define reset(x) memset(x,0,sizeof(x))
- #define ci const num&
- #define sqr(x) ((x)*(x))
- #define f(i,n) for(num i=1;i<=n;++i)
- #define ff(i,r,n) for(num i=r;i<=n;++i)
- #define fi(n) f(i,n)
- #define f0(i,n) for(num i=0;i!=n;++i)
- #define fd(i,n) for(num i=n;i>=1;--i)
- #define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
- #define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
- #define iforeach(i,s) int idx=0;for(typeof(s.begin()) i=s.begin();i!=s.end();++i,++idx)
- #define Vector2 pair<num,num>
- #define vector2(x,y) make_pair(x,y)
- #define x first
- #define y second
- num a1[101][101]={},pointNum1=0,a2[101][101]={},pointNum2=0,
- xPNum[101]={},yPNum[101]={},xANum[101]={},yANum[101]={},
- xP[101][30010]={},yP[101][30010]={};
- void init()
- {
- reset(xPNum);
- reset(yPNum);
- reset(xANum);
- reset(yANum);
- f0(i,101)f0(j,101)
- {
- if(!a2[i][j])continue;
- xP[i][++xPNum[i]]=j;
- yP[j][++yPNum[j]]=i;
- xANum[i]+=a2[i][j];
- yANum[j]+=a2[i][j];
- }
- }
- num getX()
- {
- num c=0;
- while(1)
- {
- ++c;
- Vector2 ans=vector2(0,0);
- f0(i,101)
- ans=max(ans,vector2(xPNum[i],i));
- num tx=ans.y;
- fi(xPNum[tx])
- {
- num ty=xP[tx][i];
- yPNum[ty]--;
- yANum[ty]-=a1[tx][ty];
- a1[tx][ty]=0;
- }
- pointNum1-=xANum[tx];
- xPNum[tx]=xANum[tx]=0;
- if(!pointNum1)
- {
- return c;
- }
- }
- }
- num getY()
- {
- num c=0;
- while(1)
- {
- ++c;
- Vector2 ans=vector2(0,0);
- f0(i,101)
- ans=max(ans,vector2(yPNum[i],i));
- num ty=ans.y;
- fi(xPNum[ty])
- {
- num tx=yP[ty][i];
- xPNum[tx]--;
- xANum[tx]-=a2[tx][ty];
- a2[tx][ty]=0;
- }
- pointNum2-=yANum[ty];
- yPNum[ty]=yANum[ty]=0;
- if(!pointNum2)
- {
- return c;
- }
- }
- }
- int main()
- {
- dsi(n);
- fi(n)
- {
- dsi(x);dsi(y);
- ++a1[x][y];
- ++a2[x][y];
- ++pointNum1;
- ++pointNum2;
- }
- init();
- num ans1=getX();
- init();
- num ans2=getY();
- cout<<min(ans1,ans2);
- return 0;
- }
|