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;
}