博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #246 (Div. 2)
阅读量:5992 次
发布时间:2019-06-20

本文共 2797 字,大约阅读时间需要 9 分钟。

主题链接:

本场比赛他们拿出前两分钟后,C。

不是真的很有趣。

A:简单统计。时间复杂度:O(N)

#include
#include
#include
using namespace std;const int N = 2010;int a[N];int main(){ int n, k; scanf("%d%d", &n, &k); int cnt = 0; for(int i = 0; i < n; ++i){ int x; scanf("%d", &x); if(5 - x >= k) ++cnt; } printf("%d\n", cnt / 3); return 0;}

B:数据较大。 简单模拟会超时。 能够考虑。作为一个队主场(n-1)场肯定是主队,还有可能的是当该队客场比赛时。 颜色与主队一样, 这样仅仅要hash一下同种颜色的主队个数就可以。 最后能够依据总的比赛数 - 主队的次数得到客队的次数。时间复杂度O(N)

#include
#include
#include
using namespace std;const int N = 1e5 + 10;int a[N], b[N];int x[N];int main(){ int n, k; scanf("%d", &n); for(int i = 0; i < n; ++i){ scanf("%d%d", &a[i], &b[i]); ++x[a[i]]; } for(int i = 0; i < n; ++i){ int ans = n - 1 + x[b[i]]; if(a[i] == b[i]) ans -= 1; printf("%d %d\n", ans, n*2 - 2 - ans); } return 0;}

C:乱搞题。 题意非常easy。 就是能够互换之间相隔为质数个数的数字,得到 一个有序的序列。

YY了一个定理:随意一个数都能够由最多5个质数的和表示(原来是哥德巴赫猜想:囧), 刚好最大操作个数<=5*n。

这样先预处理出全部的素数。 每次二分素数, 推断并进行交换。  时间复杂度:O(N*sqrt(N))

#include
#include
#include
#include
using namespace std;const int N = 1e6 + 1;bool isPrime[N];int a[N], prime[N];int p[N];int cnt;int x[N], y[N];void gao(){ int k = sqrt(N*1.0); int i = 2; while(i <= k){ for(int j = i*i; j < N; j += i) isPrime[j] = 1; ++i; while(i <= k && isPrime[i]) ++i; } for(int i = 2; i < N; ++i){ if(!isPrime[i]) prime[cnt++] = i; }}int foo(int k){ int l = 0, r = cnt - 1; while(l < r){ int m = (l + r + 1) >> 1; // printf("m = %d\n", m); if(prime[m] <= k) l = m; else r = m - 1; } return l;}int main(){ int n; scanf("%d", &n); gao();// for(int i = 0; i < 30; ++i) printf("%d ", prime[i]); for(int i = 1; i <= n; ++i){ scanf("%d", &a[i]); p[a[i]] = i; } // foo(3); int ans = 0; for(int i = 1; i <= n; ++i){ int dif = abs(p[i] - i) + 1; if(p[i] > i){ int tmp = dif; int xx = p[i], yy = i; while(tmp != 0){ // printf("%d en\n", tmp); int k = foo(tmp); // printf("%d\n",foo(tmp)); x[ans] = xx, y[ans] = xx - prime[k] + 1; p[a[y[ans]]] = xx; swap(a[xx], a[y[ans]]); tmp -= prime[k]; if(tmp != 0) tmp += 1; xx = y[ans++]; } } else if(i > p[i]){ int tmp = dif; int xx = p[i], yy = i; while(tmp != 0){ int k = foo(tmp); x[ans] = xx, y[ans] = xx + prime[k] - 1; p[a[y[ans]]] = xx; swap(a[xx], a[y[ans]]); tmp -= prime[k]; if(tmp) ++tmp; xx = y[ans++]; } } } printf("%d\n", ans); for(int i = 0; i < ans; ++i){ if(x[i] < y[i]) printf("%d %d\n", x[i], y[i]); else printf("%d %d\n", y[i], x[i]); } return 0;}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4725555.html,如需转载请自行联系原作者

你可能感兴趣的文章
awk如何引用外部变量
查看>>
部置VMware Management Assistant-vMA
查看>>
我的友情链接
查看>>
High Level Google Doc
查看>>
Java异常处理-----抛出处理
查看>>
项目启动时注意事项
查看>>
排查 “Detected Tx Unit Hang”问题
查看>>
c++ 如何定义未知元素个数的数组?【转】
查看>>
【Android必备】创建一个Fragment(8)
查看>>
【Touch&input 】支持跨Android版本的控制器(17)
查看>>
提高ActiveMQ工作性能(上)
查看>>
CSS3可使用动画的属性
查看>>
Redis key 设计技巧
查看>>
JAVA入门教程运算符和表达式
查看>>
模仿百度输入 提示框
查看>>
我的友情链接
查看>>
chmod/chown 命令
查看>>
Linux目录结构及文件说明
查看>>
搭建oauth-server
查看>>
如何设计活动目录组织单位
查看>>