AtCoder ExaWizards 2019 简要题解

Tags:题解


link:https://atcoder.jp/contests/exawizards2019

很水的一场ARC啊,随随便便就ABCDE了,F最后想到了还没有写出来。

D题花了太久时间所以只有Rank31,我是真的菜。

嘿嘿嘿,上述装逼方式是我最为反感的机房里的言语,既然快退役了,也就学一学,感受一下机房里dalao们怎么样装逼一时爽、一直装逼一直爽,听者一时丧,一直听一直丧的快感咯

有意思的题应该是DE了。

A Regular Triangle

如果三个数相等输出Yes,否则No

#include<iostream>
using namespace std;
int main()
{
int A,B,C;
cin>>A>>B>>C;
if(A==B&&B==C) puts("Yes");
else puts("No");
}

B Red or Blue

字符串中R个数超过一半输出Yes,否则No

#include<iostream>
using namespace std;
int n,a;
char s[1000000];
int main()
{
cin>>n;
scanf("%s",s+1);
for(int i=1;i<=n;i++)
if(s[i]=='R') a++;
if(a*2>n) puts("Yes");
else puts("No");
}

C Snuke the Wizard

一排格子,每个格子有一个属性,用小写字母表示。

初始每个格子上都有一枚硬币,Q次操作形如某种属性的格子上的硬币全部左移或右移一位。

移出边界就消失,问最后剩余硬币数。

发现移出去的一定是一段前缀和一段后缀,具有可二分性。

#include<iostream>
using namespace std;
const int N=2e5+10;
int n,Q;
char s[N],t[N],d[N];
int Drop(int x)
{
for(int i=1;i<=Q;i++)
{
if(s[x]==t[i]) x+=(d[i]=='R')?1:-1;
if(x>n) return -1;
if(x<1) return 1;
}
return 0;
}
int main()
{
cin>>n>>Q;
scanf("%s",s+1);
for(int i=1;i<=Q;i++) cin>>t[i]>>d[i];
int l=1,r=n,la=0,ra=n+1;
while(l<=r)
{
int mid=(l+r)>>1;
if(Drop(mid)==1) la=mid,l=mid+1;
else r=mid-1;
}
l=1,r=n;
while(l<=r)
{
int mid=(l+r)>>1;
if(Drop(mid)==-1) ra=mid,r=mid-1;
else l=mid+1;
}
cout<<ra-la-1<<endl;
}

D Modulo Operations

给一个长度为\(n\)的数列和\(X\),对于一种排列,其权值为X依次对排列中的数取模、最后剩下的值。

问\(n!\)种情况的权值和。\(n\le 200,X\le 10^5\)

详见UOJ22。有一个性质就是大的数排在小的数的后面,则那个大数没有影响。

所以从大往小排序后依次做。设\(f[i][j]\)表示做了\(i\)次操作,剩余数为\(j\)的方案数。

转移有两种:

  • 选\(f[i+1][j\%p[i]]+=f[i][j]\)
  • 不选\(f[i+1][j]+=f[i][j]*(n-i)\)

即如果选了这个数则必须放在这一位,否则可以放在后面\(n-i\)个数的任意一位。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,mod=1e9+7;
int n,X,f[N],Ans,g[N],s[N];
int cmp(int a,int b) {return a>b;}
int main()
{
cin>>n>>X;
f[X]=1;
for(int i=1;i<=n;i++) cin>>s[i];
sort(s+1,s+n+1,cmp);
for(int i=1,x;i<=n;i++)
{
x=s[i];
for(int j=0;j<=X;j++) g[j]=0;
for(int j=0;j<=X;j++)
{
(g[j%x]+=f[j])%=mod;
(g[j]+=1ll*f[j]*(n-i)%mod)%=mod;
}
for(int j=0;j<=X;j++) f[j]=g[j];
}
for(int j=0;j<=X;j++) (Ans+=1ll*f[j]*j%mod)%=mod;
cout<<Ans<<endl;
}

E Black or White

有一些黑球和白球,如果两种球都有则各有一半的几率取出,否则一定取出剩下的那种颜色的求。

对于\(i\le 2e5\),求第\(i\)次拿到黑球的概率。

令前\(i\)次把白球拿完的概率是\(T_w\),把黑球拿完的概率是\(T_b\),则第\(i+1\)次取出黑球的概率是\(T_w+(1-T_W-T_b)*\frac{1}{2}\)。

转成在恰好第\(i\)次拿完白球的概率\(g_i=2^{i}{i-1 \choose W-1}\),\(W\)为白球总数。

#include<iostream>
using namespace std;
const int N=2e5+10,mod=1e9+7;
int jc[N],inv[N],bit[N],B,W,sw[N],sb[N];
int ksm(int x,int k)
{
int s=1;for(;k;k>>=1,x=1ll*x*x%mod)
if(k&1) s=1ll*s*x%mod;return s;
}
int C(int n,int k) {return 1ll*jc[n]*inv[k]%mod*inv[n-k]%mod;}
int main()
{
cin>>B>>W;
jc[0]=bit[0]=inv[0]=1;
for(int i=1;i<=B+W;i++) jc[i]=1ll*i*jc[i-1]%mod;
for(int i=1;i<=B+W;i++) inv[i]=ksm(jc[i],mod-2);
for(int i=1;i<=B+W;i++) bit[i]=1ll*bit[i-1]*inv[2]%mod; for(int i=W;i<B+W;i++)
sw[i]=1ll*bit[i]*C(i-1,i-W)%mod;
for(int i=B;i<B+W;i++)
sb[i]=1ll*bit[i]*C(i-1,i-B)%mod;
for(int i=1;i<=B+W;i++)
{
(sw[i]+=sw[i-1])%=mod;
(sb[i]+=sb[i-1])%=mod;
}
for(int i=1;i<=B+W;i++)
{
int w=(sw[i-1]+1ll*((mod+1-sw[i-1]-sb[i-1])%mod+mod)%mod*
(i==B+W?1:inv[2])%mod)%mod;
cout<<w<<endl;
}
}

F More Realistic Manhattan Distance

给你一张网格图,同一行或同一列的边的方向都一样,求多组询问,问两点之间的最短路。

发现有用的边就只有距离起点终点四个方向最近的两条边,一共16条边,把交点抠出来跑最短路就好了。

我的实现方式要3700ms,租酥雨只要跑970ms真的墙。

#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
const int N=2e5+10,mod=1e9+7;
int n,m,q,Ans,HH[N],ZZ[N],dis[N],vis[N];
char s[N],t[N];
set<int> H[2],Z[2];
queue<int> Q;
struct Node{int x,y;}P[N];
void GetAns(int x1,int y1,int x2,int y2)
{
int ch=0,cz=0,c=0;
set<int>::iterator it;
for(int i=0;i<2;i++)
{
it=H[i].lower_bound(x1);
if(it!=H[i].end()) HH[++ch]=*it;
if(it!=H[i].begin()) HH[++ch]=*(--it);
it=H[i].lower_bound(x2);
if(it!=H[i].end()) HH[++ch]=*it;
if(it!=H[i].begin()) HH[++ch]=*(--it); it=Z[i].lower_bound(y1);
if(it!=Z[i].end()) ZZ[++cz]=*it;
if(it!=Z[i].begin()) ZZ[++cz]=*(--it);
it=Z[i].lower_bound(y2);
if(it!=Z[i].end()) ZZ[++cz]=*it;
if(it!=Z[i].begin()) ZZ[++cz]=*(--it);
}
sort(HH+1,HH+ch+1);
ch=unique(HH+1,HH+ch+1)-HH-1;
sort(ZZ+1,ZZ+cz+1);
cz=unique(ZZ+1,ZZ+cz+1)-ZZ-1; for(int i=1;i<=ch;i++)
for(int j=1;j<=cz;j++)
P[++c]=(Node){HH[i],ZZ[j]};
for(int i=1;i<=c;i++)
if(P[i].x==x1&&P[i].y==y1)
dis[i]=0,Q.push(i),vis[i]=1;
else dis[i]=1e9;
while(!Q.empty())
{
int x=Q.front();
for(int i=1;i<=c;i++)
{
if(P[i].x!=P[x].x&&P[i].y!=P[x].y) continue;
if(P[i].x==P[x].x)
{
if(P[i].y>P[x].y&&s[P[i].x]=='W') continue;
if(P[i].y<P[x].y&&s[P[i].x]=='E') continue;
}
if(P[i].y==P[x].y)
{
if(P[i].x>P[x].x&&t[P[i].y]=='N') continue;
if(P[i].x<P[x].x&&t[P[i].y]=='S') continue;
}
int val=dis[x]+abs(P[i].x-P[x].x)+abs(P[i].y-P[x].y);
if(dis[i]<=val) continue;
dis[i]=val;
if(!vis[i]) Q.push(i),vis[i]=1;
}
Q.pop(),vis[x]=0;
}
for(int i=1;i<=c;i++)
if(P[i].x==x2&&P[i].y==y2)
Ans=dis[i];
}
int main()
{
scanf("%d%d%d%s%s",&n,&m,&q,s+1,t+1);
for(int i=1;i<=n;i++)
if(s[i]=='E') H[1].insert(i);
else H[0].insert(i);
for(int i=1;i<=m;i++)
if(t[i]=='N') Z[1].insert(i);
else Z[0].insert(i);
for(int i=1,x1,y1,x2,y2;i<=q;i++)
{
cin>>x1>>y1>>x2>>y2;
GetAns(x1,y1,x2,y2);
if(Ans==1e9) puts("-1");
else printf("%d\n",Ans);
}
return 0;
}

AtCoder ExaWizards 2019 简要题解的更多相关文章

  1. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  2. [题解][Codeforces]Good Bye 2019 简要题解

    构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...

  3. AtCoder ABC 215 简要题解

    A - B 模拟 C 可以直接爆搜,也可以写逐位确定的多项式复杂度算法,使用多重组合式求随意乱排的方案数. D 首先对 \(A\) 所有数暴力分解质因数,然后把遇到过的质因数打上标记. 接下来再对 \ ...

  4. AtCoder ExaWizards 2019 D Modulo Operations

    题意 给出一个长度为\(n\)的数列和数字\(X\),对于数列的每一种排列,其权值\(X\)依次对排列中的数取模,求出\(n!\)种情况最后剩下的数的权值和 分析 如果大的数字排在小的数字后面,那么大 ...

  5. CSP-S 2019 简要题解

    从这里开始 又考炸了,sad.....明年应该在准备高考了,考完把坑填了好了. 一半题都被卡常,qswl.[我汤姆要报警.jpg] dfs 怎么这么慢呀,sad..... i7 牛逼! 写的比较混乱, ...

  6. HNOI2019 简要题解

    HNOI 2019 简要题解 没想到自己竟也能有机会写下这篇题解呢. LOJ Luogu Day1T1 鱼 枚举\(AD\)两点后发现\(BC\)与\(EF\)相对独立,因此只需要计算合法的\(BC\ ...

  7. 2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解

    2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解 update10.01 突然发现叉姐把这场的题传到牛客上了,现在大家可以有地方提交了呢. 不知道该干什么所以就来水一篇题解 ...

  8. 【AtCoder】ExaWizards 2019

    ExaWizards 2019 C - Snuke the Wizard 发现符文的相对位置不变,直接二分某个位置是否到达最左或最右来计算 #include <bits/stdc++.h> ...

  9. AtCoder diverta 2019 Programming Contest 2

    AtCoder diverta 2019 Programming Contest 2 看起来我也不知道是一个啥比赛. 然后就写写题解QWQ. A - Ball Distribution 有\(n\)个 ...

随机推荐

  1. Android-滑动解锁高亮文字自定义TextView

    public class HightLightTextView extends TextView { // 存储view的宽度 private int mTextViewWidth = 0; // 画 ...

  2. JS笔记(二):对象

    (一) 对象 对象是JS的基本数据类型,类似于python的字典.然而对象不仅仅是键值对的映射,除了可以保持自有的属性,JS对象还可以从一个称为原型的对象继承属性,对象的方法通常是继承的属性.(这种对 ...

  3. [20171113]修改表结构删除列相关问题4.txt

    [20171113]修改表结构删除列相关问题4.txt --//连续写了3篇修改表结构删除列的相关问题,链接如下: http://blog.itpub.net/267265/viewspace-214 ...

  4. woff字体MIME类型配置

    <system.webServer> <staticContent> <remove fileExtension=".woff" /> < ...

  5. CentOS乱码解决方法

    linux 中文显示乱码解决办法, 其实是有多种情况的, 有一部分是由于终端默认的设置造成的 vi /etc/sysconfig/i18n 将内容改为LANG="zh_CN.GB18030& ...

  6. 监控.net 网站 Glimpse

    使用Nuget 安装Glimpse 安装好后,config会默认添加几个节点 安装好之后 只需要浏览器输入  网站/Glimpse.axd 再次进入网站 就可以查看(ajax sql session ...

  7. 解决关于phpstorm打开速度很慢的问题

    我的电脑是GTX950M , 8G 内存的 ,配置不算低但是打开phpstorm的速度非常的慢.基本上每次打开都要花一分钟以上,虽然打开sublime text3 只需要三四秒,但是phpstorm功 ...

  8. Alpha冲刺博客汇总(麻瓜制造者)

    目录 Alpha冲刺报告 Github项目地址 测试报告与用户反馈博客地址 课程展示博客地址 事后诸葛亮 Alpha冲刺报告 Alpha冲刺报告(1/12)(麻瓜制造者) Alpha冲刺报告(2/12 ...

  9. Sring容器技术内幕之InstantiationStrategy类介绍

    引言 org.springframework.beans.factory.support.InstantiationStrategy负责根据BeanDefinition对象创建一个Bean实例.Spr ...

  10. 【转】BASE64编码简介

    BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据. 这是一种可逆的编码方式. 编码后的数据是一个字符串,其中包含的字符为:A-Z.a-z.0-9.+./ 共64个字符:26 ...