A - Always Online

Unsolved.

B - Beautiful Now

Solved.

题意:

给出一个n, k  每次可以将n这个数字上的某两位交换,最多交换k次,求交换后的最大和最小值

思路:

很明显有一种思路,对于最小值,尽可能把小的放前面, 对于最大值,尽可能把打的放前面。但是如果有多个最小数字或者最大数字会无法得出放哪个好,因此BFS一下即可

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int INF = 0x3f3f3f3f;
  6. const int maxn = 1e5 + ;
  7.  
  8. struct node{
  9. int num, idx, step;
  10. node(){}
  11. node(int num, int idx, int step) :num(num), idx(idx), step(step){}
  12. };
  13.  
  14. int n, k;
  15. int cnt;
  16. int arr[maxn];
  17.  
  18. int BFS1()
  19. {
  20. queue<node>q;
  21. q.push(node(n, cnt, ));
  22. int ans = INF;
  23. while(!q.empty())
  24. {
  25. node now = q.front();
  26. q.pop();
  27. ans = min(ans, now.num);
  28. if(now.step == k) continue;
  29. if(now.idx == ) continue;
  30. int tmp = now.num;
  31. cnt = ;
  32. while(tmp)
  33. {
  34. arr[++cnt] = tmp % ;
  35. tmp /= ;
  36. }
  37. int Min = now.idx;
  38. for(int i = now.idx - ; i >= ; --i)
  39. {
  40. if(arr[i] == arr[now.idx]) continue;
  41. if(arr[i] == && now.idx == cnt) continue;
  42. if(arr[i] < arr[Min]) Min = i;
  43. }
  44. if(Min == now.idx)
  45. {
  46. q.push(node(now.num, now.idx - , now.step));
  47. }
  48. else
  49. {
  50. for(int i = now.idx - ; i >= ; --i)
  51. {
  52. if(arr[i] == arr[Min])
  53. {
  54. swap(arr[i], arr[now.idx]);
  55. tmp = ;
  56. for(int j = cnt; j >= ; --j)
  57. {
  58. tmp = tmp * + arr[j];
  59. }
  60. q.push(node(tmp, now.idx - , now.step + ));
  61. swap(arr[i], arr[now.idx]);
  62. }
  63. }
  64. }
  65. }
  66. return ans;
  67. }
  68.  
  69. int BFS2()
  70. {
  71. queue<node>q;
  72. q.push(node(n, cnt, ));
  73. int ans = -INF;
  74. while(!q.empty())
  75. {
  76. node now = q.front();
  77. q.pop();
  78. ans = max(ans, now.num);
  79. if(now.step == k) continue;
  80. if(now.idx == ) continue;
  81. int tmp = now.num;
  82. cnt = ;
  83. while(tmp)
  84. {
  85. arr[++cnt] = tmp % ;
  86. tmp /= ;
  87. }
  88. int Max = now.idx;
  89. for(int i = now.idx - ; i >= ; --i)
  90. {
  91. if(arr[i] == arr[now.idx]) continue;
  92. if(arr[i] > arr[Max]) Max = i;
  93. }
  94. if(Max == now.idx)
  95. {
  96. q.push(node(now.num, now.idx - , now.step));
  97. }
  98. else
  99. {
  100. for(int i = now.idx - ; i >= ; --i)
  101. {
  102. if(arr[i] == arr[Max])
  103. {
  104. swap(arr[i], arr[now.idx]);
  105. tmp = ;
  106. for(int j = cnt; j >= ; --j)
  107. {
  108. tmp = tmp * + arr[j];
  109. }
  110. q.push(node(tmp, now.idx - , now.step + ));
  111. swap(arr[i], arr[now.idx]);
  112. }
  113. }
  114. }
  115. }
  116. return ans;
  117. }
  118.  
  119. int main()
  120. {
  121. int t;
  122. scanf("%d", &t);
  123. while(t--)
  124. {
  125. scanf("%d %d", &n ,&k);
  126. int tmp = n;
  127. cnt = ;
  128. while(tmp)
  129. {
  130. cnt++;
  131. tmp /= ;
  132. }
  133. k = min(k, cnt - );
  134. int ans1 = BFS1();
  135. int ans2 = BFS2();
  136. printf("%d %d\n", ans1, ans2);
  137. }
  138. return ;
  139. }

C - Call It What You Want

Unsolved.

D - Daylight

Unsolved.

E - Everything Has Changed

Solved.

题意:

求多个圆的周长并

思路:

对于不想交和内含的直接continue,相切的直接相加。对于相交的可以减去大圆上的弧长,加上小圆的弧长

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const double PI = acos(-1.0);
  6. const double eps = 1e-;
  7.  
  8. int sgn(double x)
  9. {
  10. if(fabs(x) < eps) return ;
  11. else return x > ? : -;
  12. }
  13.  
  14. struct Point{
  15. double x, y;
  16. Point(){}
  17. Point(double _x, double _y)
  18. {
  19. x = _x;
  20. y = _y;
  21. }
  22.  
  23. double distance(Point p)
  24. {
  25. return hypot(x - p.x, y - p.y);
  26. }
  27. }P;
  28.  
  29. int n;
  30. double R, r;
  31.  
  32. int main()
  33. {
  34. int t;
  35. scanf("%d", &t);
  36. while(t--)
  37. {
  38. scanf("%d %lf", &n, &R);
  39. double ans = * R * PI;
  40. for(int i = ; i <= n; ++i)
  41. {
  42. scanf("%lf %lf %lf", &P.x, &P.y, &r);
  43. double dis = P.distance(Point(0.0, 0.0));
  44. if(sgn(dis - (r + R)) >= ) continue;
  45. else if(sgn(dis - (R - r)) < ) continue;
  46. else if(sgn(dis - (R - r)) == )
  47. {
  48. ans += * PI * r;
  49. continue;
  50. }
  51. double arc1 = (R * R + dis * dis - r * r) / (2.0 * R * dis);
  52. arc1 = * acos(arc1);
  53. double arc2 = (r * r + dis * dis - R * R) / (2.0 * r * dis);
  54. arc2 = * acos(arc2);
  55. ans -= R * arc1;
  56. ans += r * arc2;
  57. }
  58. printf("%.10f\n", ans);
  59. }
  60. return ;
  61. }

F - Fireflies

Unsolved.

G - Glad You Came

Upsolved.

题意:

m个区间操作,每次给$[L, R]区间内小于v 的数变为v$

思路:

线段树,维护最大最小值+剪枝,因为数据随机才可以这样做。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 5000010
  5. #define M 100010
  6. #define ui unsigned int
  7. #define ll long long
  8. int t, n, m;
  9. ui x, y, z, w;
  10. ui f[N << ];
  11. ui MOD = (ui) << ;
  12.  
  13. ui rng61()
  14. {
  15. x = x ^ (x << );
  16. x = x ^ (x >> );
  17. x = x ^ (x << );
  18. x = x ^ (x >> );
  19. w = x ^ y ^ z;
  20. x = y;
  21. y = z;
  22. z = w;
  23. return z;
  24. }
  25.  
  26. struct SEG
  27. {
  28. ui lazy[M << ], Max[M << ], Min[M << ];
  29. void Init()
  30. {
  31. memset(lazy, , sizeof lazy);
  32. memset(Max, , sizeof Max);
  33. memset(Min, , sizeof Min);
  34. }
  35. void pushup(int id)
  36. {
  37. Max[id] = max(Max[id << ], Max[id << | ]);
  38. Min[id] = min(Min[id << ], Min[id << | ]);
  39. }
  40. void pushdown(int id)
  41. {
  42. if (!lazy[id]) return;
  43. lazy[id << ] = lazy[id];
  44. Max[id << ] = lazy[id];
  45. Min[id << ] = lazy[id];
  46. lazy[id << | ] = lazy[id];
  47. Max[id << | ] = lazy[id];
  48. Min[id << | ] = lazy[id];
  49. lazy[id] = ;
  50. }
  51. void update(int id, int l, int r, int ql, int qr, ui val)
  52. {
  53. if (Min[id] >= val) return;
  54. if (l >= ql && r <= qr && Max[id] < val)
  55. {
  56. lazy[id] = Max[id] = val;
  57. return;
  58. }
  59. pushdown(id);
  60. int mid = (l + r) >> ;
  61. if (ql <= mid) update(id << , l, mid, ql, qr, val);
  62. if (qr > mid) update(id << | , mid + , r, ql, qr, val);
  63. pushup(id);
  64. }
  65. int query(int id, int l, int r, int pos)
  66. {
  67. if (l == r) return Max[id];
  68. pushdown(id);
  69. int mid = (l + r) >> ;
  70. if (pos <= mid) return query(id << , l, mid, pos);
  71. else return query(id << | , mid + , r, pos);
  72. }
  73. }seg;
  74.  
  75. int main()
  76. {
  77. scanf("%d", &t);
  78. while (t--)
  79. {
  80. scanf("%d%d%u%u%u", &n, &m, &x, &y, &z);
  81. for (int i = ; i <= * m; ++i) f[i] = rng61();
  82. seg.Init();
  83. for (int i = , l, r, v; i <= m; ++i)
  84. {
  85. l = f[ * i - ] % n + ;
  86. r = f[ * i - ] % n + ;
  87. v = f[ * i] % MOD;
  88. if (l > r) swap(l, r);
  89. seg.update(, , n, l, r, v);
  90. }
  91. ll res = ;
  92. for (int i = ; i <= n; ++i)
  93. res ^= (ll)seg.query(, , n, i) * (ll)i;
  94. printf("%lld\n", res);
  95. }
  96. return ;
  97. }

H - Hills And Valleys

Upsolved,

题意:

给出一个长为n的数字串,每一位范围是$[0, 9]$,可以翻转其中一段,使得最长非下降子序列最长

思路:

也就是说 可以存在这样一段

$0, 1, 2....., x, (x - 1) , y, (y - 1).... x, y + 1, y + 2..$

我们知道,如果不可以翻转,求最长上升子序列的话,我们可以将原串 和模式串$0123456789$ 求最长公共子序列

那么翻转的话,我们通过枚举翻转的区间$C(2, 10)$ 构造出上述的模式串,再求最长公共子序列

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 100010
  5. #define INF 0x3f3f3f3f
  6. int t, n, m, a[N], b[];
  7. int dp[N][], tl[N][], tr[N][], res, l, r, ql, qr;
  8.  
  9. void solve()
  10. {
  11. for (int i = ; i <= m; ++i) dp[][i] = , tl[][i] = -, tr[][i] = -;
  12. for (int i = ; i <= n; ++i) for (int j = ; j <= m; ++j)
  13. {
  14. dp[i][j] = dp[i - ][j];
  15. tl[i][j] = tl[i - ][j];
  16. tr[i][j] = tr[i - ][j];
  17. if (a[i] == b[j])
  18. {
  19. ++dp[i][j];
  20. if (j == ql && tl[i][j] == -) tl[i][j] = i;
  21. if (j == qr) tr[i][j] = i;
  22. }
  23. if (j > && dp[i][j - ] > dp[i][j])
  24. {
  25. dp[i][j] = dp[i][j - ];
  26. tl[i][j] = tl[i][j - ];
  27. tr[i][j] = tr[i][j - ];
  28. }
  29. }
  30. if (ql == && qr == )
  31. {
  32. res = dp[n][m];
  33. l = ;
  34. r = ;
  35. }
  36. else if (dp[n][m] > res && tl[n][m] != - && tr[n][m] != -)
  37. {
  38. res = dp[n][m];
  39. l = tl[n][m];
  40. r = tr[n][m];
  41. }
  42. }
  43.  
  44. int main()
  45. {
  46. scanf("%d", &t);
  47. while (t--)
  48. {
  49. scanf("%d", &n);
  50. res = , l = , r = ;
  51. for (int i = ; i <= n; ++i) scanf("%1d", a + i);
  52. for (int i = ; i <= ; ++i) b[i] = i - ; m = ; ql = , qr = ;
  53. solve();
  54. for (int i = ; i < m; ++i) for (int j = i + ; j <= ; ++j)
  55. {
  56. m = ;
  57. for (int pos = ; pos <= i; ++pos) b[++m] = pos - ;
  58. ql = m + ;
  59. for (int pos = j; pos >= i; --pos) b[++m] = pos - ;
  60. qr = m;
  61. for (int pos = j; pos <= ; ++pos) b[++m] = pos - ;
  62. solve();
  63. //for (int i = 1; i <= m; ++i) printf("%d%c", b[i], " \n"[i == m]);
  64. }
  65. printf("%d %d %d\n", res, l, r);
  66. }
  67. return ;
  68. }

I - Innocence

Unsolved.

J - Just So You Know

Unsolved.

K - Kaleidoscope

Unsolved.

L - Lost In The Echo

Unsolved.

2018 Multi-University Training Contest 5 Solution的更多相关文章

  1. 2018 Multi-University Training Contest 1 Solution

    A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, ...

  2. 2018 Multi-University Training Contest 2 Solution

    A - Absolute 留坑. B - Counting Permutations 留坑. C - Cover 留坑. D - Game puts("Yes") #include ...

  3. 2018 Multi-University Training Contest 3 Solution

    A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...

  4. 2018 Multi-University Training Contest 4 Solution

    A - Problem A. Integers Exhibition 留坑. B - Problem B. Harvest of Apples 题意:计算$\sum_{i = 0}^{i = m}C( ...

  5. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  6. 2018 Multi-University Training Contest 7 Solution

    A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...

  7. 2018 Multi-University Training Contest 8 Solution

    A - Character Encoding 题意:用m个$0-n-1$的数去构成k,求方案数 思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时 ...

  8. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  9. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

随机推荐

  1. java日志之slf4j与logback简单使用

    最近在开发遇到日志是使用slf4j与logback.xml的配置,所以就记录下来了. 1.导入这几个jar包: Logback 分为三个模块:logback-core,logback-classic, ...

  2. tomcat日志保存在哪里?

    tomcat目录下的logs文件夹下.有个catalina.20xx-xx-xx.log

  3. Linux下多任务间通信和同步-mmap共享内存

    Linux下多任务间通信和同步-mmap共享内存 嵌入式开发交流群280352802,欢迎加入! 1.简介 共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射 ...

  4. vscode新建html,没有模板

    首先,在文件夹下右击--新建--index.html 输入! 按tab键 完成!

  5. 以用户名注册来分析三种Action获取数据的方式

    1.注入属性 直接注入属性: public String userName; public String getUserName() { return userName; } public void ...

  6. ubuntu下nginx编译安装

    安装依赖库: sudo apt-get install libgd2-xpm sudo apt-get install libgd2-xpm-dev sudo apt-get install libg ...

  7. Android开发规范——命名

      在讲解命名规范前,先初略介绍下当前主要的标识符命名法和英文缩写规则.标识符命名法标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写. ...

  8. 【转】stm32中断嵌套全攻略

    断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记.废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包 ...

  9. xpath定位方法小结(转载)

    1.实例化一个浏览器WebDriver driver = new FirefoxDriver(); 2.driver.get() get传参数到浏览器中 3.常用定位方法webelement XX=d ...

  10. 云计算之路-阿里云上:消灭“黑色n秒”第一招——不让CPU空闲

    昨天对“黑色n秒”问题的最终猜想以失败而告终,从而让我们结束了被动猜想阶段,进入了主动进攻阶段——出招. 今天出第一招——用C#写个小程序,让其在每个CPU核上运行一个线程,不让任何一个CPU核进入空 ...