QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#767553 | #6531. Base Station Construction | diguo | WA | 106ms | 43940kb | C++20 | 2.9kb | 2024-11-20 21:15:00 | 2024-11-20 21:15:06 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define all(x, y) x.begin() + y, x.end()
#define mkp make_pair
#define pii pair<int, int>
#define pil pair<int, long long>
#define pli pair<long long, int>
#define pll pair<long long, long long>
#define ll long long
#define ull unsigned long long
#define pb push_back
#define rep(name, base, limit) for(int name = base; name <= limit; ++name)
#define per(name, base, limit) for(int name = base; name >= limit; --name)
#define lowbit(x) ((x) & -(x))
#define ls(p) ((p) << 1)
#define rs(p) ((p) << 1 | 1)
const int INF = 0x3f3f3f3f;
const long long LNF = 0x3f3f3f3f3f3f3f3f;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
/*
f[i]表示包含i以及其i的左侧的区间内, 最小的cost
设j为i左侧第一个不包含i的r, k为i左侧的第一个包含i的区间的l
如不存在区间, k = 0
对j和k分类讨论
对于j < k的情况, f[i] = min(f[j] + min(w[k ~ i]));
对于j >= k的情况, f[i] = f[j]
*/
const int LGN = 500000;
int lg2[LGN + 1];
//don't forget init value of log2 and calculate function
void lginit()
{
rep(i, 2, LGN) lg2[i] = lg2[i / 2] + 1;
}
struct ST
{
vector<vector<ll>> st;
ll cal(ll x, ll y)
{
ll ret = min(x, y);
return ret;
}
void init(vector<ll> a, int n)
{
st.resize(n + 1);
rep(i, 0, n) st[i].resize(31), st[i][0] = a[i];
rep(i, 1, 20) for (int j = 1; j + (1 << i) - 1 <= n; ++j)
st[j][i] = cal(st[j][i - 1], st[j + (1 << (i - 1))][i - 1]);
}
ll query(int l, int r)
{
int s = lg2[r - l + 1];
return cal(st[l][s], st[r - (1 << s) + 1][s]);
}
};
void solve()
{
int n = read();
vector<ll> a(n + 1);
rep(i, 1, n) a[i] = read();
ST st;
st.init(a, n);
vector<ll> f(n + 1);
int m = read();
vector vl(n + 1, vector<int>()), vr(n + 1, vector<int>());
vector<int> l(m + 1), r(m + 1);
rep(i, 1, m)
{
l[i] = read(), r[i] = read();
vl[l[i]].pb(i), vr[r[i]].pb(i);
}
int lstr = 0;
multiset<int> lstl;
// set<int> now;
rep(i, 1, n)
{
for (auto x: vl[i])
{
// now.insert(x);
lstl.insert(l[x]);
}
if (lstl.empty()) f[i] = f[lstr];
else
{
int k = *lstl.rbegin();
if (k <= lstr) f[i] = f[lstr];
else f[i] = f[lstr] + st.query(k, i);
}
for (auto x: vr[i])
{
lstr = i;
lstl.erase(lstl.lower_bound(l[x]));
}
}
cout << f[n];
}
int main()
{
lginit();
int t = read();
while (t--)
{
solve();
if (t) putchar('\n');
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 5488kb
input:
2 5 3 2 4 1 100 3 1 3 2 4 5 5 5 7 3 4 2 2 3 1 4 2 3 4 5
output:
102 5
result:
ok 2 number(s): "102 5"
Test #2:
score: -100
Wrong Answer
time: 106ms
memory: 43940kb
input:
6201 12 88 78 46 95 84 98 55 3 68 42 6 18 19 6 9 10 11 12 12 8 11 8 12 2 3 2 3 1 5 9 9 7 8 6 11 2 4 12 12 2 4 2 9 7 10 8 8 1 7 6 11 5 76 27 48 66 61 2 1 4 3 5 8 64 81 20 6 86 9 4 55 1 7 7 9 1 43 18 81 11 22 9 61 83 14 5 6 2 6 5 8 1 4 9 9 9 9 7 7 2 5 8 9 5 6 4 8 5 8 9 9 6 6 10 66 41 84 7 80 31 22 96 ...
output:
232 48 4 267 303 141 23 170 159 192 265 243 267 127 268 93 411 89 138 130 294 27 1 193 359 93 239 312 378 150 177 57 46 18 91 79 83 160 196 62 35 122 285 275 115 277 61 394 252 306 383 86 399 244 288 87 302 81 223 173 30 129 145 128 126 179 81 312 142 277 143 111 235 247 211 53 91 17 213 101 482 176...
result:
wrong answer 1st numbers differ - expected: '141', found: '232'