Submission #45301693
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
namespace r = ranges;
#define BE(x) x.begin(), x.end()
using ll = long long;
template<class T> using vec = vector<T>;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
chrono::system_clock::time_point time_a, time_b, time_c;
time_a = chrono::system_clock::now();
int t, h, w, i0;
cin >> t >> h >> w >> i0;
vec<string> hs(h-1), vs(h);
for (auto &e : hs) cin >> e;
for (auto &e : vs) cin >> e;
const int n = h*w;
vec<vec<int>> g(n);
const int di[] = {-1, 1, 0, 0};
const int dj[] = {0, 0, -1, 1};
for (int i = 0; i < h; ++i)
for (int j = 0; j < w; ++j) {
const int v = i*w+j;
for (int d = 0; d < 4; ++d) {
int ni = i+di[d];
int nj = j+dj[d];
if (ni < 0 || h <= ni) continue;
if (nj < 0 || w <= nj) continue;
if (d==0 && hs[i-1][j]=='1') continue;
if (d==1 && hs[i][j] =='1') continue;
if (d==2 && vs[i][j-1]=='1') continue;
if (d==3 && vs[i][j] =='1') continue;
g[v].push_back(ni*w+nj);
}
}
const int door = i0*w;
vec<int> level(n,-1);
int yet = r::count(level,-1);
while (yet) {
static int lev = 0;
for (int i = 0; i < n; ++i) {
if (level[i] != -1) continue;
bitset<400> bs;
auto dfs = [&](auto &f, int v) -> void {
bs[v] = true;
for (auto &e : g[v]) {
if (level[e] == lev) {
bs[e] = true;
continue;
}
if (level[e] != -1) continue;
if (bs[e]) continue;
if (e == i) continue;
f(f, e);
}
};
if (i != door) dfs(dfs, door);
if (r::count(level,-1)+r::count(level,lev) == (ll)(bs.count()+1)) level[i] = lev;
}
int nyet = r::count(level,-1);
if (yet == nyet) break;
yet = nyet;
++lev;
}
vec<pair<int,int>> lev_v(n);
for (int i = 0; i < n; ++i) {
lev_v[i] = {level[i],i};
}
r::sort(lev_v);
int k;
cin >> k;
vec<int> s(k), d(k);
for (int i = 0; i < k; ++i) {
cin >> s[i] >> d[i];
}
vec<int> score(k);
for (int i = 0; i < k; ++i) {
score[i] = d[i]-s[i]+1;
}
vector crops(101, vector(101, vec<tuple<float,float,int>>())); // [m][d] {-(s-m),d-m,i}
for (int m = 1; m <= t; ++m) {
for (int i = 0; i < k; ++i) {
if (s[i] < m) continue;
tuple<float,float,int> tt = {-(s[i]-m), d[i]-m, i};
for (int j = d[i]; j <= 100; ++j) {
crops[m][j].push_back(tt);
}
}
}
using Plan = vec<tuple<int,int,int,int>>; // k, i, j, s
Plan ans;
int score_max = 0;
const float exp_init = 1;
const float exp_step = 0.8;
const float exp_lim = 16;
const float powbase = 1.125;
chrono::milliseconds last_lap(0);
for (float exp = exp_init; exp <= exp_lim; exp += exp_step) {
time_c = std::chrono::system_clock::now();
last_lap = chrono::duration_cast<chrono::milliseconds>(time_c - time_b);
chrono::milliseconds elapsed = chrono::duration_cast<chrono::milliseconds>(time_c - time_a);
time_b = time_c;
if (exp != exp_init && elapsed+last_lap > (chrono::milliseconds)1950) break;
for (auto &cm : crops)
for (auto &e : cm) {
const float spow = pow(powbase,exp);
const float dpow = pow(powbase,-exp);
r::sort(e, [&exp, &spow, &dpow](auto a, auto b) {
auto f = [&exp, &spow, &dpow](tuple<float,float,int> &x) {
auto& [xs, xd, _] = x;
return xs*spow + xd*dpow;
};
return f(a) < f(b);
});
}
Plan plan;
int score_sum = 0;
bitset<40000> done;
vec<int> harvest(n,-1);
for (int month = 1; month <= t; ++month) {
auto cm = crops[month];
for (auto &[lev,v] : lev_v) {
if (harvest[v] != -1) continue;
// check limit
bitset<400> bs;
auto dfs = [&](auto &f, int u) -> void {
bs[u] = true;
for (auto &e : g[u]) {
if (e == v) continue;
if (bs[e]) continue;
if (harvest[e] != -1) {
bs[e] = true;
continue;
}
f(f, e);
}
};
if (harvest[door] == -1 && v != door)
dfs(dfs, door);
int md = 100;
for (int i = 0; i < n; ++i) {
if (bs[i]) continue;
if (i == v) continue;
md = min(md, harvest[i]);
}
// plant
for (int i = md; i >= 0; --i) {
bool flg = false;
while (!cm[i].empty()) {
auto [_,__,cr] = cm[i].back();
cm[i].pop_back();
if (done[cr]) continue;
flg = true;
plan.emplace_back(cr+1, v/w, v%w, month);
score_sum += score[cr];
done[cr] = true;
harvest[v] = d[cr];
break;
}
if (flg) break;
}
}
for (int v = 0; v < n; ++v) {
if (harvest[v] == month) harvest[v] = -1;
}
}
if (score_sum > score_max) ans = plan;
// cout << "score:" << score_sum << ", window:" << exp << ", time:" << last_lap << "\n";
}
cout << ans.size() << '\n';
for (auto &[k,i,j,s] : ans) {
cout << k << ' ' << i << ' ' << j << ' ' << s << '\n';
}
}
Submission Info
| Submission Time |
|
| Task |
A - Crops on Grid |
| User |
iboibo |
| Language |
C++ 23 (gcc 12.2) |
| Score |
20129475 |
| Code Size |
6364 Byte |
| Status |
AC |
| Exec Time |
1936 ms |
| Memory |
146484 KiB |
Judge Result
| Set Name |
test_ALL |
| Score / Max Score |
20129475 / 50000000 |
| Status |
|
| Set Name |
Test Cases |
| test_ALL |
0000.txt, 0001.txt, 0002.txt, 0003.txt, 0004.txt, 0005.txt, 0006.txt, 0007.txt, 0008.txt, 0009.txt, 0010.txt, 0011.txt, 0012.txt, 0013.txt, 0014.txt, 0015.txt, 0016.txt, 0017.txt, 0018.txt, 0019.txt, 0020.txt, 0021.txt, 0022.txt, 0023.txt, 0024.txt, 0025.txt, 0026.txt, 0027.txt, 0028.txt, 0029.txt, 0030.txt, 0031.txt, 0032.txt, 0033.txt, 0034.txt, 0035.txt, 0036.txt, 0037.txt, 0038.txt, 0039.txt, 0040.txt, 0041.txt, 0042.txt, 0043.txt, 0044.txt, 0045.txt, 0046.txt, 0047.txt, 0048.txt, 0049.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 0000.txt |
AC |
1924 ms |
134148 KiB |
| 0001.txt |
AC |
1723 ms |
117760 KiB |
| 0002.txt |
AC |
1825 ms |
92416 KiB |
| 0003.txt |
AC |
1872 ms |
83816 KiB |
| 0004.txt |
AC |
1726 ms |
146484 KiB |
| 0005.txt |
AC |
1825 ms |
126520 KiB |
| 0006.txt |
AC |
1654 ms |
138020 KiB |
| 0007.txt |
AC |
1789 ms |
123516 KiB |
| 0008.txt |
AC |
1657 ms |
139144 KiB |
| 0009.txt |
AC |
1910 ms |
97584 KiB |
| 0010.txt |
AC |
1788 ms |
125040 KiB |
| 0011.txt |
AC |
1719 ms |
146220 KiB |
| 0012.txt |
AC |
1853 ms |
92996 KiB |
| 0013.txt |
AC |
1914 ms |
113628 KiB |
| 0014.txt |
AC |
1766 ms |
89740 KiB |
| 0015.txt |
AC |
1703 ms |
116508 KiB |
| 0016.txt |
AC |
1854 ms |
129932 KiB |
| 0017.txt |
AC |
1816 ms |
126556 KiB |
| 0018.txt |
AC |
1795 ms |
103880 KiB |
| 0019.txt |
AC |
1813 ms |
125640 KiB |
| 0020.txt |
AC |
1893 ms |
133260 KiB |
| 0021.txt |
AC |
1857 ms |
130268 KiB |
| 0022.txt |
AC |
1830 ms |
93244 KiB |
| 0023.txt |
AC |
1873 ms |
110608 KiB |
| 0024.txt |
AC |
1741 ms |
100800 KiB |
| 0025.txt |
AC |
1874 ms |
84164 KiB |
| 0026.txt |
AC |
1811 ms |
104872 KiB |
| 0027.txt |
AC |
1656 ms |
141188 KiB |
| 0028.txt |
AC |
1932 ms |
97584 KiB |
| 0029.txt |
AC |
1892 ms |
110712 KiB |
| 0030.txt |
AC |
1780 ms |
102904 KiB |
| 0031.txt |
AC |
1770 ms |
122024 KiB |
| 0032.txt |
AC |
1935 ms |
98292 KiB |
| 0033.txt |
AC |
1911 ms |
112136 KiB |
| 0034.txt |
AC |
1782 ms |
103312 KiB |
| 0035.txt |
AC |
1903 ms |
130816 KiB |
| 0036.txt |
AC |
1806 ms |
91100 KiB |
| 0037.txt |
AC |
1854 ms |
93976 KiB |
| 0038.txt |
AC |
1883 ms |
132324 KiB |
| 0039.txt |
AC |
1672 ms |
142356 KiB |
| 0040.txt |
AC |
1768 ms |
123524 KiB |
| 0041.txt |
AC |
1769 ms |
88804 KiB |
| 0042.txt |
AC |
1768 ms |
125496 KiB |
| 0043.txt |
AC |
1897 ms |
95580 KiB |
| 0044.txt |
AC |
1828 ms |
126988 KiB |
| 0045.txt |
AC |
1848 ms |
128348 KiB |
| 0046.txt |
AC |
1787 ms |
88340 KiB |
| 0047.txt |
AC |
1856 ms |
93908 KiB |
| 0048.txt |
AC |
1936 ms |
134796 KiB |
| 0049.txt |
AC |
1860 ms |
129664 KiB |