Skip to content

Commit 7ee96e2

Browse files
committed
codechef div4
1 parent f20b228 commit 7ee96e2

File tree

2 files changed

+160
-42
lines changed

2 files changed

+160
-42
lines changed

Diff for: codechef/June Long One 2022 Division 4 (Rated).md

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
> 这个比赛有72个小时,我刚上去看的时候发现还剩下7个小时,就做了一下
2+
> 感觉后面还有3道全是数学题,有点做不下去,希望有空能补上
3+
4+
### A
5+
```c++
6+
void solve() {
7+
int n;
8+
cin >> n;
9+
while(n--){
10+
int a, b;
11+
cin >> a >> b;
12+
cout << max(0, a - b) << endl;
13+
}
14+
}
15+
16+
```
17+
18+
### B
19+
```c++
20+
void solve() {
21+
int n;
22+
cin >> n;
23+
while(n--){
24+
int a, b;
25+
cin >> a >> b;
26+
cout << ((a - 1)/6 + 1) * 1LL * b << endl;
27+
}
28+
}
29+
```
30+
31+
### C
32+
+1, +2, +1, +2...这样每2次为一回合会漏掉一个,规律来看就是以2位首项的等差数列
33+
```c++
34+
void solve() {
35+
int n;
36+
cin >> n;
37+
while(n--){
38+
int a, b;
39+
cin >> a >> b;
40+
//1 3 4 6 7 9 10 12
41+
//2 5 8 11
42+
int rest = b - a;
43+
if(rest < 0 || (rest % 3 == 2)) cout << "NO" << endl;
44+
else cout << "YES" << endl;
45+
}
46+
}
47+
```
48+
49+
### D
50+
模式匹配,主要是看某个串是否完全匹配模式串,如果不能则答案+1
51+
```c++
52+
void solve() {
53+
int n;
54+
cin >> n;
55+
string a, b;
56+
cin >> a >> b;
57+
vector<vector<int>> pos(256);
58+
for (int i = 0; i < b.size(); i++) pos[b[i] - 'a'].push_back(i);
59+
int ans = 0;
60+
for (int i = 0; i < 26; i++) {
61+
bool ok = 0;
62+
for (int j: pos[i]) {
63+
if (a[j] != b[j]) {
64+
ok = 1;
65+
break;
66+
}
67+
}
68+
ans += ok;
69+
}
70+
cout << ans << endl;
71+
}
72+
73+
```
74+
75+
### E
76+
构造题,事实上更好的构造方法可以将[1,..., N]两段分开,然后交错拼接
77+
下面的做法主要是观察到最明显的性质:只有后面为`[1,N]`满足N-1的diff,
78+
```c++
79+
void solve() {
80+
bitset<100010> st;
81+
int n;
82+
cin >> n;
83+
vector <int> ans(n + 1);
84+
ans[n] = n, ans[n - 1] = 1;
85+
st[n] = st[1] = 1;
86+
for (int i = n - 2; i > 0; i--){
87+
int last = ans[i + 1], t;
88+
if(last + i > 1 && last + i < n && !st[last + i]) st[last + i] = 1, t = last + i;
89+
else if(last - i > 1 && last - i < n && !st[last - i]) st[last - i] = 1, t = last - i;
90+
ans[i] = t;
91+
}
92+
for (int i = 1; i <= n; i++) {
93+
cout << ans[i] << " \n"[i == n];
94+
}
95+
}
96+
```
97+
### F
98+
一点点数学,先找到它们的差值,两者的gcd是有办法达到这个差值的,让次小值达到这个值。然后思考,此时这两个数实际上是倍数关系,能有方案
99+
使得他们减去某个值,也达到某个该最大公约数的约数的情况。
100+
用O(sqrt(n))的筛法即可得到约数分布情况
101+
```c++
102+
void solve() {
103+
int a, b;
104+
cin >> a >> b;
105+
int d = abs(a - b);
106+
int ans = 0;
107+
for (int i = 1; i <= sqrt(d); i++){
108+
if(d % i == 0) {
109+
ans++;
110+
if(d != i * i) ans++;
111+
}
112+
}
113+
cout << ans << endl;
114+
}
115+
```

0 commit comments

Comments
 (0)