QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#184589 | #5979. Log Set | Ishy | 25 ✓ | 44ms | 6936kb | C++14 | 2.9kb | 2023-09-20 21:40:27 | 2023-09-20 21:40:28 |
Judging History
answer
#include<bits/stdc++.h>
#define LL long long
#define DB double
#define MOD 1000000007
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define lowbit(x) ((-x) & x)
#define MP make_pair
#define VI vector<int>
#define VL vector<LL>
#define VII VI::iterator
#define VLI VL::iterator
#define all(x) x.begin(), x.end()
#define EB emplace_back
#define PII pair<int, int>
#define PLL pair<LL, LL>
#define SI set<int>
#define SII SI::iterator
#define fi first
#define se second
using namespace std;
template<typename T> void chkmn(T &a, const T &b) { (a > b) && (a = b); }
template<typename T> void chkmx(T &a, const T &b) { (a < b) && (a = b); }
void Inc(int &a, const int &b) { ((a += b) >= MOD) && (a -= MOD); }
void Dec(int &a, const int &b) { ((a -= b) < 0) && (a += MOD); }
void Mul(int &a, const int &b) { a = 1LL * a * b % MOD; }
void Sqr(int &a) { a = 1LL * a * a % MOD; }
int inc(const int &a, const int &b) { return (a + b >= MOD) ? a + b - MOD : a + b; }
int dec(const int &a, const int &b) { return (a - b < 0) ? a - b + MOD : a - b; }
int mul(const int &a, const int &b) { return 1LL * a * b % MOD; }
int sqr(const int &a) { return 1LL * a * a % MOD; }
int qwqmi(int x, int k = MOD - 2)
{
int res = 1;
while(k)
{
if(k & 1) Mul(res, x);
k >>= 1, Sqr(x);
}
return res;
}
const int N = 1e4 + 5;
const int M = 65;
int T, n, m;
PLL a[N];
LL ans[M];
map<LL, LL> mp;
set<LL> f[M];
void work(int cas)
{
mp.clear(); LL sum = 0;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%lld", &a[i].fi);
for(int i = 1; i <= n; ++i)
scanf("%lld", &a[i].se);
for(int i = 1; i <= n; ++i)
{
mp.insert(a[i]);
sum += a[i].se;
}
m = log2(sum);
for(int i = 1; i <= m + 1; ++i)
f[i].clear();
for(int i = 1; i <= m; ++i)
{
vector<PLL> vec; vec.clear();
LL mx1 = 7210721, mx2 = 7210721;
mx2 = mx1 = prev(mp.end())->fi;
if(prev(mp.end()) != mp.begin())
mx2 = prev(prev(mp.end()))->fi;
LL p = mx1 - mx2;
ans[i] = p;
for(auto now : mp)
{
LL x = now.fi, c = now.se;
if(c == 0)
{
vec.EB(MP(x, c));
continue;
}
if(mp.find(x + p) == mp.end())
continue;
if(p == 0) mp[x] >>= 1;
else mp[x + p] -= c;
}
for(auto now : vec)
mp.erase(now.fi);
}
LL delta = abs(mp.begin()->fi);
sort(ans + 1, ans + m + 1, [&](LL x, LL y){
return x > y;
});
f[m + 1].insert(0);
for(int i = m; i >= 1; --i)
for(auto x : f[i + 1])
{
f[i].insert(x);
f[i].insert(x + ans[i]);
}
for(int i = 1; i <= m; ++i)
if(f[i + 1].find(delta - ans[i]) != f[i + 1].end())
delta -= ans[i], ans[i] = -ans[i];
sort(ans + 1, ans + m + 1);
printf("Case #%d: ", cas);
for(int i = 1; i <= m; ++i)
printf("%lld ", ans[i]);
puts("");
}
int main()
{
scanf("%d", &T);
for(int cas = 1; cas <= T; ++cas)
work(cas);
return 0;
}
//3
//8
//0 1 2 3 4 5 6 7
//1 1 1 1 1 1 1 1
//4
//0 1 3 4
//4 4 4 4
//5
//-2 -1 0 1 2
//1 2 2 2 1
詳細信息
Subtask #1:
score: 6
Accepted
Test #1:
score: 6
Accepted
time: 19ms
memory: 5156kb
input:
100 36 0 2 4 53591 53592 53593 53594 53595 53596 74164 74166 74168 107182 107183 107184 107185 107186 107187 127755 127756 127757 127758 127759 127760 160774 160776 160778 181346 181347 181348 181349 181350 181351 234938 234940 234942 1 2 1 2 1 4 2 2 1 1 2 1 1 2 2 4 1 2 2 1 4 2 2 1 1 2 1 1 2 2 4 1 2...
output:
Case #1: 2 2 53591 53591 53592 74164 Case #2: 1 15547 76676 76677 153352 Case #3: 1 1 1 1 2 Case #4: 1 1 2 2 Case #5: 9242 9243 77639 86881 96123 96123 201487 Case #6: 0 0 0 1 8 16 Case #7: 22874 72322 95195 95195 95195 95195 190390 Case #8: 1 2 4 Case #9: 0 0 1 1 1 1 12 15 Case #10: 0 0 1 ...
result:
ok 100 lines
Subtask #2:
score: 19
Accepted
Test #2:
score: 19
Accepted
time: 44ms
memory: 6936kb
input:
100 10 -4 -3 -2 -1 0 1 2 3 4 5 1 3 4 4 4 4 4 4 3 1 11 -4 -3 -2 0 1 2 3 4 6 7 8 2 4 2 2 4 4 4 2 2 4 2 11 -3 -2 -1 0 1 2 3 4 5 6 7 2 4 4 8 10 8 10 8 4 4 2 56 -114052 -114051 -114050 -96688 -96687 -96686 -96685 -79323 -79322 -79321 -79320 -65712 -65711 -65710 -65706 -65705 -65704 -61958 -61957 -61956 -...
output:
Case #1: -4 1 1 1 2 Case #2: -4 0 1 1 6 Case #3: -3 0 1 1 2 3 Case #4: -48346 -48340 -17365 -1 1 17364 17365 Case #5: -65620 -65619 -42396 1 23223 65619 65619 Case #6: -80 -79 -79 -78 -78 -75 -74 -73 -71 -68 -66 -66 -66 -65 -62 -61 -61 -60 -60 -7 -5 1 3 5 6 10 10 19 20 23 24 26 26 30 30 31 32 3...
result:
ok 100 lines
Extra Test:
score: 0
Extra Test Passed