C.三角形(思考+貪欲+暴力的な列挙)

https://codeforces.com/problemset/problem/1453/C


アイデア:

1つのエッジが平行であることを確認してから、このエッジを列挙します。

最初のアイデアは、列挙型O(10 * 2000 * 2000)が到達したポイントをkに列挙し、次に行を右に、行を左に、列を上に、列を次のように前処理することです。下。kの位置、そして答えを取り出すと、それは確かに行うことができます。しかし、コードの量は少し面倒で、考えるのが簡潔ではありません。

最後に、貪欲な構築方法で変更点を処理し、最初に番号kの一番上の行の位置、一番下の行の位置、左端の行の位置、右端の行の位置を事前に処理し、次にO(2000 * 2000)列挙を処理します。列挙されたk、4つの方向のそれぞれについて彼に最大値をとらせます。これが例です。

3行目に2があります。最も値が大きいのは、下の最も遠い2行と3行目の差から導き出されます。次に、質問には並列処理が必要です。以下が並列であるかどうかに関係なく、変更されたポイントをスローします。ここで、左端または右端の行が最適であり、条件を満たす必要があります。そうすると、O(2000 * 2000)がスキャンされます。(10個の定数が欠落していることさえあります)

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e3+100;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL maxx[maxn],minx[maxn],maxy[maxn],miny[maxn];
LL a[maxn][maxn];
char s[maxn][maxn];
LL ans[20];
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL T;cin>>T;
  while(T--){
    LL n;cin>>n;
    for(LL i=0;i<n+10;i++) maxx[i]=0,minx[i]=n,maxy[i]=0,miny[i]=n;
    for(LL i=0;i<20;i++) ans[i]=0;
    for(LL i=1;i<=n;i++){
        for(LL j=1;j<=n;j++) cin>>s[i][j];
    }
    for(LL i=1;i<=n;i++){
        for(LL j=1;j<=n;j++) a[i][j]=(s[i][j]-'0');
    }
    for(LL i=1;i<=n;i++){
        for(LL j=1;j<=n;j++){
            LL t=a[i][j];
            maxx[t]=max(maxx[t],i);
            minx[t]=min(minx[t],i);
            maxy[t]=max(maxy[t],j);
            miny[t]=min(miny[t],j);
        }
    }
    for(LL i=1;i<=n;i++){
        for(LL j=1;j<=n;j++){
            LL t=a[i][j];
            ans[t]=max(ans[t],abs(maxx[t]-i)*max(n-j,j-1) );
            ans[t]=max(ans[t],abs(i-minx[t])*max(n-j,j-1) );
            ans[t]=max(ans[t],abs(maxy[t]-j)*max(n-i,i-1) );
            ans[t]=max(ans[t],abs(miny[t]-j)*max(n-i,i-1) );
        }
    }
    for(LL i=0;i<10;i++){
        cout<<ans[i]<<" ";
    }
    cout<<"\n";
  }
return 0;
}

 

おすすめ

転載: blog.csdn.net/zstuyyyyccccbbbb/article/details/114902152