求助!跟1578一样的做法

P4147 玉蟾宫

过样例后,从10分到0分 ```cpp #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();} return s*w; } struct cow{ int x,y; }a[1000001]; bool cmp1(cow b,cow c){ return b.x<c.x; } bool cmp2(cow b,cow c){ return b.y<c.y; } int main(){ int ans=0,n=0,cnt=0; int L=read();int W=read(); for(int i=1;i<=L;i++) for(int j=1;j<=W;j++){ char ch;cin>>ch; if(ch=='R')a[++n].x=i,a[n].y=j,cnt++; } if(cnt==L*W){ printf("0\n"); } a[++n].x=0;a[n].y=0; a[++n].x=L;a[n].y=0; a[++n].x=0;a[n].y=W; a[++n].x=L;a[n].y=W; sort(a+1,a+n+1,cmp1); for(int i=1;i<=n;i++){ int up=W,down=0,wid=L-a[i].x; for(int j=i+1;j<=n;j++){ if(ans>=wid*(up-down))break; ans=max(ans,(up-down)*(a[j].x-a[i].x)); if(a[i].y==a[j].y)break; if(a[j].y>a[i].y)up=min(up,a[j].y); if(a[j].y<a[i].y)down=max(down,a[j].y); } up=W,down=0,wid=a[i].x; for(int j=i-1;j>=1;j--){ if(ans>=wid*(up-down))break; ans=max(ans,(up-down)*(a[i].x-a[j].x)); if(a[i].y==a[j].y)break; if(a[j].y>a[i].y)up=min(up,a[j].y); if(a[j].y<a[i].y)down=max(down,a[j].y); } } sort(a+1,a+n+1,cmp2); for(int i=1;i<=n-1;i++){ ans=max(ans,(a[i+1].y-a[i].y)*L); } printf("%d\n",ans*3); return 0; } ```
by PPXppx @ 2018-12-15 10:21:49


@[PPXppx](/user/112164) 1578最多有5000个障碍点,而这个题最多有10^6个障碍点,因此可以卡到10^12,不能通过本题
by Mingxuan @ 2022-08-01 00:19:52


|