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:
%d
",ii,ans);
67     }
68 }
原文地址:https://www.cnblogs.com/fzmh/p/5540271.html