A:

音乐研究

时间限制:1秒

空间限制:32768K

美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究。他有两段音频,每段音频是一个表示音高的序列。现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分。

具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 difference 最小。两段等长音频的 difference 定义为:
difference = SUM(a[i] - b[i])2 (1 ≤ i ≤ n),其中SUM()表示求和 
其中 n 表示序列长度,a[i], b[i]分别表示两段音频的音高。现在袋鼠先生想要知道,difference的最小值是多少?数据保证第一段音频的长度小于等于第二段音频的长度。

输入描述:
第一行一个整数n(1 ≤ n ≤ 1000),表示第一段音频的长度。
第二行n个整数表示第一段音频的音高(0 ≤ 音高 ≤ 1000)。
第三行一个整数m(1 ≤ n ≤ m ≤ 1000),表示第二段音频的长度。
第四行m个整数表示第二段音频的音高(0 ≤ 音高 ≤ 1000)。
输出描述:
输出difference的最小值
输入例子:
2
1 2
4
3 1 2 4
输出例子:
0

暴力跑就行,刚开始没看清题目写了非连续的浪费了好多时间:
红q添加了10w的数据量的解法,就是开方以后处理,并且加上FFT乘法把 $ \sum_{j=1}^{j<=n} a_i b_{i+j} $ 快速处理出来。
暴力版:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define clr(x) memset(x,0,sizeof(x))
#define clrmax(x) memset(x,0x3f,sizeof(x))
#define LL long long
using namespace std;
LL dp[][];
LL mindp[];
int high1[],high2[];
int main()
{
int n,m;
clrmax(mindp);
mindp[]=;
clr(dp);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&high1[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%d",&high2[i]);
LL sum;
LL ans=1e18;
for(int j=;j<=m-n+;j++)
{
sum=;
for(int i=j;i<j+n;i++)
{
sum+=1LL*(high1[i-j+]-high2[i])*(high1[i-j+]-high2[i]);
}
if(sum<ans)
ans=sum;
}
printf("%lld\n",ans);
return ;
}

A

B:

锦标赛

时间限制:1秒

空间限制:32768K

组委会正在为美团点评CodeM大赛的决赛设计新赛制。

比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛、复赛的成绩,会有不同的积分。比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 2 人,m/2 组的人分别厮杀。我们假定积分高的人肯定获胜,若积分一样,则随机产生获胜者。获胜者获得参加下一轮的资格,输的人被淘汰。重复这个过程,直至决出冠军。

现在请问,参赛者小美最多可以活到第几轮(初始为第0轮)?

输入描述:
第一行一个整数 n (1≤n≤ 2^20),表示参加比赛的总人数。
接下来 n 个数字(数字范围:-1000000…1000000),表示每个参赛者的积分。
小美是第一个参赛者。
输出描述:
小美最多参赛的轮次。
输入例子:
4
4 1 2 3
输出例子:
2

很明显算个 $ log_2 m $是多少,其中m是分数小于等于他的选手个数(包括她自己),就是答案。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
int main()
{
int n,lower=,mei,p;
scanf("%d",&n);
scanf("%d",&p);
mei=p;
for(int i=;i<=n;i++)
{
scanf("%d",&p);
if(p<=mei)
lower++;
}
p=;
while(lower)
{
lower/=;
p++;
}
p--;
printf("%d\n",p);
return ;
}

B

C:

优惠券

时间限制:1秒

空间限制:32768K

美团点评上有很多餐馆优惠券,用户可以在美团点评App上购买。每张优惠券有一个唯一的正整数编号。当用户在相应餐馆就餐时,可以在餐馆使用优惠券进行消费。优惠券的购买和使用按照时间顺序逐行记录在日志文件中,运营人员会定期抽查日志文件看业务是否正确。业务正确的定义为:一个优惠券必须先被购买,然后才能被使用。

某次抽查时,发现有硬盘故障,历史日志中有部分行损坏,这些行的存在是已知的,但是行的内容读不出来。假设损坏的行可以是任意的优惠券的购买或者使用。

现在问这次抽查中业务是否正确。若有错,输出最早出现错误的那一行,即求出最大s,使得记录1到s-1满足要求;若没有错误,输出-1。

输入描述:
m 分别表示 m (1 ≤ m ≤ 5 * 10^5) 条记录。
下面有m行,格式为:
I x (I为Input的缩写,表示购买优惠券x);
O x(O为Output的缩写,表示使用优惠券x);
? (表示这条记录不知道)。
这里x为正整数,且x ≤ 10^5 。
输出描述:
-1 或 x(1 ≤ x ≤ m) 其中x为使得1到x-1这些记录合法的最大行号。
输入例子:
0
1
O 1
2

O 1
3
I 1

O 1
2
I 2
O 1
输出例子:
-1
1
-1
-1
2

做的时候石乐志哦,没有想用set,然后手打平衡树失败。赛后补了set版。

对于未知记录,我们把它的位置插入set中,以便之后查找删除。

对于每条有效记录,使用或者获得了券x,我们先查询券X的上条记录状态,如果是与之相反的状态就变为当前状态,反之从上条记录的位置往后查询,找到第一个未知记录变为X的与现在状态相符的状态,并把这条状态的位置从set里删除。若没有找到未知状态,那么这条记录就是错误记录,这里就是最早出现错误的地方。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
int inf[],last[];
set<int> tree;
set<int>::iterator it;
int main()
{
char c;
int m,p,k;
int mininf,flag;
while(scanf("%d",&m)!=EOF)
{
clr(inf);
clr(last);
tree.clear();
flag=;
mininf=-;
for(int i=;i<=m;i++)
{
scanf(" %c",&c);
if(c=='?')
{
if(flag) continue;
tree.insert(i);
continue;
}
scanf("%d",&p);
if(flag) continue;
if(c=='I')
{
if(inf[p]==)
{
inf[p]=; }
else if((it=tree.lower_bound(last[p]))!=tree.end())
{
tree.erase(it);
}
else
{
flag=;
mininf=i;
}
}
if(c=='O')
{
if(inf[p]==)
{
inf[p]=; }
else if((it=tree.lower_bound(last[p]))!=tree.end())
{
tree.erase(it);
}
else
{
flag=;
mininf=i;
}
}
last[p]=i;
}
printf("%d\n",mininf);
}
return ; }

C

D:

送外卖

时间限制:1秒

空间限制:32768K

n 个小区排成一列,编号为从 0 到 n-1 。一开始,美团外卖员在第0号小区,目标为位于第 n-1 个小区的配送站。
给定两个整数数列 a[0]~a[n-1] 和 b[0]~b[n-1] ,在每个小区 i 里你有两种选择:
1) 选择a:向前 a[i] 个小区。
2) 选择b:向前 b[i] 个小区。

把每步的选择写成一个关于字符 ‘a’ 和 ‘b’ 的字符串。求到达小区n-1的方案中,字典序最小的字符串。如果做出某个选择时,你跳出了这n个小区的范围,则这个选择不合法。 
• 当没有合法的选择序列时,输出 “No solution!”。
• 当字典序最小的字符串无限长时,输出 “Infinity!”。
• 否则,输出这个选择字符串。

字典序定义如下:串s和串t,如果串 s 字典序比串 t 小,则
• 存在整数 i ≥ -1,使得∀j,0 ≤ j ≤ i,满足s[j] = t[j] 且 s[i+1] < t[i+1]。
• 其中,空字符 < ‘a’ < ‘b’。

输入描述:
输入有 3 行。
第一行输入一个整数 n (1 ≤ n ≤ 10^5)。
第二行输入 n 个整数,分别表示 a[i] 。
第三行输入 n 个整数,分别表示 b[i] 。
−n ≤ a[i], b[i] ≤ n
输出描述:
输出一行字符串表示答案。
输入例子:
7
5 -3 6 5 -5 -1 6
-6 1 4 -2 0 -2 0
输出例子:
abbbb

为什么会无限长呢? 最朴素的例子:从1号点选择a方案可到3号点,3号点选择a方案可到2号点,b方案可到n-1号点,那你肯定选择aaaaaaa……(无穷)b这样字典序最小,而不是ab或者aaab等等这样的方案,因为这样的方案字典序不是最小的。

那么解法显而易见:

这道题从n-1号点反向dfs下,找出所有能到达n-1的点,标记下。然后看看0号点能到达n-1号点吗,不能就 no solution。

然后从0号点出发也做一遍dfs,这个dfs是先选a方案在选b方案的,并且标记经过的点。若在dfs中遇到标记点,并且该标记点可达n-1号点(前面的dfs已经找出这些点了),那么中便是无限长的方案。否则就退出继续dfs直到找到一个可到达n-1号点的方案。该方案就是有限长最终方案。

 #include<cstdio>
#include<iostream>
#include<cstring>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
using namespace std;
int a[],b[];
char s[];
int head[],size,inf[],inf2[],n;
struct edg
{
int next,to;
}edge[];
void addedge(int u,int v)
{
edge[++size].to=v;
edge[size].next=head[u];
head[u]=size;
return ;
}
void dfs1(int u)
{
inf[u]=;
int p;
for(int i=head[u];i!=-;i=edge[i].next)
{
p=edge[i].to;
if(inf[p]==)
dfs1(p);
}
return ;
}
int dfs2(int u,int dep)
{
if(u==n-)
{
s[dep]='\0';
printf("%s\n",s);
return ;
}
if(inf2[u]==)
{
if(inf[u]==)
{
printf("Infinity!\n");
return -;
}
else
return ;
}
inf2[u]=;
int k=;
if(u+a[u]<=n- && u+a[u]>=)
{
s[dep]='a';
k=dfs2(u+a[u],dep+);
}
if(k> && u+b[u]<=n- && u+b[u]>=)
{
s[dep]='b';
k=dfs2(u+b[u],dep+);
}
return k;
}
int main()
{
size=;
scanf("%d",&n);
clr_1(head);
clr(inf);
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
if(i+a[i]<=n-)
addedge(i+a[i],i);
}
for(int i=;i<n;i++)
{
scanf("%d",&b[i]);
if(i+b[i]<=n-)
addedge(i+b[i],i);
}
dfs1(n-);
if(inf[]==)
printf("No solution!\n");
else
{
clr(inf2);
clr(s);
dfs2(,);
}
return ; }

D

E:

数码

时间限制:1秒

空间限制:32768K

给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。

输入描述:
一行,两个整数 l 和 r (1 ≤ l ≤ r ≤ 10^9)。
输出描述:
输出9行。
第 i 行,输出数码 i 出现的次数。
输入例子:
1 4
输出例子:
4
2
1
1
0
0
0
0
0

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define clr(x) memset(x,0,sizeof(x))
#define LL long long
using namespace std;
LL n,m,l,r;
LL min(LL a,LL b)
{
return a<b?a:b;
}
LL max(LL a,LL b)
{
return a>b?a:b;
}
LL sum(LL n,LL m)
{
LL sqrtn=(LL)sqrtl(n);
LL ans=;
LL k=n/(sqrtn+),beg=n/(k+);
for(LL i=;i<=min(beg,m);i++)
ans+=n/i;
if(beg>=m)
{
// printf("%d %d %d\n",n,m,ans);
return ans;
}
for(LL i=k;i>=n/m;i--)
{
ans+=i*(min(m,n/i)-n/(i+));
}
return ans;
}
LL deal(int p,LL n)
{
LL q;
LL ans=,ten=;
for(int i=;i<=;i++)
if((LL)p*ten-<n)
{
ans+=sum(n,min((LL)(p+)*ten-,n))-sum(n,(LL)p*ten-);
ten*=;
}
return ans;
}
int main()
{
scanf("%lld%lld",&l,&r);
for(int i=;i<=;i++)
{
LL ans=deal(i,r)-deal(i,l-);
printf("%lld\n",ans);
}
return ;
}

E

code M资格赛 补题的更多相关文章

  1. hdu5017:补题系列之西安网络赛1011

    补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...

  2. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  3. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  4. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  5. [数]补题ver.

    上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...

  6. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  7. ICPC南京补题

    由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...

  8. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  9. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

随机推荐

  1. lua中的继承

    做为一个java出身的程序媛,长时间做Lua,重复一些工作后,特别想用继承.其实很简单.因为我有一大部分的场景,背景长的都一样,所以打算做一个父类. 需要注意的是,如果子类有和父类的同名函数,就会被覆 ...

  2. 超详细的Java面试题总结(二)之Java基础知识篇

    多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...

  3. HDU 2899 三分

    我们对这个函数求二阶导数,发现他的二阶导数是恒大于0的,那么他的导数是单调的,且在某时刻为0,那么这时的x值就是极值处的x值,其实题目说了,有最小值,那么我们三分水过去就好了. 反思:精度不够,因为是 ...

  4. Sketch VS Photoshop

    参考:http://mp.weixin.qq.com/s?__biz=MjM5NTQ5MjIyMA==&mid=217309554&idx=4&sn=4d6a5239ca813 ...

  5. Tomcat的安装以及基本配置

    Tomcat是目前最常见也是最流行的基于java的一个web服务器软件   Tomcat的安装   (1)首先需要java环境,也就是说要依赖于java虚拟机JVM   (2)下载Tomcat ,地址 ...

  6. Windows Resizer

    Windows ResizerWindows Resizer是chrome浏览器插件,可以调整视口大小

  7. redis基础之开机自启动和监听(二)

    redis安装好后,每次手动启动很不方便,配置开机自启动. 方法一:设置启动命令到/etc/rc.d/rc.local rc.local文件是系统全局脚本文件,会在其他开机进程脚本文件执行完毕后执行该 ...

  8. nvidia tk1使用记录--基本环境搭建

    前言 项目最开始是在X86+Nvidia(ubuntu+opencv+cuda)平台上实现,达到了期望性能,最近考虑将其移植到嵌入式平台,特别是最近nvidia出了tegra X1,基于和我们使用的g ...

  9. Oracle sql中的正则表达式

    SELECT first_name, last_nameFROM employeesWHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$'); FIRST_NAM ...

  10. vue页面高度填充,不出现滚动条

    现在的需求是这样:vue单页工程化开发,上面有一个header,左边有一个侧边栏,右边内容展示.要求左边侧边栏的高度,要填充满整个页面(除了header外,header:height:60px)--如 ...