2019년 10월 24일 시뮬레이션 게임

T1 고대 용의 퍼즐

마크 더글라스는 수사관이다. 그는에서 작업 "수사 고대 드래곤"을 받아 들였다. 말할 수없는 고난 후, 마크는 마침내 고대의 용을 발견했다. 이 오래전부터 전승되어 있기 때문에 마크가 그를 발견했을 때, 그는 비밀 의학의 일부 놀고 있었는데, 일부 알약, 독특한 광택을 발표했다. 그가 뭔가를 알고 싶어 nostrums의 손을 바라 보았다 마크 말했다 고대 용, 그는 시험을 기선을 테스트하기로 결정했다.
고대 용의 손에 있습니다 \ (n \) 정제 nostrums, 우리가 사용할 수 있습니다 \ (1 \)가 나머지 "오래된 nostrums」을 나타냅니다 (0 \) \ 표현을. 그는 그들에게 행에 앉아 보자. 긴 고대의 균형이 아름다운 생각, 그래서 그는의 수를 선출하는 마크 물었다 "범위의 균형을." "균형 간격"제 선택한 구간을 지칭 \ ([L, R & LT] \) , 그 선택된 중간 지점 내부에 \ (MID \) , 만족 \ (L <MID <R & 중위 \) , \ (MID \) 은 "비밀 대 약"및 간격이다 \ ([L, R] \ ) 와 \ ([미드 R] \ ) 번호 "오래된 의약품 비밀"같다.

SOV

가능한 범위는 통계 공헌을 고려, 1 일의 홀수 번호가 있어야합니다.
패리티 합산 점 후, 우측면 (10)의 각각의 수를 기록한다.
도 1은 홀수 및 홀수 쌍 1이 될 수있는 짝수 1 1 답변 기여도를 생성 할 수 페어링 짝수.
각 개별 하나의 답은 별도로 계산 될 수있다.

int main() {
    int Case;
    register int n, m = 0;
    register long long ans = 0;
    poread(Case);
    poread(n);
    for (register int i = 1; i <= n; ++i) a[i] = g(), m += a[i];
    for (register int i = n, j = m, sum = 0; i && j; --i) a[i] ? ++sum, cnt[j] = sum, sum = 0, --j : ++sum;
    register long long lr[2] = { 0, 0 };
    for (register int i = 1; i <= m; ++i) lr[i & 1] += cnt[i];
    for (register int i = 1, sum = 0, j = 1; i <= n; ++i)
        a[i] ? ++sum, lr[j & 1] -= cnt[j], ans += (long long)(sum - 1) * (cnt[j] - 1) + sum * lr[j & 1],
            sum = 0, ++j : ++sum;
    printf("%lld", ans);
}

T2 엇갈린 문자열

마크 더글러스 변호사입니다. 그의 클라이언트 유리 공 교통 사고로 사망했다. 유리의 친척이 그의 유산을 가지고하기 위해 마크는 암호를 얻을 필요가있다. 문자열의 길이는 소문자를 포함 노트북에서 유리는, 마크는 정확히 두 개의 길이로 분해 암호 문자열을 알고 (\ N-) \ 하위 시퀀스를, 그들은 반대로 문자열을 구성 프로그램의 수. 우리는 분해 방법의 두 종류, 다른 고려 경우에만, 표준 구성 SL {$, S2}의 두 세트의 세트 \ (다른 주 \) {SL, S2}와 $ $ {S2, S1} $ 우리는 같은 분해 방법이라고 생각합니다. 합법적 분해 cabaacba 총 cabaacba 및 cabaacba 이가지으로. 마크는 그가 당신에게 육백오십만 달러를주고 휴가 캄보디아에 가서 당신을 초대하기로 결정 후 일이, 당신이 그 암호를 계산하는 데 도움 수 있기를 바랍니다.

SOV

이진 검색.
검색은 왼쪽으로 나누어 넣을 수 \ (해시 \) 기록, 검색 기록 답의 오른쪽 절반을.

#include <bits/stdc++.h>
using namespace std;
short n;
long long ans;
char s[38];
unordered_map<string, long long> mp;
bool v[38];
inline void dfs1(short now) {
    if (now == n + 1) {
        string s1, s2;
        for (register int i = 1; i <= n; ++i)
            if (v[i])
                s1 += s[i];
        for (register int i = n; i; --i)
            if (!v[i])
                s2 += s[i];
        ++mp[s1 + '|' + s2];
        return;
    }
    v[now] = 0;
    dfs1(now + 1);
    v[now] = 1;
    dfs1(now + 1);
}
inline void dfs2(short now) {
    if (now == 2 * n + 1) {
        string s1, s2;
        for (register int i = n + 1; i <= 2 * n; ++i)
            if (v[i])
                s1 += s[i];
        for (register int i = 2 * n; i > n; --i)
            if (!v[i])
                s2 += s[i];
        ans += mp[s2 + '|' + s1];
        return;
    }
    v[now] = 0;
    dfs2(now + 1);
    v[now] = 1;
    dfs2(now + 1);
}
int main() {
    cin >> n;
    cin >> s + 1;
    dfs1(1);
    dfs2(n + 1);
    cout << ans / 2 << endl;
}

추천

출처www.cnblogs.com/Shiina-Rikka/p/11745198.html