C - ////

为了防止一些多余的判断,我选择直接记录每个数的个数,然后枚举第一个数,找第一个数之外第二个数改变最少的情况下应该选什么

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define enter putchar('\n')
  8. #define space putchar(' ')
  9. //#define ivorysi
  10. #define MAXN 100005
  11. typedef long long int64;
  12. using namespace std;
  13. template<class T>
  14. void read(T &res) {
  15. res = 0;char c = getchar();T f = 1;
  16. while(c < '0' || c > '9') {
  17. if(c == '-') f = -1;
  18. c = getchar();
  19. }
  20. while(c >= '0' && c <= '9') {
  21. res = res * 10 + c - '0';
  22. c = getchar();
  23. }
  24. res *= f;
  25. }
  26. template<class T>
  27. void out(T x) {
  28. if(x < 0) {x = -x;putchar('-');}
  29. if(x >= 10) {
  30. out(x / 10);
  31. }
  32. putchar('0' + x % 10);
  33. }
  34. int N,a[MAXN];
  35. int L[MAXN],tot,ans,cnt1[MAXN],cnt2[MAXN],pre[MAXN],suf[MAXN];
  36. void Solve() {
  37. read(N);
  38. for(int i = 1 ; i <= N ; ++i) read(a[i]);
  39. for(int i = 1 ; i <= N ; i += 2) {
  40. cnt1[a[i]]++;
  41. }
  42. for(int i = 2 ; i <= N ; i += 2) {
  43. cnt2[a[i]]++;
  44. }
  45. for(int i = 1 ; i <= 100000 ; ++i) {
  46. pre[i] = max(pre[i - 1],cnt2[i]);
  47. }
  48. for(int i = 100000 ; i >= 1 ; --i) {
  49. suf[i] = max(suf[i + 1],cnt2[i]);
  50. }
  51. ans = N;
  52. for(int i = 1 ; i <= 100000 ; ++i) {
  53. ans = min(ans,N / 2 - cnt1[i] + N / 2 - max(pre[i - 1],suf[i + 1]));
  54. }
  55. out(ans);enter;
  56. }
  57. int main() {
  58. #ifdef ivorysi
  59. freopen("f1.in","r",stdin);
  60. #endif
  61. Solve();
  62. return 0;
  63. }

D - Robot Arms

103真是构造题大荟萃

如果所有的\(X_i + Y_i\)奇偶性不同,那么显然不行

那么我们考虑一下所有\(X_i + Y_i\)为奇数的情况

我们找一个集合\({1,2,4,8...2^k}\)他们的总和大于\(|X_i| + |Y_i|\)的最大值

我们证明一下\({1,2,4,8..2^k}\)这个集合可以达到所有\(|X_i| + |Y_i| <= 2^{k +1} - 1\)的所有\(X_i +Y_i\)和为奇数的点

首先集合中只有\(1\)的时候,我们可以达到

集合中有\({1,2}\)的时候,我们通过向上下左右移动\(2\),是可以达到距离原点距离为\(1\)的位置的

这样递归证明,最后就是对的

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define enter putchar('\n')
  8. #define space putchar(' ')
  9. //#define ivorysi
  10. #define MAXN 100005
  11. typedef long long int64;
  12. using namespace std;
  13. template<class T>
  14. void read(T &res) {
  15. res = 0;char c = getchar();T f = 1;
  16. while(c < '0' || c > '9') {
  17. if(c == '-') f = -1;
  18. c = getchar();
  19. }
  20. while(c >= '0' && c <= '9') {
  21. res = res * 10 + c - '0';
  22. c = getchar();
  23. }
  24. res *= f;
  25. }
  26. template<class T>
  27. void out(T x) {
  28. if(x < 0) {x = -x;putchar('-');}
  29. if(x >= 10) {
  30. out(x / 10);
  31. }
  32. putchar('0' + x % 10);
  33. }
  34. int N;
  35. int M = 0;
  36. int64 op[35],sum,X[1005],Y[1005];
  37. int64 dx[] = {1,0,-1,0},dy[] = {0,-1,0,1};
  38. char s[1005][45];
  39. const char *dir = "RDLU";
  40. void Solve() {
  41. read(N);
  42. for(int i = 1 ; i <= N ; ++i) {
  43. read(X[i]);read(Y[i]);
  44. }
  45. for(int i = 2 ; i <= N ; ++i) {
  46. if((abs(X[i]) + abs(Y[i])) % 2 != (abs(X[1]) + abs(Y[1])) % 2) {
  47. puts("-1");return ;
  48. }
  49. }
  50. bool flag = 0;
  51. flag = ((abs(X[1]) + abs(Y[1])) % 2 == 0);
  52. if(flag) {op[++M] = 1;}
  53. for(int i = 30 ; i >= 0 ; --i) {op[++M] = 1 << i;sum += op[M];}
  54. pii st = mp(0,0);
  55. if(flag) st = mp(1,0);
  56. for(int i = 1 ; i <= N ; ++i) {
  57. if(flag) s[i][1] = 'R';
  58. pii p = st;
  59. int64 tmp = sum;
  60. for(int j = flag ? 2 : 1 ; j <= M ; ++j) {
  61. for(int k = 0 ; k <= 3 ; ++k) {
  62. int64 tx = p.fi + dx[k] * op[j],ty = p.se + dy[k] * op[j];
  63. int64 a = abs(tx - X[i]) + abs(ty - Y[i]);
  64. if(a <= tmp - op[j]) {
  65. tmp -= op[j];
  66. s[i][j] = dir[k];
  67. p = mp(tx,ty);
  68. break;
  69. }
  70. }
  71. }
  72. }
  73. out(M);enter;
  74. for(int i = 1 ; i <= M ; ++i) {
  75. out(op[i]);space;
  76. }
  77. enter;
  78. for(int i = 1 ; i <= N ; ++i) {
  79. for(int j = 1 ; j <= M ; ++j) {
  80. putchar(s[i][j]);
  81. }
  82. enter;
  83. }
  84. }
  85. int main() {
  86. #ifdef ivorysi
  87. freopen("f1.in","r",stdin);
  88. #endif
  89. Solve();
  90. }

E - Tr/ee

很容易发现1必须合法

我们想要某个大小的树可以被割出来

用一种节约节点的方式,可以用上一个可以拼出来的树,接上一个根,不足的用大小为1的叶子作为补充

然后只要拼到n / 2,再直接加叶子拼到n即可

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define enter putchar('\n')
  8. #define space putchar(' ')
  9. //#define ivorysi
  10. #define MAXN 100005
  11. typedef long long int64;
  12. using namespace std;
  13. template<class T>
  14. void read(T &res) {
  15. res = 0;char c = getchar();T f = 1;
  16. while(c < '0' || c > '9') {
  17. if(c == '-') f = -1;
  18. c = getchar();
  19. }
  20. while(c >= '0' && c <= '9') {
  21. res = res * 10 + c - '0';
  22. c = getchar();
  23. }
  24. res *= f;
  25. }
  26. template<class T>
  27. void out(T x) {
  28. if(x < 0) {x = -x;putchar('-');}
  29. if(x >= 10) {
  30. out(x / 10);
  31. }
  32. putchar('0' + x % 10);
  33. }
  34. int N,dp[100005];
  35. char s[100005];
  36. void add(int u,int v) {
  37. out(u);space;out(v);enter;
  38. }
  39. void Solve() {
  40. scanf("%s",s + 1);
  41. N = strlen(s + 1);
  42. for(int i = 1 ; i <= N ; ++i) dp[i] = s[i] - '0';
  43. if(!dp[1] || dp[N]) {puts("-1");return;}
  44. for(int i = 2 ; i <= N - 1 ; ++i) {
  45. if(dp[i]) {
  46. if(!dp[N - i]) {puts("-1");return;}
  47. }
  48. }
  49. int p = 1,rt = 1;
  50. for(int i = 2 ; i <= N / 2 ; ++i) {
  51. if(dp[i]) {
  52. add(rt,++p);rt = p;
  53. while(p < i) {add(rt,++p);}
  54. }
  55. }
  56. add(rt,++p);rt = p;
  57. while(p < N) {add(rt,++p);}
  58. }
  59. int main() {
  60. #ifdef ivorysi
  61. freopen("f1.in","r",stdin);
  62. #endif
  63. Solve();
  64. }

F - Distance Sums

Di最大的点一定是一个叶子,我们找到Di - (n - 2)的点是连向它的点

然后以此类推,我们可以一边从大到小枚举D来算父亲边,同时维护每个点的子树大小

但是这必要但不充分,我们可以构造这棵树出来时候重新算一遍D值来检验

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define enter putchar('\n')
  8. #define space putchar(' ')
  9. //#define ivorysi
  10. #define MAXN 100005
  11. typedef long long int64;
  12. using namespace std;
  13. template<class T>
  14. void read(T &res) {
  15. res = 0;char c = getchar();T f = 1;
  16. while(c < '0' || c > '9') {
  17. if(c == '-') f = -1;
  18. c = getchar();
  19. }
  20. while(c >= '0' && c <= '9') {
  21. res = res * 10 + c - '0';
  22. c = getchar();
  23. }
  24. res *= f;
  25. }
  26. template<class T>
  27. void out(T x) {
  28. if(x < 0) {x = -x;putchar('-');}
  29. if(x >= 10) {
  30. out(x / 10);
  31. }
  32. putchar('0' + x % 10);
  33. }
  34. int N;
  35. int64 D[MAXN],L[MAXN],dep[MAXN],C[MAXN];
  36. int id[MAXN],s[MAXN],t[MAXN],tot,siz[MAXN];
  37. struct node {
  38. int to,next;
  39. }E[MAXN * 2];
  40. int head[MAXN],sumE;
  41. void add(int u,int v) {
  42. E[++sumE].to = v;
  43. E[sumE].next = head[u];
  44. head[u] = sumE;
  45. }
  46. bool cmp(int a,int b) {
  47. return D[a] < D[b];
  48. }
  49. void dfs(int u,int fa) {
  50. siz[u] = 1;
  51. for(int i = head[u] ; i ; i = E[i].next) {
  52. int v = E[i].to;
  53. if(v != fa){
  54. dep[v] = dep[u] + 1;
  55. dfs(v,u);
  56. siz[u] += siz[v];
  57. }
  58. }
  59. }
  60. bool dfs1(int u,int fa) {
  61. if(C[u] != D[u]) return false;
  62. for(int i = head[u] ; i ; i = E[i].next) {
  63. int v = E[i].to;
  64. if(v != fa) {
  65. C[v] = C[u] - siz[v] + N - siz[v];
  66. if(!dfs1(v,u)) return false;
  67. }
  68. }
  69. return true;
  70. }
  71. void Solve() {
  72. read(N);
  73. for(int i = 1 ; i <= N ; ++i) {
  74. read(D[i]);id[i] = i;siz[i] = 1;
  75. }
  76. sort(id + 1,id + N + 1,cmp);
  77. for(int i = 1 ; i <= N ; ++i) L[i] = D[id[i]];
  78. for(int i = N ; i > 1 ; --i) {
  79. s[++tot] = id[i];
  80. int p = lower_bound(L + 1,L + i,L[i] + 2 * siz[s[tot]] - N) - L;
  81. if(L[p] != L[i] + 2 * siz[s[tot]] - N) {puts("-1");return;}
  82. t[tot] = id[p];
  83. siz[id[p]] += siz[id[i]];
  84. }
  85. for(int i = 1 ; i <= tot ; ++i) {add(s[i],t[i]);add(t[i],s[i]);}
  86. dfs(1,0);
  87. for(int i = 1 ; i <= N ; ++i) C[1] += dep[i];
  88. if(!dfs1(1,0)) {puts("-1");return;}
  89. for(int i = 1 ; i <= tot ; ++i) {
  90. out(s[i]);space;out(t[i]);enter;
  91. }
  92. }
  93. int main() {
  94. #ifdef ivorysi
  95. freopen("f1.in","r",stdin);
  96. #endif
  97. Solve();
  98. return 0;
  99. }

【AtCoder】ARC103的更多相关文章

  1. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  2. 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring

    [题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...

  3. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  4. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  5. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  6. 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分

    [题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...

  7. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  8. 【Atcoder】AGC022 C - Remainder Game 搜索

    [题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...

  9. 【Atcoder】AGC 020 B - Ice Rink Game 递推

    [题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...

随机推荐

  1. subprocess 子进程模块

    subprocess子进程模块 import subprocess #Popen方法是用来执行系统命令的,直接把结果打印到终端了 res =subprocess.Popen(r'dir',shell= ...

  2. vue 新增时清除表单验证注意事项

    // 清除表单校验的提示 if (this.$refs['XXX']) { // 延时执行 this.$nextTick(function () { this.$refs['XXX'].clearVa ...

  3. ubuntu下sublime Text3配置C++编译环境

    今天在Ubuntu下用sublime Text3编译C++代码,环境配的不太顺利,下边展示一个实例. 1.主函数main.cpp #include <iostream> #include ...

  4. linux sed文本

    sed介绍 sed(stream editor)是一种非交互式的流编辑器,通过多种转换修改流经它的文本.默认情况下,sed不会改变原文件本身,而只是对流经sed命令的文本进行修改,并将修改后的结果打印 ...

  5. 【整理】HTML5游戏开发学习笔记(2)- 弹跳球

    1.预备知识(1)在画布上绘制外部图片资源(2)梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度.如createLinearGradient,绘制梯度需要颜色组http://w ...

  6. 20155314 2016-2017-2 《Java程序设计》第8周学习总结

    20155314 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 会使用正 ...

  7. 跳过复制错误——slave_skip_errors、slave_exec_mode

    这一篇写写复制错误处理相关的另两个参数slave_skip_errors.slave_exec_mode,基本环境参考<复制错误处理——sql_slave_skip_counter> 一. ...

  8. Redis配置文件介绍

    Redis在源码包中存放了一个Redis配置实例文件,文件中对各个配置点进行了简单的介绍,我也通过这个文件来对Redis的一些配置进行一些简单介绍. 一.UNITS(单位)[了解] 1.Redis服务 ...

  9. spring事务详解(一)初探讨

    一.什么是事务 维基百科:数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成.理解:事务(Transaction)是数据库区别于文件系统的重要特性之一.传 ...

  10. cancel_delayed_work和flush_scheduled_work【转】

    转自:http://blog.chinaunix.net/uid-9688646-id-4052595.html 是不是觉得很玄?像思念一样玄?那好,我们来看点具体的,比如935行,INIT_DELA ...