人生第一场 AtCoder,纪念一下

话说年后的 AtCoder 比赛怎么这么少啊(大雾

AtCoder Beginner Contest 154 题解

A - Remaining Balls

We have A balls with the string S written on each of them and B balls with the string T written on each of them.

From these balls, Takahashi chooses one with the string U written on it and throws it away.

Find the number of balls with the string S and balls with the string T that we have now.

Solution

#include <bits/stdc++.h>
using namespace std; int a,b;
string s,t,u; int main() {
cin>>s>>t>>a>>b>>u;
if(s==u) cout<<a-1<<" "<<b<<endl;
else cout<<a<<" "<<b-1<<endl;
}

B - I miss you...

Given is a string S. Replace every character in S with x and print the result.

Solution

算一下字符串长度即可,理论上按char读进来逐个输出应该更短

#include <bits/stdc++.h>
using namespace std; string s;
int main() {
cin>>s;
for(int i=0;i<s.length();i++) cout<<"x";
}

C - Distinct or Not

Given is a sequence of integers \(A_1, A_2, ..., A_N\). If its elements are pairwise distinct, print YES; otherwise, print NO.

Solution

排序应该是比较优雅的方法吧,虽然感觉 std::map 会更短

不对,这 \(1024MB\)的内存,是不是暴力开桶不用压位都能过

#include <bits/stdc++.h>
using namespace std; int a[200005],n; int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<n;i++) {
if(a[i]==a[i+1]) {
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
}

D - Dice in Line

We have \(N\) dice arranged in a line from left to right. The \(i\)-th die from the left shows \(p_i\) numbers from \(1\) to \(p_i\) with equal probability when thrown.

We will choose \(K\) adjacent dice, throw each of them independently, and compute the sum of the numbers shown. Find the maximum possible value of the expected value of this sum.

Solution

根据期望的线性性质,很容易发现只要求个最大区间和就可以了。怎么求呢,前缀和啊。

因为没加fixed数字大时飘成科学计数法 WA 了一发,我 TM 真是个憨憨。

#include <bits/stdc++.h>
using namespace std; int n,k,p[200005]; int main() {
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>p[i], p[i]+=p[i-1];
int mx=0;
for(int i=0;i+k<=n;i++) mx=max(mx,p[i+k]-p[i]);
cout<<setiosflags(ios::fixed)<<setprecision(12)<<(k+mx)*0.5;
}

E - Almost Everywhere Zero

Find the number of integers between \(1\) and \(N\) (inclusive) that contains exactly \(K\) non-zero digits when written in base ten.

\(1 \leq N < 10^{100}\),

\(1 \leq K \leq 3\)

Solution

暴力数位 dp 即可,当然可能有更简单的方法,但我觉得推推公式什么的太麻烦了,还是直接数位 dp 吧

套路性地,设 \(f[i][j]\) 表示长度为 \(i\) 的数字串,有 \(j\) 个非零数位的方案数,转移方程

\[f[i][j] = f[i-1][j] + 9f[i-1][j-1]
\]

注意 \(i=0\) 或者 \(j=0\) 的时候需要特判一下

暴力转移预处理出 \(f[i][j]\) 后,我们来统计答案。先把 \(N\) 本身判掉,然后枚举 \(x\) 从哪一位开始比 \(N\) 小,那么这一位之前的就全部确定了(和 \(N\) 一样),这一位讨论一下是 \(0\) 和不是 \(0\) 的情况,每种情况下,这位之后的部分都只约束了非零数字的个数,求和即可得到答案。

#include <bits/stdc++.h>
using namespace std; #define int long long
const int N = 1005; char str[N];
int n,k,ans,f[N][5]; signed main() {
cin>>str+1;
n=strlen(str+1);
for(int i=1;i<=n;i++) str[i]-='0';
cin>>k;
f[0][0]=1;
for(int i=1;i<=n;i++) {
f[i][0]=f[i-1][0];
for(int j=1;j<=3;j++) {
f[i][j]=f[i-1][j]+9*f[i-1][j-1];
}
}
int cnt=0;
for(int i=1;i<=n;i++) {
//Calculate a[i] = 0
if(str[i]) {
if(k-cnt>=0) ans+=f[n-i][k-cnt];
}
//Calculate a[i] > 0
if(str[i]>1) {
if(k-cnt-1>=0) ans+=(str[i]-1)*f[n-i][k-cnt-1];
}
if(str[i]) ++cnt;
}
if(cnt==k) ++ans;
cout<<ans;
}

F - Many Many Paths

Snuke is standing on a two-dimensional plane. In one operation, he can move by \(1\) in the positive x-direction, or move by \(1\) in the positive y-direction.

Let us define a function \(f(r, c)\) as follows:

\(f(r,c) :=\) (The number of paths from the point \((0, 0)\) to the point \((r, c)\) that Snuke can trace by repeating the operation above)

Given are integers \(r_1, r_2, c_1,\) and \(c_2\). Find the sum of \(f(i, j)\) over all pair of integers \((i, j)\) such that \(r_1 ≤ i ≤ r_2\) and \(c_1 ≤ j ≤ c_2\), and compute this value modulo \((10^9+7)\).

\(1 ≤ r_1 ≤ r_2 ≤ 10^6\),

\(1 ≤ c_1 ≤ c_2 ≤ 10^6\)

Solution

首先单个答案是容易求的,根据高中数学可知 \(f(i,j) = C_{i+j}^i\)

设 \(g(i,j)\) 是它的二维前缀和,那么原答案一定可以用四个 \(g(i,j)\) 的和差表示

下面考虑如何求 \(g(i,j)\),打印一张数表看一看,很容易想到沿着 \(j\) 维度方向做差试试,观察容易得到

\[g(i,j)-g(i,j-1)=f(i,j+1)
\]

于是得到

\[g(i,j) = g(i,0) + \sum_{k=2}^{j-1} f(i,k)
\]

考虑到 \(g(i,0)\) 是显然的,而 \(f(i,j)\) 很容易做单维度递推,即

\[f(i,j) = f(i,j-1) \cdot (i+j) \cdot j^{-1}
\]

后者用逆元处理即可,每次逆元计算(使用快速幂方法)花费 \(O(\log n)\),于是我们可以在 \(O(n \log n)\) 时间内求出 \(\sum_j f(i,j)\),即求出了 \(g(i,j)\)

总体时间复杂度 \(O(n \log n)\)

#include <bits/stdc++.h>
using namespace std; #define int long long
#define ll long long
const int mod = 1e+9+7;
ll qpow(ll p,ll q) {
ll r = 1;
for(; q; p*=p, p%=mod, q>>=1) if(q&1) r*=p, r%=mod;
return r;
}
int inv(int p) {
return qpow(p,mod-2);
} const int N = 1e+6+5;
int f[N],g[N]; int solve(int i,int m) {
memset(f,0,sizeof f);
memset(g,0,sizeof g);
g[0]=i+1; f[1]=i+1;
for(int k=2;k<=m+1;k++) f[k]=f[k-1]*(i+k)%mod*inv(k)%mod;
for(int j=1;j<=m;j++) g[j]=(g[j-1]+f[j+1])%mod;
return g[m];
} signed main() {
int r1,c1,r2,c2;
cin>>r1>>c1>>r2>>c2;
--r1; --c1;
cout<<((solve(r2,c2)-solve(r1,c2)-solve(r2,c1)+solve(r1,c1)%mod+mod)%mod)<<endl;
}

AtCoder Beginner Contest 154 题解的更多相关文章

  1. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  2. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  3. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  4. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  5. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  6. AtCoder Beginner Contest 169 题解

    AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...

  7. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

  8. AtCoder Beginner Contest 151 题解报告

    总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ...

  9. AtCoder Beginner Contest 115 题解

    题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...

随机推荐

  1. 基于S2SH开发学生考勤管理系统 附源码

    开发环境: Windows操作系统开发工具:Eclipse+Jdk+Tomcat+mysql数据库 运行效果图 源码及原文链接:http://javadao.xyz/forum.php?mod=vie ...

  2. openc —— Canny 边缘检测

    边缘检测的一般步骤 [第一步]滤波 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能.常见的滤波方法主要有高斯滤波,即采用 ...

  3. mac 15 IDA7.0 下载安装

    吾爱破解上有相应的解决办法,在低版本mac上安装完成后,直接拖到15版本,再打上补丁,补丁可以自己去找,下面是转好了的,mac解压最好不要用自带的解压软件,用BetterZip试试,不行就多解压几次, ...

  4. JS中0.1+0.2!=0.3

    在控制台输入0.1+0.2,会得出以下结果 即不等于0.3.下面我们说一下原因. 一.存储原理 1.在计算机中数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的.2.在JS中数字采用的IEEE ...

  5. JQuery调用WebService封装方法

    //提交的webservice链接 //var url = "/wsstafffrate?OpenWebService"; //请求前拼接好的soap字符串 //var soapd ...

  6. nodejs编程优化

    如何编写优化的 JavaScript 对象属性的顺序:始终以相同的顺序实例化对象属性,以便共享的隐藏类和随后优化的代码可以共享之.   动态属性:在实例化之后向对象添加属性将强制执行隐藏的类更改,并降 ...

  7. IIS在已有站点上->添加应用程序命令

    已有站点:HTTP80 %systemroot%\system32\inetsrv\APPCMD ADD APP /SITE.NAME:"HTTP80" /path:/Redire ...

  8. element使用

    官方网址: 点击 全局使用 1.创建项目 vue init webpack vue-ele 配置 2.安装依赖 npm install 3.安装loader模块(开发) npm install sty ...

  9. 从应用的角度去学习Python--为孩子下载课本

    最近,孩子上课都没有课本,老师给发的是一个微信链接,打开看可以,打印打不全.怎么办?我就想既然能看,从爬虫的角度就一定可以抓下来! 在Chrome中打开网址,好家伙!一堆的Script之类的玩意儿.经 ...

  10. ArcGIS Server 地图服务,查询出错 Error performing query operation

    Error: Error performing query operation Error Message Querying a layer from a Map Service that retur ...