luogu P1311セレクトインの説明

\(luogu \) P1311セレクトインの説明

トピックリンク

この質問は、最初の数論や数学の知識はそれのことを確認し、その後、私は、暴力と呼ばれる解答権を見つけなければどのような統計プログラムを見て、見て損です。だから私は、サンプルの説明を見ての統計プログラムの数だけ、パイプソリューションカフェの数を必要としないインプログラムを選択する必要があることがわかりました。その後成功しました、支払う、変更するように変更\(60 \)それは10分以上かかりました

#include<iostream>
#include<climits>
#include<cstdio>
#define ll long long
using namespace std;
const int N=1e3+100;
int n,k,p;
int color[N],cost[N];
int minn[N][N];
ll ans;
inline void pre()
{
    for (int i=1;i<=n;i++)
    {
        int minx=INT_MAX;
        for (int j=i;j<=n;j++)
        {
            minx=min(minx,cost[j]);
            minn[i][j]=minx;
        }
    }
    return ;
}
int main()
{
    scanf("%d%d%d",&n,&k,&p);
    for (int i=1;i<=n;i++)
    scanf("%d%d",color+i,cost+i);
    pre();
    for (int i=1;i<=n;i++)
    for (int j=i+1;j<=n;j++)
    if (color[i]==color[j]&&minn[i][j]<=p)
    ans++;
    printf("%lld\n",ans);
    return 0;
}

レッスン:ヘッダファイルを見ているいくつかの関数や変数を書き込み、またはユニバーサルヘッドを使用して簡単に

質問の意味が発見された場合、この質問はのために、比較的簡単です\([L、R] \ ) のみの最小間隔は、それを満たすためにかどうかを確認する必要があります。次に考える\(ST \)テーブル、実際には、すべての固定のための\(Lの\)、\ (R \)正当である場合に、単調である\([L、R] \ ) 正規、(\ [L、[R、N] ] \) また、正当でなければなりません。だから我々は、2つの最小分離することができます\(rは\) その後、接尾辞または接頭辞とメンテナンス使用([R、N] \ \を ) どのように多くの合法的なソリューションの合計を、蓄積が答えです。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+100;
int f[21][N],color[N],sum[N][52];
int n,k,p;
ll ans;
inline void RMQ()
{
    for (int j=1;(1<<j)<=n;j++)
    for (int i=1;i+(1<<j)-1<=n;i++)
    f[j][i]=min(f[j-1][i],f[j-1][i+(1<<(j-1))]);
    return ;
}
inline int query(int l,int r)
{
    int k=log2(r-l+1);
    return min(f[k][l],f[k][r-(1<<k)+1]);
}
inline int midfind(int x)
{
    int l=x+1,r=n,mid=(l+r)>>1,ans=n+1;
    while (l<=r)
    {
        if (query(x,mid)<=p)
        {
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
        mid=(l+r)>>1;
    }
    return ans;
}
int main()
{
    scanf("%d%d%d",&n,&k,&p);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&color[i],&f[0][i]);
        color[i]++;
        for (int j=1;j<=51;j++)
        if (j==color[i]) sum[i][j]=sum[i-1][j]+1;
        else sum[i][j]=sum[i-1][j];
    }
    RMQ();
    for (int i=1;i<=n-1;i++)
    {
        int now=midfind(i)-1;
        ans+=sum[n][color[i]]-sum[now][color[i]];
    }
    printf("%lld\n",ans);
    return 0;
}

レッスン:半分が始まる([L、R]を\ \ ) 良い、判断しなければならない\(ANS \)実用的な意義が決定されるべきで、割り当てを有する第二\(R \)と合法的溶液無し\(ANS \)割り当て適切に処理します。

おすすめ

転載: www.cnblogs.com/last-diary/p/11454811.html