Skip to content

Commit db6374c

Browse files
committed
update Starter72B (Rated for div2).md
1 parent 5b5ffc1 commit db6374c

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

Diff for: codechef/Starter72B (Rated for div2).md

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# Starter72B (Rated for div2)
2+
3+
这场打得很窘迫。
4+
5+
## A
6+
7+
1可以作为除数,接着我们考虑它的两个不同因数是否存在即可
8+
9+
```cpp
10+
void solve() {
11+
int n;
12+
cin >> n;
13+
for (int i = 2; i <= sqrt(n); i++) {
14+
if (n % i==0 && n/i != i){
15+
cout << i << " " << n/i << " " << 1 << "\n";
16+
return;
17+
}
18+
}
19+
cout << -1 << "\n";
20+
}
21+
```
22+
23+
24+
25+
## B
26+
27+
公式:∑(Ai * K^{i-1}) = S
28+
29+
没有想到证明,只是一开始想用背包做,但是`1≤S≤1e18`实在太大了,于是转而思考别的做法,最后尝试了贪心的做法,
30+
31+
先将S减至为≤0,接着从大到小依次减去相应的数字,看看是否能使其为0.
32+
33+
```cpp
34+
void solve() {
35+
ll n, k, s;
36+
cin >> n >> k >> s;
37+
int ed = 0;
38+
ll base = 1;
39+
vector <int> ans(n);
40+
for (int i = 0; i < n; i++) {
41+
s -= base;
42+
ed = i;
43+
if (s <= 0) break;
44+
base *= k;
45+
}
46+
s = -s;
47+
fill(begin(ans), begin(ans)+ed+1,1);
48+
for (int i = ed; i >= 0; i--) {
49+
if (s >= base) {
50+
if (s >= 2 * base) ans[i] = -1, s -= 2 * base;
51+
else ans[i] = 0, s -= base;
52+
}
53+
base /= k;
54+
}
55+
if (s != 0) {
56+
cout << -2 << "\n";
57+
return;
58+
}
59+
for (int x: ans) cout << x << " ";
60+
cout << "\n";
61+
}
62+
```
63+
64+
65+
66+
## C
67+
68+
推公式,可以发现,题目要求的条件可以转化为`2*s[r] - r - 1 = 2 * s[l] - l`,其中`s[i]`为前缀`[1..i]`的1的数目。
69+
70+
于是可以做一次DP,最后根据DP值回溯即可
71+
72+
```cpp
73+
void solve() {
74+
int n;
75+
cin >> n;
76+
vector <int> a(n);
77+
for (int i = 0; i < n; i++) {
78+
cin >> a[i];
79+
}
80+
vector <int> s(n+10);
81+
for (int i = 1; i <= n; i++) {
82+
s[i] = s[i-1] + a[i-1];
83+
//cout << s[i] << " " << s[i-1] << " " << a[i] << "\n";
84+
}
85+
unordered_map <int, int> m;
86+
int ans = 0;
87+
vector <int> f(n+10);
88+
int mn = 2000;
89+
for (int i = 1; i <= n; i++) {
90+
int now = 2 * s[i] - i-1;
91+
if (a[i-1]==0) continue;
92+
int q = m[now];
93+
f[i] = q+1;
94+
m[now+1] = f[i];
95+
ans = max(ans, q+1);
96+
}
97+
int idx = max_element(begin(f), end(f)) - begin(f);
98+
vector <int> res;
99+
res.push_back(idx+1);
100+
for (int i = idx; i >= 0; i--) {
101+
if (ans && ans == f[i]) {
102+
res.push_back(i);
103+
ans--;
104+
}
105+
}
106+
reverse(all(res));
107+
cout << res.size() << "\n";
108+
for (int x: res) cout << x << " ";
109+
cout << "\n";
110+
}
111+
```
112+

0 commit comments

Comments
 (0)