Skip to content

Commit 1601954

Browse files
committed
Russian Code Cup 2017 Third Qualification Round
1 parent 8d1930a commit 1601954

File tree

4 files changed

+197
-0
lines changed

4 files changed

+197
-0
lines changed

russiancc/2017_qual3/a.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
int main() {
6+
int t;
7+
scanf("%d", &t);
8+
while (t--) {
9+
long long n;
10+
cin >> n;
11+
int dig = 1;
12+
long long cnt = 26;
13+
while (cnt < n) n -= cnt, dig++, cnt *= 26;
14+
for (int i = 0; i < dig; i++) {
15+
cnt /= 26;
16+
int now = 0;
17+
while (n > cnt) now++, n -= cnt;
18+
printf("%c", now + 'A');
19+
}
20+
printf("\n");
21+
}
22+
return 0;
23+
}

russiancc/2017_qual3/b.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
const int N = 1e5 + 5;
6+
pair<long long, long long> hr[N];
7+
long long h, a;
8+
bool cmp(pair<long long, long long> le, pair<long long, long long> ri) {
9+
return le.second * ((le.first + a - 1)/a) > ri.second * ((ri.first + a - 1)/a);
10+
}
11+
long long win[N];
12+
13+
int main() {
14+
int t;
15+
scanf("%d", &t);
16+
while (t--) {
17+
int n;
18+
scanf("%d %lld %lld", &n, &h, &a);
19+
for (int i = 0; i < n; ++i) {
20+
scanf("%lld %lld", &hr[i].first, &hr[i].second);
21+
}
22+
sort(hr, hr+n, cmp);
23+
long long now = 0;
24+
for (int i = n-1; i >= 0; i--) {
25+
int rec = (hr[i].first + a - 1)/a - 1;
26+
now = max(now, hr[i].second * rec);
27+
win[i] = now;
28+
}
29+
int ans = 0;
30+
for (int i = 0; i < n; i++) {
31+
if (h <= win[i]) break;
32+
long long rec = (hr[i].first + a - 1)/a;
33+
long long aa = hr[i].second;
34+
long long w = (h + aa - 1) / aa;
35+
if (w <= rec)
36+
break;
37+
h -= aa * rec;
38+
ans++;
39+
}
40+
if (ans >= n)
41+
ans = -1;
42+
printf("%d\n", ans);
43+
}
44+
return 0;
45+
}

russiancc/2017_qual3/c.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
long long get(long long r) {
6+
if (r < 10) return r;
7+
long long ans = 9, mul = 10;
8+
while (mul + 1 <= r) {
9+
for (int i = 1; i <= 9; ++i) {
10+
if (r < (mul+1) * i) break;
11+
long long v = r - (mul+1) * i;
12+
v /= 10;
13+
ans += min(v+1, mul/10);
14+
}
15+
mul *= 10;
16+
}
17+
return ans;
18+
}
19+
20+
int main() {
21+
int t;
22+
scanf("%d", &t);
23+
while (t--) {
24+
long long l, r;
25+
scanf("%lld %lld", &l, &r);
26+
l--;
27+
printf("%lld\n", get(r) - get(l));
28+
}
29+
return 0;
30+
}

russiancc/2017_qual3/d.cpp

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
6+
const int N = 1e5 + 5, mod = 1e9 + 7;
7+
8+
long long C[22][22];
9+
10+
struct poly {
11+
int n;
12+
int x[22];
13+
poly(int n = 0) : n(n) {
14+
memset(x, 0, sizeof x);
15+
}
16+
void reset(int n = 0) {
17+
this->n = n;
18+
memset(x, 0, sizeof x);
19+
}
20+
long long get(long long p) {
21+
long long ret = 0, now = 1;
22+
for (int i = 0; i <= n; i++) {
23+
ret = (ret + 1LL * x[i] * now) % mod;
24+
now = now * p % mod;
25+
}
26+
return ret;
27+
}
28+
void add(poly & other) {
29+
for (int i = 0; i <= n; i++) {
30+
x[i] += other.x[i];
31+
if (x[i] >= mod) x[i] -= mod;
32+
}
33+
}
34+
};
35+
36+
poly val[N], up[N];
37+
long long ans[N];
38+
int n, lv[N], k;
39+
vector< int > g[N];
40+
41+
void dfs(int v, int par = -1) {
42+
if (par != -1)
43+
val[v].add(val[par]);
44+
for (int u : g[v]) {
45+
lv[u] = lv[v] + 1;
46+
dfs(u, v);
47+
up[v].add(up[u]);
48+
}
49+
}
50+
51+
int main() {
52+
int t;
53+
scanf("%d", &t);
54+
while (t--) {
55+
int r = -1;
56+
scanf("%d %d", &n, &k);
57+
for (int i = 0; i < n; i++) g[i].clear();
58+
for (int i = 0; i < n; i++) {
59+
int p;
60+
scanf("%d", &p); p--;
61+
if (p < 0)
62+
r = i;
63+
else
64+
g[p].push_back(i);
65+
val[i].reset(k);
66+
up[i].reset(k);
67+
}
68+
int q;
69+
scanf("%d", &q);
70+
for (int i = 0; i < q; i++) {
71+
int y, z, x;
72+
scanf("%d %d", &y, &z);
73+
z--;
74+
if (y == 2) {
75+
for (int j = 0; j <= k; j++) {
76+
scanf("%d", &x);
77+
up[z].x[j] += x;
78+
if (up[z].x[j] >= mod)
79+
up[z].x[j] -= mod;
80+
}
81+
}
82+
else {
83+
for (int j = 0; j <= k; j++) {
84+
scanf("%d", &x);
85+
val[z].x[j] += x;
86+
if (val[z].x[j] >= mod)
87+
val[z].x[j] -= mod;
88+
}
89+
}
90+
}
91+
lv[r] = 1;
92+
dfs(r);
93+
for (int i = 0; i < n; i++)
94+
ans[i] = (up[i].get(lv[i]) + val[i].get(lv[i])) % mod;
95+
for (int i = 0; i < n; i++) printf("%d ", ans[i]);
96+
printf("\n");
97+
}
98+
return 0;
99+
}

0 commit comments

Comments
 (0)