Codeforces 라운드 # 602 (사업부. 2 Technocup에 기초 2,020 토너먼트 3)

A - 수학 문제

문제의 의미 선분 N [L, R은, 각각의 점은 모든 세그먼트에 적어도 하나 개의 공통 있고, 점 결합 축퇴 세그먼트를 구할 수있다.

해결 방법 : 오른쪽과 왼쪽 왼쪽 지점 우측 지점을 찾아 점을 왼쪽> 바로 포인트는, 당신은이 둘을 연결하는이 줄을 추가하거나 라인은 지금 [왼쪽 지점 오른쪽 점]입니다 에 한 점.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
 
void test_case() {
    int n;
    scanf("%d", &n);
    int L = 1, R = 1e9;
    for(int i = 1; i <= n; ++i) {
        int l, r;
        scanf("%d%d", &l, &r);
        L = max(L, l);
        R = min(R, r);
    }
    int ans = 0;
    if(L > R)
        ans = L - R;
    printf("%d\n", ans);
}
 
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    int t = 1;
    scanf("%d", &t);
    for(int ti = 1; ti <= t; ++ti) {
        //printf("Case #%d: ", ti);
        test_case();
    }
}

B - 박스

문제의 의미 최대 시퀀스 프리픽스는 구성이 시퀀스 (A)의 임의의 요건을 충족한다.

해결 방법 : 사전 식이 순서의 최대 정렬을 충족하기 위해 생성. 사실이 순서의 때문에 혼란 구축 할 수있는 방법을, 증가하고있다. 방전은 다시보다 값이 큰에서 최대 값을 LOWER_BOUND 주거나 최대 같게 이번에 스위핑하지 후 먼저, 각 장소에서의 최대 변화를 확실히 넣어 범인 후 어떤 위치에있을 수있다. 그리고 - 적은 후 최대 값보다 그, 그것을 과거에 넣어. 이 최대 값을 -1 초과 할 때까지 또는 각 반복자를 넣어 시작 반복자는 그래서 전적으로 작은, 시작합니다.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
 
int q[100005];
int p[100005];
set<int> tmp;
 
void test_case() {
    int n;
    scanf("%d", &n);
    tmp.clear();
    for(int i = 1; i <= n; ++i) {
        p[i] = -1;
        tmp.insert(i);
    }
    for(int i = 1; i <= n; ++i)
        scanf("%d", &q[i]);
    p[1] = q[1];
    tmp.erase(q[1]);
    for(int i = 2; i <= n; ++i) {
        if(q[i] > q[i - 1]) {
            p[i] = q[i];
            tmp.erase(q[i]);
        }
    }
    for(int i = 1; i <= n; ++i) {
        if(p[i] == -1) {
            auto t = tmp.lower_bound(q[i]);
            if(t == tmp.begin()) {
                puts("-1");
                return;
            }
            --t;
            p[i] = *t;
            tmp.erase(t);
        }
    }
    for(int i = 1; i <= n; ++i)
        printf("%d%c", p[i], " \n"[i == n]);
}
 
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    int t = 1;
    scanf("%d", &t);
    for(int ti = 1; ti <= t; ++ti) {
        //printf("Case #%d: ", ti);
        test_case();
    }
}

C - 지저분한

질문은 것입니다 : A는 "(", ")"괄호 괄호의 2000 시리즈의 길이와 동일 이하인에, 각각, 그래서 마지막 법적 문자열 브래킷 및 0 - 정확히 K 번 반전 서브 간격이 필요합니다.

해결 방법 : 처음 두 문자가 될 욕심, 탐욕 때마다 "(", ")", 그래서 결국이 N / 2 번, 필요한 경우 다음 짧은 시작의 시작 (그것을 파괴, 제로 과용하지 말게 ) 대부분의 N / 2 + 1 시점과. 네트워크에 대한 이유를 지불하지 않았기 때문에, 문제는 자연스럽게 수렴 힘이 아니다.

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

int n, k;
string s;
vector<pair<int, int> > ans;

void test_case() {
    ans.clear();
    cin >> n >> k >> s;
    int curp = 1;
    while(s.length()) {
        if(s[0] == '(' && s[1] == ')') {
            s = s.substr(2, s.length());
            curp += 2;
        } else if(s[0] == ')' && s[1] == '(') {
            ans.push_back({curp + 0, curp + 1});
            s = s.substr(2, s.length());
            curp += 2;
        } else if(s[0] == ')') {
            int j = 2;
            while(s[j] == s[0])
                ++j;
            ans.push_back({curp + 0, curp + j});
            string s1 = s.substr(0, j + 1);
            string s2 = s.substr(j + 1, s.length());
            reverse(s1.begin(), s1.end());
            s = s1 + s2;
            s = s.substr(2, s.length());
            curp += 2;
        } else {
            int j = 2;
            while(s[j] == s[0])
                ++j;
            ans.push_back({curp + 1, curp + j});
            string s0 = s.substr(0, 1);
            string s1 = s.substr(1, j);
            string s2 = s.substr(j + 1, s.length());
            reverse(s1.begin(), s1.end());
            s = s0 + s1 + s2;
            s = s.substr(2, s.length());
            curp += 2;
        }
    }
    int tk = n / 2 - k;
    if(1 + 2 * tk >= 2)
        ans.push_back({2, 1 + 2 * tk});
    cout << ans.size() << endl;
    for(int i = 0; i < ans.size(); ++i)
        cout << ans[i].first << " " << ans[i].second << endl;
}

int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    int t = 1;
    scanf("%d", &t);
    for(int ti = 1; ti <= t; ++ti) {
        //printf("Case #%d: ", ti);
        test_case();
    }
}

참고 :이 방법은 SUBSTR 문자열, 정말 아픈 사람들, SUBSTR (A, B)이 형성 B 문자 문자열의 시작 위치에서 채택되어 사용 주목해야합니다. 사실, 문자의 정적 배열의 사용은 편리하지 않을 경우? 당신이 쓰는 경우 String 클래스 가고 자신의 브랜드 - 새로운 방법을 사용할 수 있습니다.

추천

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