大会
ゲームT1は、自動閉鎖に従事しているため⑧、と言います。
少し圧力のようなん性急な脳は、太いロールません。
問題の解決策
実際には、この問題は本当に非常に簡単です。
まず、タイトルは特に特別な一定の間隔になります。
だから、任意の間隔が含まれていないいくつかの間隔がなければなりません。(バナナ)交差点ではありません
、我々はのコレクションに、これらの間隔を実施しています。
他のセクションでは、コレクションの少なくとも一部が含まれている必要がありますが。
別のセットbにこれらの間隔。
その後、我々はいくつかの小さな自然を見つけることができます-
1を、我々はそれがちょうど> 0の作業時間ができることを確実にするために、いくつかの行にランダムな間隔のコレクションを置くことができました。
図2に示すように、第二に、各Bは、それが新たなコレクションに、単独で寄与しない、の範囲が含まれている区間を設定したり、アセンブリに挿入され、自費を生成しました。
だから我々は、別々に行うことができます。
まず、設定\(F _ {[I] [j]を} \) i番目、j番目のパイプラインの最大値に現在の収集間隔の前を表します。
明らかに転送します。\(O(N ^ 3) \)
そして、残りはBの集まりに参加して自由です。
私たちは、あなたができる、最大の直接Bの範囲の一部を削除しました。
標準プロセス
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
const int maxn=210;
int n,m,ga,gb,ans;
int x[maxn],y[maxn],ax[maxn],ay[maxn],bx[maxn],by[maxn];
int f[maxn][maxn],sum[maxn];
bool bz[maxn];
void qsortb(int l,int r)
{
int i=l;int j=r;
int m=by[(i+j)/2]-bx[(i+j)/2]+1;
while (i<=j)
{
while (by[i]-bx[i]+1>m) i++;
while (by[j]-bx[j]+1<m) j--;
if (i<=j)
{
swap(bx[i],bx[j]);
swap(by[i],by[j]);
i++;j--;
}
}
if (l<j) qsortb(l,j);
if (r>i) qsortb(i,r);
}
void qsorta(int l,int r)
{
int i=l;int j=r;
int m=ax[(i+j)/2];
int m1=ay[(i+j)/2];
while (i<=j)
{
while ((ax[i]<m) || (ax[i]==m && ay[i]<m1)) i++;
while ((ax[j]>m) || (ax[j]==m && ay[j]>m1)) j--;
if (i<=j)
{
swap(ax[i],ax[j]);
swap(ay[i],ay[j]);
i++;j--;
}
}
if (l<j) qsorta(l,j);
if (r>i) qsorta(i,r);
}
int main()
{
freopen("factory.in","r",stdin);
freopen("factory.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);y[i]--;
}
memset(bz,false,sizeof(bz));
for (int i=1;i<=n;i++)
{
bool pd=true;
for (int j=1;j<=n;j++)
{
if (j!=i)
{
if (!bz[j] && x[i]<=x[j] && y[j]<=y[i])
{
pd=false;
break;
}
}
}
if (pd==true)
{
ga++;
ax[ga]=x[i];
ay[ga]=y[i];
}
else
{
gb++;
bx[gb]=x[i];
by[gb]=y[i];
bz[i]=true;
}
}
qsorta(1,ga);
memset(f,128,sizeof(f));
f[0][0]=0;
for (int i=0;i<=ga;i++)
{
for (int k=0;k<=min(i,m);k++)
{
for (int j=i+1;j<=ga;j++)
{
if (f[i][k]>=0)
if (ay[i+1]-ax[j]+1>0)
{
f[j][k+1]=max(f[j][k+1],f[i][k]+ay[i+1]-ax[j]+1);
}
}
}
}
qsortb(1,gb);
for (int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+by[i]-bx[i]+1;
}
for (int i=0;i<=m;i++)
{
ans=max(ans,f[ga][m-i]+sum[i]);
}
printf("%d\n",ans);
}