1. 程式人生 > 其它 >Codeforces Round #703 (Div. 2)(A ~ F)超高質量題解【每日億題2 / 19】

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| x1x2+y1y2

簽到題 ~

很明顯這就是中位數的板子題,但是它把一維拓展到了二維,但是沒什麼區別

首先考慮一維怎麼算,首先若 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題我都還沒看就沒了

/kk