교육 Codeforces 라운드 73 (사업부 정격. 2) 세 번째 펀치

A : 질문의 의미 열 수를 문자열로, 수는 2,048을 할 수 있는지 물어, 두 개의 동일한 병합
2에서 11 의 숫자, 다음 * = 2, 최종 합계를 볼 수있는이 때마다 동일한 필요성보다 큰 경우, 시작 순회 아래, 캔

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#define up(i,a,b)  for(int i=a;i<b;i++)
#define dw(i,a,b)  for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
    char ch = getchar(); ll x = 0, f = 1;
    while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
int q;
int n;
const int N = 1e3 + 10;
ll s[N];
map<ll, ll>mp;
int main()
{
    q = read();
    while (q--)
    {
        mp.clear();
        n = read();
        upd(i, 1, n)s[i] = read();
        upd(i, 1, n)
        {
            up(j, 0, 40)
            {
                if ((1ll << j)&s[i])
                    mp[j]++;
            }
        }
        ll sum = 0;
        ll need = 1;
        int flag = 1;
        dwd(i, 11, 0)
        {
            if (mp[i]+sum >= need)
            {
                flag = 0;
                break;
            }
            else
            {
                sum *= 2;
                sum += mp[i] * 2;
                need *= 2;
            }
        }
        if (!flag)
        {
            printf("yes\n");
        }
        else printf("no\n");
    }
}

B는 : 질문의 의미 체스 말을 넣어 보드에 가장 큰 공격을 서로 부탁드립니다.
DFS는 할 수 있습니다.


C : 반을 클릭합니다. 이전 루틴은 cf.


D : DP
문제 의미 시퀀스 (A)의 일련의 순서로 같은 인접한 두 개의 동일하지 않은 것이다. 다음은 내가 상승은 B 1 소요 내가 , 최소의 비용을 부탁드립니다.
내가 찾을 수있는 것, 둘 사이의 중간에 잡힌 각각 첫 번째와 마지막에 더하여, 그것은 우리가 x가받을 수 없어 가정 있도록 각 숫자의 중간은 우리가 추가,이 걸릴 수 있다는 것을 의미한다 X + 1은 반드시 인접하는 같은 수의 요소를, X + 2, X + 2로 촬영되지 않은 경우 1, X + 1이된다.
우리는 DP 전략을 가지고 그래서, 각 숫자는 완전히없는 요소를 이웃 같은 배열을 만들 수있을 것입니다, 2까지 상승.
[I]는 [J]를 내가 일 상승 J를 나타냅니다 DP 확인 오 때, 모든 숫자가 이탈리아 대회 최소 비용의 앞입니다.
거기에 전송
(A I. 1 + K! A = I + J) DP [I] [J] DP = [. 1-I] [K] J * B + I

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#define up(i,a,b)  for(int i=a;i<b;i++)
#define dw(i,a,b)  for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
    char ch = getchar(); ll x = 0, f = 1;
    while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
int q;
int n;
const int N = 3e5 + 10;
ll a[N], b[N];
ll dp[N][5];
int main()
{
    q = read();
    while (q--)
    {
        n = read();
        upd(i, 1, n)
            a[i] = read(), b[i] = read();
        upd(i, 1, n)
            upd(j, 0, 2)dp[i][j] = 1e18 + 1;
        upd(i, 1, n)
        {
            upd(j, 0, 2)
            {
                upd(k, 0, 2)
                {
                    if (a[i - 1] + j == a[i] + k)continue;
                    dp[i][k] = min(dp[i][k], dp[i - 1][j] + 1ll*k * b[i]);
                }
            }
        }
        ll minans = 1e18 + 1;
        upd(j, 0, 2)
            minans = min(dp[n][j], minans);
        printf("%lld\n", minans);
    }
    return 0;
}

E 제목 : 질문의 의미
문자열 01 위치 0으로 대체 될 수있다 (1), (X)이되고, Y는 본 게임이고, 우세 X, X 번호 0~1마다 반전 될 수 있고, Y는 역방향 (B)에 제로가 될 수있다 사람이 더 이상 역방향 출력 할 수있는 경우 때 사람은 켜 없습니다.
우선, 인접 셀, B를 포함 할 수 있으며 못해 존재한다는 것을 의미하는 중요한 조건, A> B가있다. 우리는이로 시작합니다.
1. 때 본 구간 A> 구간 길이> = B, 단 A 및 B 커버로 이동 될 수 있다는 것을 의미한다. 당신이 X에서 승리 할 경우, X 커버 부분의 길이의 말에주의해야한다,이 시간이 다른 이전 단계 y를하는 경우, 간격이 덮어 될 것입니다, 다음 X 때문에 단지> 렌>, 손실 =됩니다 B 영역.
> = 2 인 경우 2. B는 두 개 이상의 부분이고, 또, Y가 다음 적어도 하나 개의 플립 2는 x를 파괴 할 수있다 우세하기 때문에, 전술 한 케이스로 변환 될 수 이 선택 덮어만큼 시간 후, B 구간 구간, 즉 상기 첫 번째 경우를 길이 잔존하고 x는 ~ B 사이에 잃을 것이다.
3. 2의 경우 B 구간은 0이다. 이 의미에서의 구간 길이 모든 2 B> LEN> = A, x 및 대응으로 판정 할 수있는 모든 구간의 다음 수만 간격 후에 덮어마다, 간격이 더 이상 새로운 덮어 쓸 수없는 Y 가.
제 2 경우에 B 구간이있다. 우리는 그 구간의 길이를 가로 질러, 각각의 시간에 복용 X 이기면 표시 케이스의 좌우를 결정한다. 첫째, 양측은 위의 경우 (1)에 표시 할 수 없거나 다른 잃게됩니다. 단지 세 번째 경우 그래서, 패리티를 판정 할 수있다.
우리는 지난 2를 보면 그래서
첫 번째 경우에서 B <A, 및 모양, 두 번째 경우에는 변화가 없다, 그것은 변화하지 않았다. 2 경우 세 번째 경우는, B 기간은 제로 다음 제로 간격 A는, X는 잃게된다.
(2)이있는 경우 제 경우는
B 구간이 구간은 A> LEN> 2 * B>

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#define up(i,a,b)  for(int i=a;i<b;i++)
#define dw(i,a,b)  for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
    char ch = getchar(); ll x = 0, f = 1;
    while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
const int N = 3e5 + 10;
int q;
int a, b;
string s;
int cnt[N];
int main()
{
    q = read();
    while (q--)
    {
        a = read(), b = read();
        cin >> s;
        int n = s.size();
        int top = 0;
        bool flag = 0;
        memset(cnt, 0, sizeof(cnt));
        up(i, 0, n)
        {
            if (s[i] == '.')
            {
                if (!flag)++top, flag = 1;
                cnt[top]++;
            }
            else flag = 0;
        }
        int cnta = 0; int cntb = 0; int cntc = 0;
        int pos;
        upd(i, 1, top)
        {
            if (cnt[i] >= b && cnt[i] < a)cntc = 1;
            if (cnt[i] >= 2 * b)cntb++,pos=i;
            if (cnt[i] >= a)cnta++;
        }
        if (cntc)
        {
            printf("no\n");
            continue;
        }
        if (cntb >= 2)
        {
            printf("no\n");
            continue;
        }
        if (cntb == 0)
        {
            if (cnta & 1)printf("yes\n");
            else printf("no\n");
            continue;
        }
        bool ok = 0;
        upd(i, 0,  cnt[pos]-a)
        {
            int left = i;
            int right = cnt[pos] - i - a;
            if (left >= b && left < a || right >= b && right < a)continue;
            if (left >= 2 * b || right >= 2 * b)continue;
            int temp = (cnta + (left >= a) + (right >= a));
            if (temp % 2)
                ok = 1;
        }
        if (ok)printf("yes\n");
        else printf("no\n");
    }
    return 0;
}

추천

출처www.cnblogs.com/LORDXX/p/12004782.html