Codeforces Round #703 (Div. 2)(A ~ F)超高質量題解【每日億題2 / 19】
技術標籤:每日億題
A. Shifting Stacks
你有 n n n 堆積木。第 i i i 個堆疊包含 h i h_i hi 塊,它的高度是這堆積木的數量。在一次移動中,你可以從第 i i i 個堆疊中取出一個積木(如果至少有一個積木的話)並將其放入第 i + 1 i +1 i+1 個堆積木中。問你能否將讓積木的高度序列嚴格遞增?
注意,堆疊的數量始終保持不變,也就是說哪怕這堆裡沒有積木了,這個堆也不會消失。
簽到題 ~
很明顯我們只需要構造出一個 0 , 1 , 2 , ⋯ n + 好 多 0,1,2,\cdots n+ 好多 0,1,2,⋯n+好多 的序列即可,就是前面的都堆到最後面,中間不夠的話也可以借給他,然後就沒了 ~
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef int itn;
const int N = 2e5 + 7;
const ll INF = 4e18;
int n, m, t;
int a[N], b, k1, k2;
bool solve()
{
ll ans = 0;
scanf ("%d", &n);
for(int i = 1;i <= n; ++ i) {
scanf("%d", &a[i]);
}
int x = 0;
for(int i = 1; i <= n; ++ i, x ++ ) {
if(a[i] > x) {
ans += a[i] - x;
a[i] = x;
}
else {
ll tmp = x - a[i] ;
if(ans < tmp) {
puts("NO");
return ;
}
else ans -= tmp;
}
}
puts("YES");
}
int main()
{
scanf("%d", &t);
while(t -- ) {
solve();
}
}
B - Eastern Exhibition
你和你的朋友住在 n n n 個房子裡(?)。每個房子都位於一個二維的平面上,在一個點上有整數座標。同一地點可能有好多個不同的房子擠一塊()。市長問你展覽館要建到哪裡,請你輸出所有房子到這個展覽館的距離最近的點的數量(必須是整數點),注意展覽館同樣可以建在其他房子頭上(霧)。定義兩點 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 和 ( x 2 , y 2 ) (x_2,y_2) (x2,y2) 之間的距離為 ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| ∣x1−x2∣+∣y1−y2∣。
簽到題 ~
很明顯這就是中位數的板子題,但是它把一維拓展到了二維,但是沒什麼區別
首先考慮一維怎麼算,首先若 n n n 是奇數,很明顯答案就一定是 1 1 1,中位數固定了。
若是偶數,那麼中間的那兩個點之間的座標都可以建(包括兩個點,因為可以建到房子頭上),那麼對於二維來說,就是這個矩形裡的所有的點都可以建唄,就乘起來 ~ 沒了…
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef int itn;
const int N = 2e4 + 7;
const ll INF = 4e18;
int n, m, t;
int x[N], y[N];
void solve()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++ i) {
scanf("%d%d", &x[i], &y[i]);
}
sort(x + 1, x + 1 + n);
sort(y + 1, y + 1 + n);
ll numx = x[n / 2 + 1] - x[n / 2] + 1;
ll numy = y[n / 2 + 1] - y[n / 2] + 1;
if(n & 1)
printf("1\n");
else printf("%lld\n", numx * numy);
}
int main()
{
scanf("%d", &t);
while(t -- ) {
solve();
}
}
C1 - Guessing the Greatest (easy version)
C2 - Guessing the Greatest (hard version)
直接寫的正解,然後這兩題就一樣了,所以就放一塊了 ~
先睡覺
待更…
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef int itn;
const ll INF = 4e18;
int n, m, t, p;
int ask(int l, int r)
{
if(l == r) return -1;
printf("? %d %d\n", l, r);
fflush(stdout);
int res;
scanf("%d", &res);
return res;
}
void solve()
{
scanf("%d", &n);
p = ask(1, n);
int l, r, mid;
if(ask(p, n) == p) {
l = p;
r = n;
while(l <= r) {
mid = l + r >> 1;
if(ask(l, r) == p) {
r = mid - 1;
}
else l = mid + 1;
}
printf("! %d\n", l);
fflush(stdout);
}
else {
l = 1;
r = p;
while(l <= r) {
mid = l + r >> 1;
if(ask(l, r) == p) {
l = mid + 1;
}
else r = mid - 1;
}
printf("! %d\n", r);
fflush(stdout);
}
}
int main()
{
solve();
}
D - Max Median
待更…
E - Paired Payment
待更…
F - Pairs of Paths
待更…
注意我可沒AK啊我菜的很
F題我都還沒看就沒了