Codeforces 라운드 # 553 (사업부. 2) 솔루션

Codeforces 라운드 # 553 (사업부. 2) 솔루션

오늘 아침 열린 \ (\ RM 부사장 \) , 최초의 네 가지 질문은 물이다 보니 \ (\의 RM은 E, F를 \ ) 쓰기 나 후 \을 (\ RM F \) , 혈액 손실 중 다음하지 조정 ... 게임은 찾을 후 \ (\ RM E \) 정말 물을 ...


게임 포털 : https://codeforces.com/contest/1151

A. 맥심 및 생물학

https://codeforces.com/contest/1151/problem/A

직접 폭력을 잘.

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

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf long double
#define ll long long 

#define pii pair<int,int >
#define vec vector<int >

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) 

const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-12;
const int mod = 1e9+7;

int n;
char s[maxn];

int get(int a,int b) {
    return min(abs(a-b),26-max(a,b)+min(a,b));
}

signed main() {
    read(n);scanf("%s",s+1);
    int ans=1e9;
    for(int i=1;i<=n-3;i++) ans=min(ans,get(s[i],'A')+get(s[i+1],'C')+get(s[i+2],'T')+get(s[i+3],'G'));
    write(ans);
    return 0;
}

B. 디마과 나쁜 XOR

https://codeforces.com/contest/1151/problem/B

이 문제는 매우 이상하다 ... 난 그냥 잤어요 ...

우리는 임의 만 시간 중 각 열 난수, 오류의 확률이하는 경향이 고려 (0 \) \ 가.

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

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf long double
#define ll long long 

#define pii pair<int,int >
#define vec vector<int >

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) 

const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-12;
const int mod = 998244353;
const int inv2 = 499122177;

int n,m,a[505][505],t[505];

signed main() {
    srand(time(0));
    read(n),read(m);FOR(i,1,n) FOR(j,1,m) read(a[i][j]);
    for(int i=1;i<=20000;i++) {
        int res=0;
        for(int j=1;j<=n;j++) res^=a[j][t[j]=rand()%m+1];
        if(res) {
            puts("TAK");
            for(int k=1;k<=n;k++) printf("%d ",t[k]);
            puts("");return 0;
        }
    }puts("NIE");
    return 0;
}

나자르을위한 C. 문제

https://codeforces.com/contest/1151/problem/C

곱셈은 ​​다음 질문 시뮬레이션의 의미를 누르십시오.

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

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf long double
#define ll long long 

#define pii pair<int,int >
#define vec vector<int >

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) 

const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-12;
const int mod = 1e9+7;
const int inv2 = 5e8+4;

int a[2];

int sum(int x,int y,int t) {
    int qwe=(y-x+1)%mod;
    x<<=1,y<<=1;if(t) x--,y--;
    x%=mod,y%=mod;
    return 1ll*(x+y)*qwe%mod*inv2%mod;
}

int solve(int r) {
    int tot=0,now=1,kd=1;
    int ans=0;a[0]=a[1]=1;
    while(tot<r) {
        if(tot+now>r) ans+=sum(a[kd],a[kd]+r-now,kd);
        else ans+=sum(a[kd],a[kd]+now-1,kd);
        a[kd]+=now,tot+=now,now<<=1,kd^=1;
    }return (ans%mod+mod)%mod; 
}

signed main() {
    int l,r;read(l),read(r);
    write((solve(r)-solve(l-1)+mod)%mod);
    return 0;
}

D. 스타스와 뷔페에서 대기열

https://codeforces.com/contest/1151/problem/D

수식 열려 :
\ [nb_i-A_I + J \ CDOT (A_I-B_i) \]
따라서, 직접 그리 따른 \ (A_I-b_i \) 와 같은 선별.

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

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf long double
#define ll long long 

#define pii pair<int,int >
#define vec vector<int >

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) 

const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-12;
const int mod = 998244353;
const int inv2 = 499122177;

int n,a[maxn],b[maxn],t[maxn];

signed main() {
    read(n);FOR(i,1,n) read(a[i]),read(b[i]),t[i]=a[i]-b[i];
    sort(t+1,t+n+1);int res=0;
    for(int i=n;i;i--) res+=t[n-i+1]*i;
    for(int i=1;i<=n;i++) res+=-1*a[i]+n*b[i];
    write(res);
    return 0;
}

구성 요소의 E. 수

https://codeforces.com/contest/1151/problem/E

숲 통신 블록 번호 주목 \ (= \하는) 포인트 (- \) \ 변의 참조.

각 지점의 열거 및 라인의 각 가장자리에 기여.

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

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
#define ll long long

void print(ll x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(ll x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf double

#define pii pair<int,int >
#define vec vector<int >

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) 

const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-8;

ll ans,s;
int n,a[maxn];

int c(int x) {return x*(x-1)/2+x;}

signed main() {
    read(n);FOR(i,1,n) read(a[i]),ans+=c(n)-c(n-a[i])-c(a[i]-1);
    FOR(i,1,n-1) {
        int l=min(a[i],a[i+1]),r=max(a[i],a[i+1]);
        ans-=1ll*l*(n-r+1);
    }write(ans);
    return 0;
}

F. 소냐와 정보학

https://codeforces.com/contest/1151/problem/F

이것은이 독특한 제목에 조금 어렵습니다 ...아마도 내가 너무 요리 옳았다

최종 상태는 주목해야 전술 \ (K \) \ (0 \) 모두 뒤에 \ (1 \) , \는 (K \) 의 시작이다 \ (0 \) 번호.

우리는 폭력 고려 \ (DP \) 설정 \ (F [I] [J ] \) (A)의 표현 (\ 나 \) 이전 작업 \ (케이 \) 의 위치가 한 \ (j의 \)를 \ (0 \) 의 경우 총 수.

그리고 여러 가지 상황을 열거 전송 :

  • 전면 (전면 수단 \ (K \) 흰색 번째 위치) \ ((0) \) 검정 뒤에 (\. (1) \) \ (\ RM 스왑 \) 후 흰색 앞에 번호 (\ -1 \) , 프로그램 번호 (\ I (NK- (기)) \) .
  • 전후 블랙 화이트 변화 흰색 수 \ (+ \ 1) , 프로그램 번호 및 상기와 동일한 이유.
  • 같은 색상 변경, 흰색 같은 수의.
  • 그리고 앞 또는 변환기 변화, 흰색 같은 수의 전면과 후면 뒤에.

이러한 복잡성은 전사 \ (O (NK) \) 하지만 \ (케이 \)를 도 않았다.

주목 \ N- (\)(\ 100 \) 우리는 위의 복잡성 전달 매트릭스를 최적화 \ (N- (O를 ^. 3 \ 로그 K) \) .

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

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf long double
#define ll long long 

#define pii pair<int,int >
#define vec vector<int >

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) 

const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-12;
const int mod = 1e9+7;

int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;}
void inc(int &x,int y) {x+=y;x%=mod;}

int n,k,a[maxn],res,c;

int qpow(int a,int x) {
    int res=1;
    for(;x;x>>=1,a=1ll*a*a%mod) if(x&1) res=1ll*res*a%mod;
    return res;
}

struct Matrix {
    int a,b,r[110][110];

    Matrix () {a=b=0,memset(r,0,sizeof r);}
    
    Matrix operator * (const Matrix &t) const {
        Matrix res;res.a=a,res.b=t.b;
        for(int i=0;i<=a;i++)
            for(int j=0;j<=t.b;j++)
                for(int k=0;k<=b;k++)
                    res.r[i][j]=add(res.r[i][j],mul(r[i][k],t.r[k][j]));
        return res;
    }
}tr,ans;

signed main() {
    read(n),read(k);
    for(int i=1;i<=n;i++) read(a[i]),res+=!(a[i]&1);
    for(int i=1;i<=res;i++) c+=!a[i];
    ans.a=0,ans.b=res;ans.r[0][c]=1;tr.a=tr.b=res;
    for(int i=0;i<=res;i++) {
        int lw=i,lb=res-i,rw=res-lw,rb=n-res-lb;
        if(i!=res) inc(tr.r[i][i+1],lb*rw%mod);
        if(i!=0) inc(tr.r[i][i-1],lw*rb%mod);
        inc(tr.r[i][i],(res*(res-1)+(n-res)*(n-res-1))%mod*qpow(2,mod-2)%mod);
        inc(tr.r[i][i],(lw*lb+rw*rb)%mod);
    }
    int x=k,f=0;
    for(;x;x>>=1,tr=tr*tr) if(x&1) ans=ans*tr;
    FOR(i,0,res) f=(f+ans.r[0][i])%mod;write(ans.r[0][res]*qpow(f,mod-2)%mod);
    return 0;
}

추천

출처www.cnblogs.com/hbyer/p/11025016.html