|
|
@ -2,6 +2,15 @@ |
|
|
|
#include <vector> |
|
|
|
#include <map> |
|
|
|
|
|
|
|
//#define BIGBOY
|
|
|
|
#if defined(BIGBOY) |
|
|
|
#define TOTAL_SPACE 3000000000 |
|
|
|
#define NEEDED_SPACE 700000000 |
|
|
|
#else |
|
|
|
#define TOTAL_SPACE 70000000 |
|
|
|
#define NEEDED_SPACE 30000000 |
|
|
|
#endif |
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
enum FsNodeType { |
|
|
@ -12,13 +21,26 @@ enum FsNodeType { |
|
|
|
struct FsNode { |
|
|
|
FsNodeType type; |
|
|
|
string name; |
|
|
|
unsigned size; |
|
|
|
size_t size; |
|
|
|
}; |
|
|
|
|
|
|
|
struct FsFile : FsNode { |
|
|
|
}; |
|
|
|
|
|
|
|
struct FsDir : FsNode { |
|
|
|
~FsDir() { |
|
|
|
for (auto e : this->entries) { |
|
|
|
FsNode *node = e.second; |
|
|
|
if (node->type == NODE_DIR) { |
|
|
|
FsDir *dir = (FsDir *)node; |
|
|
|
delete dir; |
|
|
|
} else if (node->type == NODE_FILE) { |
|
|
|
FsFile *file = (FsFile *)node; |
|
|
|
delete file; |
|
|
|
} |
|
|
|
} |
|
|
|
this->entries.clear(); |
|
|
|
} |
|
|
|
FsDir *parent; |
|
|
|
map<string, FsNode *> entries; |
|
|
|
}; |
|
|
@ -41,9 +63,9 @@ void print_node(FsNode *node, unsigned depth = 0) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
unsigned calc_size(FsDir &dir) |
|
|
|
size_t calc_size(FsDir &dir) |
|
|
|
{ |
|
|
|
unsigned size = 0; |
|
|
|
size_t size = 0; |
|
|
|
for (auto e : dir.entries) { |
|
|
|
FsNode *node = e.second; |
|
|
|
|
|
|
@ -76,7 +98,7 @@ FsDir parse() |
|
|
|
newdir->parent = dir; |
|
|
|
dir->entries[name] = newdir; |
|
|
|
} else { |
|
|
|
unsigned size = stoi(first); |
|
|
|
size_t size = stoll(first); |
|
|
|
FsFile *newfile = new FsFile; |
|
|
|
newfile->type = NODE_FILE; |
|
|
|
newfile->name = name; |
|
|
@ -110,9 +132,9 @@ FsDir parse() |
|
|
|
return root; |
|
|
|
} |
|
|
|
|
|
|
|
unsigned p1(const FsDir &dir) |
|
|
|
size_t p1(const FsDir &dir) |
|
|
|
{ |
|
|
|
unsigned count = 0; |
|
|
|
size_t count = 0; |
|
|
|
if (dir.size <= 100000) count += dir.size; |
|
|
|
for (auto e : dir.entries) { |
|
|
|
FsNode *node = e.second; |
|
|
@ -121,42 +143,26 @@ unsigned p1(const FsDir &dir) |
|
|
|
return count; |
|
|
|
} |
|
|
|
|
|
|
|
unsigned p2(const FsDir &dir, unsigned target = 0) |
|
|
|
size_t p2(const FsDir &dir, size_t target = 0) |
|
|
|
{ |
|
|
|
if (!target) target = dir.size - 40000000; |
|
|
|
if (!target) target = dir.size - (TOTAL_SPACE - NEEDED_SPACE); |
|
|
|
|
|
|
|
unsigned smallest = 30000000; |
|
|
|
size_t smallest = NEEDED_SPACE; |
|
|
|
if (dir.size >= target && dir.size < smallest) smallest = dir.size; |
|
|
|
|
|
|
|
for (auto e : dir.entries) { |
|
|
|
FsNode *node = e.second; |
|
|
|
if (node->type == NODE_DIR) { |
|
|
|
unsigned size = p2(*(FsDir *)node, target); |
|
|
|
size_t size = p2(*(FsDir *)node, target); |
|
|
|
if (size >= target && size < smallest) smallest = size; |
|
|
|
} |
|
|
|
} |
|
|
|
return smallest; |
|
|
|
} |
|
|
|
|
|
|
|
void free_input(FsDir &dir) |
|
|
|
{ |
|
|
|
for (auto e : dir.entries) { |
|
|
|
FsNode *node = e.second; |
|
|
|
if (node->type == NODE_DIR) { |
|
|
|
FsDir *dir = (FsDir *)node; |
|
|
|
free_input(*dir); |
|
|
|
delete dir; |
|
|
|
} else if (node->type == NODE_FILE) { |
|
|
|
FsFile *file = (FsFile *)node; |
|
|
|
delete file; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int main() |
|
|
|
{ |
|
|
|
auto input = parse(); |
|
|
|
cout << p1(input) << endl; |
|
|
|
cout << p2(input) << endl; |
|
|
|
free_input(input); |
|
|
|
} |
|
|
|