Educational Codeforces Round 63 (Rated for Div. 2)题解

题目链接

A. Reverse a Substring

给出一个字符串,现在可以对这个字符串进行一次翻转,问是否存在一种方案,可以使得翻转后字符串的字典序可以变小。

 

这个很简单,贪心下就行了。

代码如下:

Code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 3e5 + 5;
  5. int n;
  6. char s[N] ;
  7. int main() {
  8. cin >> n;
  9. scanf("%s",s + 1) ;
  10. int pos1, pos2 = -1;
  11. int mx = 0;
  12. for(int i = 1; i <= n; i++) {
  13. if(s[i] - 'a' + 1 >= mx) {
  14. mx = s[i] - 'a' + 1;
  15. pos1 = i;
  16. } else {
  17. pos2 = i;
  18. break ;
  19. }
  20. }
  21. if(pos2 == -1) puts("No") ;
  22. else {
  23. puts("YES") ;
  24. cout << pos1 << ' ' << pos2 ;
  25. }
  26. return 0;
  27. }

B. Game with Telephone Numbers

给出一个数字序列,长度为n,满足\(13\leq n\leq 10^5\),并且保证长度为偶数。并且给出电话号码的定义:长度为11并且首位为8。

现在两个人,每个人选择一个数删去。现在问先手是否有必胜策略。

因为保证了\(n\)为偶数,所以我们可以知道每个人的操作次数,假设每个人可以操作\(k\)次。那么我们就只需要看前\(2*k+1\)个字符就行了,统计一下8的数量就ok了。

具体见代码吧:

Code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 3e5 + 5;
  5. int n;
  6. char s[N] ;
  7. int main() {
  8. cin >> n;
  9. scanf("%s",s + 1) ;
  10. int remain = (n - 11) / 2;
  11. int cnt1 = 0, cnt2 = 0;
  12. for(int i = 1; i <= 2 * remain; i++) {
  13. if(s[i] == '8') cnt1++ ;
  14. else cnt2++;
  15. }
  16. if(cnt1 > remain) puts("YES") ;
  17. else if(cnt1 == remain && s[2 * remain + 1] == '8') puts("YES") ;
  18. else puts("NO") ;
  19. return 0;
  20. }

C. Alarm Clocks Everywhere

给出\(n\)个数的位置,每个数的位置为\(x_i\),\(m\)个间隔,分别为\(p_i\)。现在问是否可以从这些间隔里面选出一个\(p_i\)出来,现在还随意选出一个起点,问这样是否可以遍历所有的位置。

比如选择了一个起点\(s\),假设间隔为\(v\),那么就会遍历\(s,s+v,\cdots,s+v*k\)。

求出所有间隔的gcd就行了,最后依次枚举每个间隔,判断一下就行了。

代码如下:

Code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 3e5 + 5;
  5. ll a[N];
  6. int n, m;
  7. int main() {
  8. ios::sync_with_stdio(false); cin.tie(0);
  9. cin >> n >> m;
  10. ll d = 0;
  11. for(int i = 1; i <= n; i++) {
  12. cin >> a[i] ;
  13. if(i != 1) d = __gcd(d, a[i] - a[i - 1]) ;
  14. }
  15. ll x;
  16. int ans = -1;
  17. for(int i = 1; i <= m; i++) {
  18. cin >> x;
  19. if(d % x == 0) {
  20. ans = i;
  21. }
  22. }
  23. if(ans == -1) cout << "NO" ;
  24. else {
  25. cout << "YES" << '\n';
  26. cout << a[1] << ' ' << ans ;
  27. }
  28. return 0;
  29. }

D. Beautiful Array

给出\(n\)个数,每个数为\(a_i\),满足\(1\leq n\leq 3*10^5,-10^9\leq a_i\leq 10^9\)。同时给出一个数\(x\),满足\(-100\leq x\leq 100\)。

现在可以选出一个区间\([l,r]\),之后对这个区间中的每一个数都乘以一个\(x\)。

询问在至多执行了一次操作过后,这\(n\)个数的最大连续子段和为多少。

额,这个题我一开始以为就是贪心...结果贪遭了,大部分时间就搭进去了。最后发现其实一个简单dp(?)就行了。。。反正我看过题解之后感觉挺简单的。

因为只能最多执行一次操作,所以最后整个区间会被分为三段或者一段。定义\(dp(i,j)\)表示当前第\(i\)个数,且处于第\(j\)段中时,前\(i\)个数的最大连续子段和,这里\(0\leq j\leq 2\)。这里中间那段就是被改变的区间,前面、后面都是没有改变的。之后根据这个来转移就行了。

因为我的转移中只有新开一段和延续之前这两种情况,所以最后还需要枚举一下来维护答案。因为最后的答案不一定会延续到最后一位。

详细见代码吧:

Code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 3e5 + 5;
  5. int n ;
  6. ll x;
  7. ll a[N] ;
  8. ll dp[N][3] ;
  9. int main() {
  10. ios::sync_with_stdio(false); cin.tie(0);
  11. cin >> n >> x;
  12. for(int i = 1; i <= n; i++) cin >> a[i] ;
  13. for(int i = 1; i <= n; i++) {
  14. dp[i][0] = max({a[i], dp[i - 1][0] + a[i]}) ;
  15. dp[i][1] = max({dp[i - 1][0] + a[i] * x, dp[i - 1][1] + a[i] * x, a[i] * x}) ;
  16. dp[i][2] = max({dp[i - 1][1] + a[i], dp[i - 1][2] + a[i], a[i]});
  17. }
  18. ll ans = 0;
  19. for(int i = 1; i <= n; i++)
  20. ans = max({ans, dp[i][0], dp[i][1], dp[i][2]}) ;
  21. cout << ans ;
  22. return 0;
  23. }

E. Guess the Root

这是一个交互题。

给出一个函数\(f(x)=a_0+a_1*x+a_2*x^2+\cdots+a_k*x^k\),其中\(0\leq a<10^6+3,k\leq 10\)。

之后你最多有50次询问,给出一个\(x_0\),最后会给出回答\(f(x_0)\mod 10^6+3\)。之后要求你输出一个\(x_0\),满足\(f(x0)\mod 10^6+3\)。

由于这里的\(k\)很小,所以我们可以直接询问11次,然后就会有11个方程,因为题目保证有解,所以直接高斯消元就好啦,可以直接把\(a_0,a_1,\cdots,a_k\)给求出来。

之后枚举\(x\)从\(0\)到\(10^6+2\)就行了,为啥不往后面枚举呢,因为有取余,往后面枚举是没必要的。如果满足条件就直接输出,最后发现没有满足条件的数,直接输出\(-1\)就好了。

代码如下:

Code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 15, MOD = 1e6 + 3;
  5. ll a[N][N], b[N];
  6. ll qp(ll A, ll B) {
  7. ll ans = 1;
  8. while(B) {
  9. if(B & 1) ans = ans * A % MOD;
  10. A = A * A % MOD;
  11. B >>= 1;
  12. }
  13. return ans ;
  14. }
  15. void gauss() {
  16. for(int i = 0; i < 11; i++) {
  17. ll t = qp(a[i][i], MOD - 2) ;
  18. for(int j = 0; j < 12; j++)
  19. a[i][j] = a[i][j] * t % MOD;
  20. for(int j = 0; j < 11; j++) {
  21. ll c = a[j][i] ;
  22. if(i != j && a[j][i])
  23. for(int k = 0; k < 12; k++)
  24. a[j][k] = ((a[j][k] - a[i][k] * c % MOD) % MOD + MOD ) % MOD;
  25. }
  26. }
  27. }
  28. ll f(ll x) {
  29. ll ans = 0;
  30. for(int i = 10; i >= 0; i--) {
  31. ans = (ans * x + b[i]) % MOD ;
  32. }
  33. return ans ;
  34. }
  35. int main() {
  36. for(int i = 0; i < 11; i++)
  37. for(int j = 0; j < 11; j++)
  38. a[i][j] = qp(i, j) ;
  39. for(int i = 0; i < 11; i++) {
  40. printf("? %d\n", i);
  41. fflush(stdout) ;
  42. scanf("%d", &a[i][11]) ;
  43. }
  44. gauss() ;
  45. for(int i = 0; i < 11; i++) b[i] = a[i][11] ;
  46. for(int i = 0; i < MOD; i++) {
  47. if(f(i) == 0) {
  48. printf("! %d",i) ;
  49. return 0;
  50. }
  51. }
  52. printf("! -1") ;
  53. return 0 ;
  54. }

Educational Codeforces Round 63 (Rated for Div. 2) 题解的更多相关文章

  1. Educational Codeforces Round 65 (Rated for Div. 2)题解

    Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...

  2. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  3. Educational Codeforces Round 60 (Rated for Div. 2) 题解

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

  4. Educational Codeforces Round 58 (Rated for Div. 2) 题解

    Educational Codeforces Round 58 (Rated for Div. 2)  题目总链接:https://codeforces.com/contest/1101 A. Min ...

  5. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (简单DP)

    题目:https://codeforces.com/contest/1155/problem/D 题意:给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 思路: ...

  6. Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元

    https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)

    https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维

    题意:博弈题面  给出一个数字序列 (>=11)  有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手  数字序列一定是奇 ...

  9. Educational Codeforces Round 63 (Rated for Div. 2) C. Alarm Clocks Everywhere gcd

    题意:给出一个递增的时间序列a  给出另外一个序列b  (都是整数) 以b中任选一个数字作为间隔  自己从1开始任选一个时间当成开始时间 输出选择的数字标号以及 开始时间 思路  直接求间隔的公共gc ...

随机推荐

  1. Java面试中的Spring方面问题

    1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3 ...

  2. 配置idea

    http://www.cnblogs.com/yangyquin/p/5285272.html

  3. Trick and Magic(OO博客第二弹)

    代码是设计,不是简单的陈述.而设计不仅要求功能的正确性,更注重设计风格和模式. 真正可以投入应用的程序设计,不是那种无脑的“黑箱”,超巨大的数组,多重循环暴力搜索,成吨全局变量……事实上,在实际应用中 ...

  4. vim文本处理技巧

    如果要把这篇文章写的详细透彻,那我没有必要去书写,因为已经有了这本书--<Vim实用技巧> 如果时间和精力足够的同学可以购买或者借阅,真的是写的很详细. Vim实用技巧 (豆瓣)http: ...

  5. Scapy之ARP询问

    引言 校园网中,有同学遭受永恒之蓝攻击,但是被杀毒软件查下,并知道了攻击者的ip也是校园网.所以我想看一下,这个ip是PC,还是路由器. 在ip视角,路由器和pc没什么差别. 实现 首先是构造arp报 ...

  6. 2018软工实践—Beta冲刺(6)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 最终测试文稿编写 展示GitHub当日代码/文档签入记录 ...

  7. Alpha 冲刺报告2

    Alpha 冲刺报告 队名: 组长:吴晓晖 今天完成了哪些任务: 代码量300+,完成了百度地图API的引入. 展示GitHub当日代码/文档签入记录: 明日计划: 整理下这两个功能,然后补些bug ...

  8. 简单Window下 Android Studio的安装

    (1)首先安装JDK 下载JDK 本人觉得官方网站下JDK比较慢,可以直接百度JDK,(如果是64位 百度搜索记得+64位)

  9. php $_SERVER['HTTP_USER_AGENT']

    //获取浏览器 function getBrowse() { global $_SERVER; $Agent = $_SERVER['HTTP_USER_AGENT']; $browseinfo='' ...

  10. 【百度】大型网站的HTTPS实践(三)——HTTPS对性能的影响

    HTTPS在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS也会降低用户访问速度,增加网站服务器的计算资源消耗.本文主要介绍HTTPS对性能的影响. HTTPS对访问速度的影 ...