結果
| 問題 |
No.479 頂点は要らない
|
| ユーザー |
startcpp
|
| 提出日時 | 2017-01-29 17:09:25 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 108 ms / 1,500 ms |
| コード長 | 1,252 bytes |
| コンパイル時間 | 685 ms |
| コンパイル使用メモリ | 63,168 KB |
| 実行使用メモリ | 10,112 KB |
| 最終ジャッジ日時 | 2024-12-23 23:11:39 |
| 合計ジャッジ時間 | 3,459 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int depth = 17;
const int INF = 114514;
class Segtree {
int data[1 << (depth + 1)];
public:
Segtree() {
for (int i = 0; i < (1 << (depth + 1)); i++) { data[i] = -INF; }
}
void update(int pos, int x) {
pos += (1 << depth) - 1;
data[pos] = x;
while (pos > 0) {
pos = (pos - 1) / 2;
data[pos] = max(data[pos * 2 + 1], data[pos * 2 + 2]);
}
}
int getMax() {
return data[0];
}
int getNum(int pos) {
return data[pos + (1 << depth) - 1];
}
};
Segtree seg;
vector<int> eid[100000]; //eid[i] = 頂点iにくっついている辺の番号
int main() {
int n, m, i, a, b;
cin >> n >> m;
for (i = 0; i < m; i++) {
cin >> a >> b;
seg.update(i, a); //辺iを消すにはa番以上の頂点を消す必要がある
eid[a].push_back(i);
eid[b].push_back(i);
}
static bool used[100000] = {false};
while (true) {
int id = seg.getMax();
if (id < 0) break;
//頂点idを消す
for (i = 0; i < eid[id].size(); i++) {
seg.update(eid[id][i], -INF);
}
used[id] = true;
}
for (i = n - 1; i >= 0; i--) if (used[i]) break;
for (; i >= 0; i--) cout << used[i];
cout << endl;
return 0;
}
//最近バグが多くてつらみ
startcpp