hdu5714 拍照[2016百度之星复赛C题]
由于船移动的速度都一样,那么对于往一个方向的船相对距离其实是不变的,我们可以把往一个方向移动的船都视作静止,并求出在哪些观测位置可以看到,很明显对于船[x,y,z],当x+z>=y-z的时候,可以在[y-z,x+z]这些位置观测到它,这些位置的观测数全都+1,然后考虑不同方向,假设初始在x位置观测往右的船,在y位置观测到往左的船,只要x<=y,则经过一段时间的移动,必然存在一个位置可以同时观测到x位置和y位置能观测到的船。复杂度O(nlogn)。
代码
1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4 #include<map> 5 #define mp make_pair 6 #define pb push_back 7 #define fi first 8 #define sc second 9 using namespace std; 10 const int N = 110100; 11 const int M = 101010; 12 int test,a,b,c,d,i,f1[N],f2[N],g1[N],g2[N],n,s1[N],s2[N],tmp,ans,ii,tot; 13 int cnt1,cnt2,tt,ttt,vv[N]; 14 struct g{ 15 int l,r,id; 16 }v[N]; 17 map<int,int> ma; 18 int main() 19 { 20 scanf("%d",&test); 21 while (test--) 22 { 23 scanf("%d",&n); 24 tt=0;ttt=0;ma.clear();tot=0; 25 for (i=1;i<=n;i++) 26 { 27 scanf("%d%d%d%d",&a,&b,&c,&d); 28 if (a+c>=b-c) 29 { 30 tot++; 31 v[tot].l=b-c; 32 v[tot].r=a+c; 33 v[tot].id=d; 34 vv[++tt]=b-c; 35 vv[++tt]=a+c; 36 } 37 } 38 sort(vv+1,vv+1+tt); 39 for (i=1;i<=tt;i++) 40 if (ma[vv[i]]==0) ma[vv[i]]=++ttt; 41 for (i=1;i<=tot;i++) 42 if (v[i].id==1) 43 { 44 f1[ma[v[i].l]]++; 45 g1[ma[v[i].r]]--; 46 } 47 else 48 { 49 f2[ma[v[i].l]]++; 50 g2[ma[v[i].r]]--; 51 } 52 tmp=ans=cnt1=cnt2=0; 53 for (i=1;i<=ttt;i++) 54 { 55 cnt1+=f1[i]; 56 s1[i]=cnt1; 57 cnt1+=g1[i]; 58 cnt2+=f2[i]; 59 s2[i]=cnt2; 60 cnt2+=g2[i]; 61 if (s1[i]>tmp) tmp=s1[i]; 62 ans=max(ans,tmp+s2[i]); 63 f1[i]=f2[i]=g1[i]=g2[i]=0; 64 } 65 ii++; 66 printf("Case #%d:\n%d\n",ii,ans); 67 } 68 }