(本部2定格)教育Codeforcesラウンド76

A - 二つのライバル学生

問題の意味:個々の行のN行の合計、Bに位置する二人は、値abs(AB)を最大に交換位置隣接するビュー、最大xは。

溶液:+1までの各交換は、N-1を超えることができません。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
 
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    int t;
    scanf("%d", &t);
    while(t--) {
        int n, x, a, b;
        scanf("%d%d%d%d", &n, &x, &a, &b);
        printf("%d\n", min(n - 1, abs(a - b) + x));
    }
    return 0;
}

B - マジックスティック

質問の意味:偶数の場合は、半分を追加し、1:数aに、無制限の2つの動作モードがあります。2、1>場合、1減算されます。彼らはxからyのを構築することができれば私は尋ねました。

解決策:あなたが達することができる操作を参照するには、無制限の減算があります。まず、図1に示すように、Y <= 1を移動していません。第2は、2〜3、3、4への侵入、またはそうx = 2のとき、X = 3、Y <= 3ことができないかもしれません。そして、図4は、持っていることがあり、4-> 6>、9-> 8> 12 - > 18 - > 27-> 26-> 39 - > ...そうそう、無限なので、4つ以上のソリューションが存在する必要があります。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    int t;
    scanf("%d", &t);
    while(t--) {
        ll x, y;
        scanf("%lld%lld", &x, &y);
        bool suc = 0;
        if(x == 1)
            suc = (y <= 1);
        else if(x <= 3)
            suc = (y <= 3);
        else
            suc = 1;
        puts(suc ? "YES" : "NO");
    }
    return 0;
}

C - サブアレイ支配

問題の意味:1、長さ> = 2,2:N(N <= 2E5)のシーケンス番号が、最短のサブインターバルは、2つの条件を有する支配「部分区間支配されている」を見つけるために、N = <愛唯一のモードがあります。

ソリューション:スタートは半分、検証の後、半分の長さは、検証アルゴリズムはまた、優れた転送回数(足取られるたびに、モードが1、最大で変更された)に書かれており、償却O(1)になりたいです。しかし、私は振り向くと、私は大きなは不可能ではないという小さなセクションを、考えていません。例えば、私はこのような構築します:

1
8
2 2 4 4 2 2 4 4

2つの割り当てられた検証の開始が失敗した場合4は、任意のサブセクション2、及びモード4は2です。しかし、最小の長さは2つの部分区間です。

その後、私は一瞬考えて、同じことが悪い隣接する二つの要素の最短であるかどうかを検討するための最良のスタートではないでしょうか?発見後は実際に証明することはとても簡単です。

最短2の隣接する同一の要素には次のように見てみると:

X、Y1、Y2、Y3、...、YK、X

YIので、それ以外の場合は短いYI、YJおよび仮定に矛盾があり、当然のことながら、互いに等しく、そしてxは同じではありません。そして、この間隔は、「サブインターバルを支配した。」しなければなりません

しかし、なぜ最短は「サブ間隔によって支配され、」それはそうでなければなりませんか?

xから両側に延びている、確かに短くない長さ、内側に収縮が、何より短い「支配されるサブインターバル」は存在しないので、これは、隣接する長いと使い捨て部分区間xの構成要素でありますこれは、いくつかの小さなとの組み合わせによって得ることができます。このアルゴリズムに敷設された判断のn = 1を必要としません。カードのmemsetことしないように注意してください。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, a[200005];
int pre[200005];

int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    int t;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        memset(pre, -1, sizeof(pre[0]) * (n + 1));
        for(int i = 1; i <= n; ++i)
            scanf("%d", &a[i]);

        int minlen = 1e9;
        for(int i = 1; i <= n; ++i) {
            if(pre[a[i]] != -1)
                minlen = min(minlen, i - pre[a[i]] + 1);
            pre[a[i]] = i;
        }
        if(minlen == 1e9)
            minlen = -1;

        printf("%d\n", solve());
    }
    return 0;
}

CFカード内の唯一の千トンがmemsetを見ていないようですが、それが見えます。

おすすめ

転載: www.cnblogs.com/KisekiPurin2019/p/11854682.html