比赛 |
20121009 |
评测结果 |
TWWTT |
题目名称 |
木棍 |
最终得分 |
0 |
用户昵称 |
万里长城 |
运行时间 |
3.507 s |
代码语言 |
C++ |
内存使用 |
3.53 MiB |
提交时间 |
2012-10-09 21:20:51 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define clr(x, n) memset(x, n, sizeof(x))
#define maxn 50004
using namespace std;
void setIO(string name) {
string in_f = name + ".in";
string out_f = name + ".out";
freopen(in_f.c_str(), "r", stdin);
freopen(out_f.c_str(), "w", stdout);
}
struct wood {
int l, w;
};
int n;
int len, ans,pos;
vector<wood> w;
int dad[maxn], lis[maxn];
void init() {
scanf("%d", &n);
wood w0;
rep(i, n) {
scanf("%d%d", &w0.l, &w0.w);
w.push_back(w0);
}
ans = 0;
}
void update() {
clr(dad, -1);
clr(lis, 0);
len = pos = 0;
}
void calc() {
rep(i, w.size()) {
lis[i] = 1;
rep(j, i) {
if (w[j].l <= w[i].l && w[j].w <= w[i].w && lis[j] + 1 > lis[i]) {
dad[i] = j;
lis[i] = lis[j] + 1;
}
}
if (len < lis[i]) {
len = lis[i];
pos = i;
}
}
}
void del() {
while(dad[pos] != -1) {
w.erase(w.begin() + pos);
pos = dad[pos];
}
w.erase(w.begin() + pos);
}
bool cmp(wood x, wood y) {
if (x.l < y.l) return true;
if (x.l > y.l) return false;
if (x.w < y.w) return true;
return false;
}
void solve() {
sort(w.begin(), w.end(), cmp);
while(!w.empty()) {
update();
calc();
del();
ans++;
}
printf("%d\n", ans);
}
int main() {
setIO("wooden");
init();
solve();
return 0;
}