看到难度普遍7-9就感觉很劲…再加上doc出品,于是果断入坑。由于知识性内容还没有学完,只能慢慢刷了。

章节 1. 一些简单的练手题

1.1 捕风捉影

这sb题居然智障WA了两次….

由于是回文串只要枚举前半段,然后瞎几把测试素数就好了。
顺便学习一波miller-rabin的二次探查。

复杂度O(n√Slgn),S为测试次数。

#include <bits/stdc++.h>
using namespace std;long long power(long long a, long long n, long long mod)
{if (n == 0) return 1%mod;long long p = power(a, n>>1, mod);p = p*p%mod;if (n&1) p = p*a%mod;return p;
}bool miller_rabin(long long n)
{if (n == 2) return 1;if (n < 2 || !(n&1)) return 0;int k;long long u;for (k=0, u=n-1; !(u&1); u>>=1, k++);for (int i = 1; i < 20; i++) {long long x = rand()%(n-2)+2, pre;if (x%n == 0) continue;x = power(x, u, n);pre = x;for (int j = 1; j <= k; j++) {x = x*x%n;if (x == 1 && pre != 1 && pre != n-1) return 0;pre = x;}if (x != 1) return 0;}return 1;
}long long rev(long long a)
{long long t = 0;while (a) t = (t+a%10)*10, a /= 10;return t/10;
}
long long ans[100005];
int top = 0;
int main()
{srand(time(0));long long n, m;cin >> n >> m;if (5 >= n && 5 <= m) ans[++top] = 5;if (7 >= n && 7 <= m) ans[++top] = 7;int len = 1;for (long long i = 1; i <= 10000; i++) {long long l = i, r = rev(i);long long lk = l*power(10, len, LONG_LONG_MAX)+r;if (lk >= n && lk <= m && miller_rabin(lk)) ans[++top] = lk;for (int j = 0; j < 10; j++) {lk = l*power(10, len+1, LONG_LONG_MAX)+j*power(10, len, LONG_LONG_MAX)+r;if (lk >= n && lk <= m && miller_rabin(lk)) ans[++top] = lk;}if (i >= power(10, len, LONG_LONG_MAX)-1) len++;}sort(ans+1, ans+top+1);top = unique(ans+1, ans+top+1)-ans-1;for (int i = 1; i <= top; i++) printf("%lld\n", ans[i]);return 0;
}

1.2 小白逛公园

以前写线段树查询从来都是直接返回答案…做了这题才发现可以返回一个完整的节点信息。

就是线段树维护总和,最大子段和,左起最大子段和,右起最大子段和。

复杂度O(nlgn)

#include <bits/stdc++.h>
using namespace std;const int MAXN = (1<<19)+2;
struct node {int lsum, rsum, sum, subsum, l, r;node():l(0),r(0){}friend bool operator == (const node &a, const node &b){return a.l == b.l;}
} tree[MAXN*2];
int a[MAXN], n, m;
#define nil tree[0]node link(const node &l, const node &r)
{if (l == nil) return r;if (r == nil) return l;node nd;nd.sum = l.sum + r.sum;nd.lsum = max(l.lsum, l.sum+r.lsum);nd.rsum = max(r.rsum, r.sum+l.rsum);nd.subsum = max(l.subsum, max(r.subsum, l.rsum+r.lsum));return nd;
}void build(int nd, int l, int r)
{if (l < r) {build(nd*2, l, (l+r)/2);build(nd*2+1, (l+r)/2+1, r);tree[nd] = link(tree[nd*2], tree[nd*2+1]);tree[nd].l = l, tree[nd].r = r;} else {tree[nd].l = tree[nd].r = l;tree[nd].sum = tree[nd].lsum = tree[nd].rsum = tree[nd].subsum = a[l];}
}void dfs(int nd, int tab = 0)
{if (!tree[nd].l) return;for (int i = 1; i <= tab; i++) putchar(' ');//printf("[%d,%d] : %d,%d,%d,%d\n", tree[nd].l, tree[nd].r, tree[nd].lsum, tree[nd].rsum, tree[nd].subsum, tree[nd].sum);dfs(nd*2, tab+2);dfs(nd*2+1, tab+2);
}void update(int nd, int pos, int dat)
{if (tree[nd].l == tree[nd].r) {tree[nd].sum = tree[nd].lsum = tree[nd].rsum = tree[nd].subsum = dat;} else {int l = tree[nd].l, r = tree[nd].r;update((pos<=(l+r)/2)?nd*2:nd*2+1, pos, dat);tree[nd] = link(tree[nd*2], tree[nd*2+1]);tree[nd].l = l, tree[nd].r = r;}
}node query(int nd, int l, int r)
{if (l > r) return nil;if (tree[nd].l == l && tree[nd].r == r) return tree[nd];node d = link(query(nd*2, l, min(r, tree[nd*2].r)),query(nd*2+1, max(l, tree[nd*2+1].l), r));//printf("[%d,%d] %d %d->%d,%d,%d\n", tree[nd].l, tree[nd].r, l, r, d.subsum, d.lsum,d .rsum);return d;
}int main()
{scanf("%d%d", &n, &m);tree[0].l = 123231131;for (int i = 1; i <= n; i++) scanf("%d", &a[i]);build(1, 1, n);for (int i = 1; i <= m; i++) {int opt, opl, opr;scanf("%d%d%d", &opt, &opl, &opr);if (opt == 1) {if (opl > opr) swap(opl, opr);printf("%d\n",query(1, opl, opr).subsum);} else if (opt == 2) {update(1, opl, opr);} else dfs(1);}return 0;
}

1.3 CoVH之柯南开锁

一开始以为是反转思考了好久,后来才发现只是按下去。

最小割经典建图:

  1. S→row
  2. col→T
  3. row→col,if there is something at (row,col)

正确性是显然的,复杂度O(跑得过)。

貌似用二分图匹配也可以?但我不会匈牙利那一套理论。

#include <bits/stdc++.h>
using namespace std;const int MAXN = 50005, MAXM = 5000005;
struct node {int to, next, f, neg;
} edge[MAXM];
int head[MAXN], top = 0;
void push(int i, int j, int k)
{++top, edge[top] = (node) {j, head[i], k, top+1}, head[i] = top;++top, edge[top] = (node) {i, head[j], 0, top-1}, head[j] = top;
}int vis[MAXN], bfstime = 0;
int lev[MAXN], S = 50001, T = 50002;
queue<int> que;bool bfs()
{vis[S] = ++bfstime, lev[S] = 0, que.push(S);while (!que.empty()) {int tp = que.front(); que.pop();for (int i = head[tp]; i; i = edge[i].next) {if (edge[i].f == 0 || vis[edge[i].to] == bfstime) continue;vis[edge[i].to] = bfstime, lev[edge[i].to] = lev[tp]+1, que.push(edge[i].to);}} return vis[T] == bfstime;
}int dfs(int nd, int maxf = 233333333)
{if (nd == T || !maxf) return maxf;int ans = 0, t;for (int i = head[nd]; i; i = edge[i].next) {if (edge[i].f == 0 || lev[edge[i].to] != lev[nd] + 1) continue;t = dfs(edge[i].to, min(maxf, edge[i].f));ans += t, maxf -= t;edge[i].f -= t, edge[edge[i].neg].f += t;} if (maxf) lev[nd] = -1;return ans;
}int dinic()
{int ans = 0;while (bfs()) ans += dfs(S);return ans;
}int n, m;
char str[105];
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) push(S, i, 1);for (int i = 1; i <= m; i++) push(n+i, T, 1);for (int i = 1; i <= n; i++) {scanf("%s", str+1);for (int j = 1; j <= m; j++) if (str[j] == '1')push(i, n+j, 1);}cout << dinic() << endl;return 0;
}

章节 2. 轻松点它们很简单

2.1 cpc的逃离

变得难起来了…
构造问题,由于有二叉树计数考虑用卡特兰数。然后瞎几把搞【雾】。
复杂度O(lgn)。因为卡特兰数是指数增长,其反函数是对数增长。

#include <bits/stdc++.h>
using namespace std;// C : h(n)=h(n-1)*(4*n-2)/(n+1);long long h[20];void work(int n, long long k, bool out_side = 1) // n个节点中编号为k的
{//cerr << endl << n << " " << k << endl;if (k*n == 0) return;if (!out_side) putchar('(');for (int i = 0; i < n; i++) {if (h[i]*h[n-i-1] < k) k -= h[i]*h[n-i-1];else {work(i, (k-1)/h[n-i-1]+1, 0);putchar('X');work(n-i-1, k%h[n-i-1]?k%h[n-i-1]:h[n-i-1], 0);break;}}if (!out_side) putchar(')');
}int main()
{h[0] = 1;for (int i = 1; i < 20; i++) h[i] = h[i-1]*(4*i-2)/(i+1);//, printf("%lld\n", h[i]);long long x;while (scanf("%lld", &x), x != 0) {int i = 1;for (; x > h[i]; x -= h[i], i++);work(i, x);puts("");}return 0;
}

转载于:https://www.cnblogs.com/ljt12138/p/6684337.html

vijos训练之——星辰大海中闪烁的趣题相关推荐

  1. 的训练过程_指外翻的人在训练的过程中,要不要拉伸收肌?

    大家好 这里是诺亚第运动康复学院 第55讲?指外翻的人在训练的过程中,要不要拉伸?收肌? 现代人由于长期久坐 穿鞋穿袜把脚保护地太好 再加上体重越来越重 导致横弓纵弓塌陷的人越来越多 横弓一塌陷 横头 ...

  2. AlexeyAB中训练命令行中 -map 以及 -dont_show

    AlexeyAB(darknet yolov3)中训练命令行中 -map 以及 -dont_show 在darknet训练自己的数据中,在命令行中加入-map 和 -dont_show -map是为了 ...

  3. Ubuntu鼠标移动中闪烁解决方法

    Ubuntu鼠标移动中闪烁解决方法 更新显卡/核显驱动即可,到官网找驱动

  4. ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练)

    ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练) 目录 模型训练评估中常用的两种方法代码实现 T1.留一法一次性切分训练 T2.K折交叉验证训 模型训练评估中 ...

  5. 程序员的算法趣题Q56: 鬼脚图中的横线(思路2)

    目录 1. 问题描述 2. 思路2 2.1 从鬼脚图出发进行变形 2.2 反向变换 2.3 进一步探索 3. 小结 1. 问题描述 问题描述以及关于本问题的第一个思路参见:程序员的算法趣题Q56: 鬼 ...

  6. 程序员的算法趣题Q56: 鬼脚图中的横线(思路1)

    目录 1. 问题描述 2. 解题分析 2.1 贪心策略 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 感觉非常没有头绪.先做一些实例计算分析. 2.1 贪心策略 考虑图1的{1234- ...

  7. 程序员的算法趣题Q56: 鬼脚图中的横线(思路2的Python题解)

    目录 1. 问题描述 2. 实现方案 3. 代码实现 4. 后记 1. 问题描述 问题描述以及此前的讨论参见: 程序员的算法趣题Q56: 鬼脚图中的横线(思路1)https://blog.csdn.n ...

  8. 程序员的算法趣题Q58: 丢手绢游戏中的总移动距离

    1. 问题描述 2. 解题分析 搜索最短距离,图搜索问题中的最短距离问题,可以用广度优先搜索策略来解决. 2.1 搜索树示意图 搜索树示意图如下: 2.2 算法流程 用一维数组表示当前状态,但是要注意 ...

  9. a73*2+a53*2指的是什么_在影视表演的训练和学习中,台词的正确练习技巧是什么?...

    表演训练中的台词训练是学习影视表演的基础,表演训练中的台词训练还有很多技巧需要学习.在影视表演的训练和学习中,台词的正确练习技巧是什么?中影嘉宏北京总部的老师和大家聊一下帮助大家学习台词,练习台词. ...

最新文章

  1. AI应届生年薪涨到40万了,你现在转行还来得及!
  2. python爬虫框架排行榜-常用python爬虫框架整理
  3. v$session v$session_wait
  4. opencv3/C++ Harris角点、Shi-Tomasi角点亚像素角点
  5. mvc可以运行在linux下吗,asp.netmvc部署到linux(centos)
  6. 从零开始编写自己的C#框架(11)——创建解决方案
  7. 多媒体数据处理实验1:算术编码
  8. 最新美女COS写真网站整站源码下载+实测可用/带数据
  9. 基于ssm汽车租赁管理系统的设计与实现
  10. 使用pdf.js插件与LODOP控件实现前端浏览器静默打印PDF文件
  11. MySQL 优化---索引实战(三)
  12. 泛型与STL Note
  13. GBase 8c 数据库产品简介
  14. 打开桌面上计算机特别慢,如何解决Win7电脑启动慢的问题?
  15. 常用又有趣的网站大合集
  16. 实时监控Mysql等数据库变化_进行数据同步_了解Debezium_--Debezium工作笔记001
  17. psid mysql_使用Python对MySQL数据库插入二十万条数据
  18. 计算机电路板 接地,pcb电路板接地怎么接
  19. 特斯拉充电电流设置多大_特斯拉充电时间
  20. 计算机与scp通讯发生故障,在两台远程计算机之间使用scp命令时权限被拒绝错误...

热门文章

  1. 将数据从MySql导入数据至SQL Server 2000
  2. ssh scp不用输入密码
  3. Iperf 源代码分析(四)
  4. 问题 K: 数字统计
  5. Python中的字符串方法
  6. Python实现学生出勤记录
  7. html text align属性,CSS中的text-align属性怎么用
  8. has install-snap change in progress问题
  9. keras_contrib 安装
  10. 普及风险管理的一些环节