Educational Codeforces Round 101
C. Building a Fence
首先相邻的两个栅栏是否相交的判断可以转换为两个栅栏的底的距离差,这样实际上我们并不需要维护出栅栏,只需要维护底的位置即可。
假设上一个栅栏可摆放的位置是\([x,y]\),则与之相交的栅栏应该摆放在\([x-k+1,y+k-1]\)。如果当前地面高度是\(h\),则当前栅栏可摆放的位置就是\([h+1,h+k]\)。两个区间的交集就是当前栅栏能摆放的合法区间。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 1e18;
void solve() {
int n, k, x, y;
cin >> n >> k;
vector<int> h(n);
for (auto &i: h) cin >> i;
x = y = h[0] + 1;
for (int i = 1, l, r, p, q; i < n - 1; i++) {
l = x - k + 1, r = y + k - 1;
p = h[i] + 1, q = h[i] + k;
x = max( l , p ) , y = min( r , q );
if( x > y ) {
cout << "NO\n";
return;
}
}
if( x - k + 1 <= h.back()+1 and h.back()+1 <= y + k - 1 ) cout << "YES\n";
else cout << "NO\n";
}
int32_t main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int t;
cin >> t;
for (; t; t--)
solve();
return 0;
}
D. Ceil Divisions
构造题,首先\(1,2\)不需要操作。把出了\(8,n\)以外的数字全部除以\(n\),在把\(n\)除以\(8\),最后把\(8\)除以\(2\)即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
using pii = pair<int, int>;
void solve() {
int n;
cin >> n;
vector<pii> res;
for (int i = 3; i < n; i++)
if (i != 8)res.emplace_back(i, n);
if (n > 8) {
for (int x = n; x > 1; x = (x + 7) / 8)
res.emplace_back(n, 8);
for (int x = 8; x > 1; x = (x + 1) / 2)
res.emplace_back(8, 2);
} else {
for( int x = n ; x > 1 ; x = ( x + 1 ) / 2)
res.emplace_back( n , 2 );
}
cout << res.size() << "\n";
for( auto [x,y] : res )
cout << x << " " << y << "\n";
return ;
}
int32_t main() {
ios::sync_with_stdio(0), cin.tie(0);
int t;
for (cin >> t; t; t--)
solve();
return 0;
}