교육 Codeforces 라운드 76 (사업부 정격. 2)

A - 두 라이벌 학생

문제의 의미 : 개별 행에있는 두 사람의 n 행의 합계는 B 값의 절대치를 최대화 교체 위치에 인접한 뷰 (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, 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 - 부분 배열 지배

문제의 의미 : N (N <= 2E5)은 시퀀스 번호, 인공 지능 <= N, 최단 서브 인터벌을 지배 두 조건을 갖는 "지배적 서브 간격은"찾을 수 : 1 길이> = 2,2, 전용 모드가있다.

해결 방법 : 시작이 반, 검증 후 절반 길이, 검증 알고리즘도 뛰어난 전송의 수 (도보 촬영 때마다, 모드는 하나 대부분에서 변경)를 작성 및 상각 O (1)가되고 싶어요. 그러나 나는 돌아 서서 나는 큰 불가능 아니라고 작은 부분을 생각하지. 예를 들어,이 같은를 구성 :

1
8
2 2 4 4 2 2 4 4

두 할당 검증의 시작이 실패하는 경우 (4), 하위 부 (2), 상기 모드 (4)는 2 개이다. 그러나, 최소 길이는 2 개 서브 구간이다.

나중에 나는 잠시 생각, 같은 인접한 두 요소 나쁜의 짧은 있는지 여부를 고려하는 가장 좋은 시작이 아닌가? 발견 후 실제로 증명 너무 간단합니다.

최단 개의 인접한 동일 요소 같을 경우 :

X, Y1, Y2, Y3, ..., YK, X

이순신 그래서 그렇지 않으면 짧은 이순신, 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 카드 만 1,000t이 모습을 memset 함수하지 않는 것처럼하지만 보인다.

추천

출처www.cnblogs.com/KisekiPurin2019/p/11854682.html