code M资格赛 补题
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
比赛有 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
某次抽查时,发现有硬盘故障,历史日志中有部分行损坏,这些行的存在是已知的,但是行的内容读不出来。假设损坏的行可以是任意的优惠券的购买或者使用。
现在问这次抽查中业务是否正确。若有错,输出最早出现错误的那一行,即求出最大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
给定两个整数数列 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 ≤ 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资格赛 补题的更多相关文章
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- [数]补题ver.
上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...
- 4.30-5.1cf补题
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
- ICPC南京补题
由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...
- 2018 CCPC 桂林站(upc复现赛)补题
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
随机推荐
- python学习笔记(四)之分支和循环
python中比较操作符有: > >= < <= == != 这些操作符返回True或False 1 >>> 1 < 3 2 True 3 >&g ...
- 伪病毒 Rp_test
第一个写的对电脑有破坏性的程序= =,然后发现写system的copy的时候不会用字符串替代路径,然后就萎了= =,只能写一个没有自身复制的伪病毒了,坑到了好多同学的电脑,23333.... //By ...
- js_实现给未来元素添加事件。
未来元素:不是一个页面上的元素,是通过js或者通过后台直接渲染在页面上的元素,也就是说这些元素不是直接写在document中的. 1.对于未来元素,我们想直接用js或者jq操作它们是不起作用的. $( ...
- CiteSeer统计的计算机领域的期刊和会议的影响因子(2005)
产生自CiterSeer 2005数据库,实际的影响因子可能更高.仅供参考使用.真实的IF还需去官网查看 . OSDI: 3.31 (top 0.08%) . USENIX Symposium on ...
- 【Android XML】Android XML 转 Java Code 系列之 介绍(1)
最近在公司做一个项目,需要把Android界面打包进jar包给客户使用.对绝大部分开发者来说,Android界面的布局以XML文件为主,并辅以少量Java代码进行动态调整.而打包进jar包的代码,意味 ...
- python基础===解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX(转载)
本文转自:解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX 从网上抓了一些字 ...
- Linux内核中链表的实现与应用【转】
转自:http://blog.chinaunix.net/uid-27037833-id-3237153.html 链表(循环双向链表)是Linux内核中最简单.最常用的一种数据结构. ...
- nfs 文件共享 服务
需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...
- 蓝屏代码0X0000007B可能是SATA mode问题
Win7蓝屏代码0X0000007B可能是硬盘模式的问题,我进入BIOS把SATA的mode从Enhanced改为Compatible(及IDE兼容模式)结果系统可以顺利启动没有问题. 从 ...
- BZOJ 3656: 异或 (组合数取模 CRT)
http://www.lydsy.com/JudgeOnline/problem.php?id=3656 大意:经过一通推导,问题变成求\[\binom N M \mod P\],其中N,M<= ...