洛谷 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 }