# Educational Codeforces Round 109 (Rated for Div. 2) A~E (VP)

16 篇文章 0 订阅

A. Potion-making

void solve(){
cin>>k;
int x=k,sum=100;
sum-=x;
int d=gcd(x,sum);
print(x/d+sum/d);
}


B. Permutation Sort

void solve(){
if(check()) print(0);
else if(n==a[n]||1==a[1]) print(1);
else if(n==a[1]&&1==a[n]) print(3);
else print(2);
}


C. Robot Collisions

#define int LL
const int N=300010,M=N*2,mod=1e9+7;
int n,m,k;//,a[N],b[N];
string p;
struct Rob{
int x,v,id;
}a[N];
stack<Rob> J,O;
int ans[N];

int calc(Rob A,Rob B){
if(A.v==B.v){
if(A.v==1) return (m-A.x+m-B.x)/2;
else return (A.x+B.x)/2;
}
else{
if(A.x>B.x) swap(A,B);
if(A.v==1) return (B.x-A.x)/2;
else return (m-B.x+A.x+m)/2;
}
}

void solve(){
while(J.size()) J.pop(); while(O.size()) O.pop();
rep(i,1,n) ans[i]=-1;
rep(i,1,n){
char op[2];
scanf("%s",op);
if(*op=='L') a[i].v=-1;else a[i].v=1;
}

sort(a+1,a+1+n,[](Rob &A,Rob &B){
return A.x < B.x;
});

for(int i=1;i<=n;++i){
if(a[i].v==1){
a[i].x%2==0?O.push({a[i].x,a[i].v,a[i].id}):J.push({a[i].x, a[i].v,a[i].id});
}
else
if(a[i].x%2==0){
if(O.size()) ans[O.top().id]=ans[a[i].id]=calc(O.top(), a[i]),O.pop();
else O.push(a[i]);
}
else{
if(J.size()) ans[J.top().id]=ans[a[i].id]=calc(J.top(), a[i]),J.pop();
else J.push(a[i]);
}
}

while(J.size()>1) {
auto a=J.top();J.pop();
auto b=J.top();J.pop();
ans[a.id]=ans[b.id]=calc(a,b);
}while(O.size()>1) {
auto a=O.top();O.pop();
auto b=O.top();O.pop();
ans[a.id]=ans[b.id]=calc(a,b);
}
rep(i,1,n) printf("%d ",ans[i]);
puts("");
}


D. Armchairs

f[i][j] = f[i-1][j];
if(!st[i]) f[i][j]=min(f[i][j], f[i-1][j-1]+abs(j-b[i])


#define int LL
const int N=5010,M=N*2,mod=1e9+7;
int n,m,k,a[N],b[N],idx,f[N][N];
bool st[N];

void solve(){
memset(f,0x3f,sizeof f);
rep(i,0,n) f[0][i]=0;
for(int i=1;i<=idx;++i){
for(int j=1;j<=n;++j){
f[i][j]=f[i][j-1];
if(!st[j])
f[i][j]=min(f[i][j], f[i-1][j-1]+abs(j-b[i]));
}
}
int ans=mod;
for(int i=1;i<=n;++i) ans=min(ans, f[idx][i]);
print(ans);
}


E. Assimilation IV （补题）

const int N=200010,M=N*2,mod=998244353;
int n,m,dist[N][25],fact;
/*算出不能控制的纪念碑的期望，然后总数减去便是答案*/
void solve(){
fact=1;
for(int i=1,x;i<=n;++i){
fact=1ll*fact*i%mod;  //所有情况数
}
int ans=0;
for(int i=1;i<=m;++i){ //依次计算分子
int tmp=1,tot=0;
for(int j=n;j;--j){ //从第n个操作开始枚举
tot += dist[i][j+1];
tmp=1ll*tmp*tot%mod;
tot -= 1; //被选择了一个点
}
ans=(1ll*fact-tmp+mod+ans)%mod;
}
ans=1ll*ans*fpower(fact,mod-2,mod)%mod;
print(ans);
}

• 0
点赞
• 0
收藏
觉得还不错? 一键收藏
• 0
评论
05-16 425

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。