洛谷 P1578 奶牛浴场

https://www.luogu.org/problemnew/show/P1578

题解

另外这题有一些小坑,洛谷的题解里面有讲

 1 #pragma GCC optimize("Ofast")
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<vector>
 6 using namespace std;
 7 #define fi first
 8 #define se second
 9 #define mp make_pair
10 #define pb push_back
11 typedef long long ll;
12 typedef unsigned long long ull;
13 struct pii
14 {
15     int fi,se;
16 };
17 bool operator<(const pii &a,const pii &b)
18 {
19     return a.fi<b.fi;
20 }
21 int L,W,n;
22 pii p[100100];
23 bool c1(const pii &a,const pii &b)
24 {
25     return a.se<b.se;
26 }
27 int ans;
28 int main()
29 {
30     int i,j,t1,t2,t;
31     scanf("%d%d%d",&L,&W,&n);
32     for(i=1;i<=n;++i)
33     {
34         scanf("%d%d",&p[i].fi,&p[i].se);
35     }
36     p[++n].fi=0;p[n].se=0;
37     p[++n].fi=L;p[n].se=W;
38     p[++n].fi=0;p[n].se=W;
39     p[++n].fi=L;p[n].se=0;
40     sort(p+1,p+n+1,c1);
41     for(i=1;i<=n;++i)
42     {
43         t1=0;t2=L;
44         //printf("1t%d %d %d\n",i,p[i].fi,p[i].se);
45         for(j=i+1;j<=n&&p[j].se==p[i].se;++j);
46         for(;j<=n;)
47         {
48             ans=max(ans,(t2-t1)*(p[j].se-p[i].se));
49             //printf("at%d %d %d %d\n",t2,t1,p[j].se,p[i].se);
50             t=p[j].se;
51             while(j<=n&&p[j].se==t)
52             {
53                 //t1=max(t1,p[j].fi);
54                 //t2=min(t2,p[j].fi);
55                 if(p[j].fi>p[i].fi)    t2=min(t2,p[j].fi);
56                 else    t1=max(t1,p[j].fi);
57                 ++j;
58             }
59             //printf("2t%d %d %d %d\n",i,j,t1,t2);
60         }
61     }
62     for(i=n;i>=1;--i)
63     {
64         t1=0;t2=L;
65         for(j=i-1;j>=1&&p[j].se==p[i].se;--j);
66         for(;j>=1;)
67         {
68             ans=max(ans,(t2-t1)*(p[j].se-p[i].se));
69             //printf("bt%d %d %d %d\n",t2,t1,p[j].se,p[i].se);
70             t=p[j].se;
71             while(j>=1&&p[j].se==t)
72             {
73                 if(p[j].fi>p[i].fi)    t2=min(t2,p[j].fi);
74                 else    t1=max(t1,p[j].fi);
75                 --j;
76             }
77         }
78     }
79     sort(p+1,p+n+1);
80     for(i=2;i<=n;++i)
81         ans=max(ans,W*(p[i].fi-p[i-1].fi));
82     printf("%d",ans);
83     return 0;
84 }
View Code

 

posted @ 2018-10-26 19:41  hehe_54321  阅读(237)  评论(0编辑  收藏  举报
AmazingCounters.com