結果
| 問題 |
No.686 Uncertain LIS
|
| コンテスト | |
| ユーザー |
kriii
|
| 提出日時 | 2018-12-09 00:25:26 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,707 bytes |
| コンパイル時間 | 405 ms |
| コンパイル使用メモリ | 44,600 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-30 22:31:57 |
| 合計ジャッジ時間 | 4,049 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 34 WA * 2 |
ソースコード
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxs = 400;
int c,g[1010][maxs*2+1],l[1010],s[1010],p[1010],r[100010];
void just()
{
int n = 0;
for (int i=0;i<c;i++){
for (int j=0;j<s[i];j++){
r[n++] = g[i][j] + p[i];
}
}
c = (n + maxs - 1) / maxs;
for (int i=0;i<c;i++) s[i] = p[i] = 0;
for (int i=0;i<n;i++){
int u = i/maxs, e = i%maxs;
g[u][e] = r[i];
l[u] = r[i];
s[u]++;
}
}
void del(int i, int v)
{
s[i]--;
for (int j=v;j<s[i];j++) g[i][j] = g[i][j+1];
}
void rem(int y)
{
int i = lower_bound(l, l + c, y) - l;
if (i < c){
int v = lower_bound(g[i], g[i] + s[i], y - p[i]) - g[i];
del(i, v);
if (s[i] == 0) just();
else if (s[i] == v) l[i] = g[i][v-1];
}
}
void add(int x, int y)
{
int u = lower_bound(l, l + c, x) - l;
for (int i=u;i<c;i++){
int a = g[i][0] + p[i];
int b = g[i][s[i]-1] + p[i];
if (x <= a && b <= y) p[i]++, l[i]++;
else if (max(x, a) <= min(b, y)){
for (int v=0;v<s[i];v++){
int &w = g[i][v];
w += p[i];
if (x <= w && w <= y) w++;
l[i] = w;
}
p[i] = 0;
}
else break;
}
}
void mak(int i, int v)
{
for (int j=s[i];j>v;j--) g[i][j] = g[i][j-1];
s[i]++;
}
void ins(int x)
{
if (c == 0){
g[0][0] = l[0] = x; s[0] = 1; p[0] = 0; c = 1;
return;
}
int i = lower_bound(l, l + c, x) - l;
if (i == c) i--;
x -= p[i];
int v = lower_bound(g[i], g[i] + s[i], x) - g[i];
mak(i, v);
g[i][v] = x;
if (s[i] == maxs * 2) just();
else if (s[i] == v + 1) l[i] = x + p[i];
}
int main()
{
int N; scanf ("%d",&N); while (N--){
int x,y; scanf ("%d %d",&x,&y);
rem(y);
add(x,y);
ins(x);
}
int ans = 0;
for (int i=0;i<c;i++) ans += s[i];
printf ("%d\n",ans);
return 0;
}
kriii