博主又复活了(因为文化课作业太多写不完了所以继续自爆自弃


A.完全k叉树

签到题,考虑最底层的点的距离即可,注意细节(成功拉低了平均通过率)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())  if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}int main() {int T = read();while (T--) {LL k = read(), n = read(), x = 1, now = 1, cnt = 0;if (k == 1) {printf("%d\n", n - 1);continue;}while (x < n) {cnt++;now *= k;x += now;}x -= now;cnt--;LL ans = 0, lft = n - x;if (lft <= now / k) ans = max(cnt * 2 + 1, lft == 1 ? 1LL : 2LL);else ans = cnt * 2 + 2;printf("%d\n", ans);}return 0;
}

B.距离产生美

签到题,每次当且仅当∣ai−ai−1∣&lt;k|a_i-a_{i-1}|&lt;k∣ai​−ai−1​∣<k时,把aia_iai​改成infinfinf

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int N = 100010;int a[N], used[N];
inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())  if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}int main() {int n = read(), k = read(), ans = 0;For(i, 1, n) a[i] = read();For(i, 2, n) {if (abs(a[i] - a[i - 1]) < k && !used[i - 1]) {ans++;used[i] = 1;}}printf("%d\n", ans);return 0;
}

C.烤面包片

签到题,mod≤1e9,4!!&gt;1e9mod\leq 1e9,4!!&gt;1e9mod≤1e9,4!!>1e9所以只需考虑n≤3n\leq 3n≤3的情况,其他都输出000,注意0!!!=10!!!=10!!!=1

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;inline int mul(int x, int y, int M) {return (int)(1LL * x * y % M);}
inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())  if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}int main() {int n = read(), M = read();if (n == 0 || n == 1) printf("%d\n", 1 % M);else if (n == 2) printf("%d\n", 2 % M);else if (n == 3) {int now = 1;For(i, 1, 720) now = mul(now, i, M);printf("%d\n", now);}else puts("0");return 0;
}

D.茶颜悦色

普通题,将y坐标离散对x这一维线性枚举长度为k的所有点,对y这一维用扫描线维护只对[y-k,y]有贡献,时间复杂度O(nlog⁡n)\mathcal{O(n\log n)}O(nlogn)(给茶颜悦色打广告可还行

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int N = 100010;
struct Point {int x, y;
}p[N];
struct Node {Node *ls, *rs;int tag, v;Node() {ls = rs = 0;tag = v = 0;}
}*root;
int py[N << 1], cnty;inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())   if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}inline bool cmp(Point a, Point b) {return a.x < b.x || a.x == b.x && a.y < b.y;
}inline void pushdown(Node *&rt) {if (!rt -> ls) rt -> ls = new Node();if (!rt -> rs) rt -> rs = new Node();rt -> ls -> v += rt -> tag;rt -> rs -> v += rt -> tag;rt -> ls -> tag += rt -> tag;rt -> rs -> tag += rt -> tag;rt -> tag = 0;
}inline void pushup(Node *&rt) {rt -> v = max(rt -> ls -> v, rt -> rs -> v);
}inline void modify(int l, int r, int L, int R, int val, Node *&rt) {if (!rt) rt = new Node();if (r < L || R < l) return;if (L <= l && r <= R) {rt -> tag += val;rt -> v += val;return;}int mid = l + r >> 1;pushdown(rt);modify(l, mid, L, R, val, rt -> ls); modify(mid + 1, r, L, R, val, rt -> rs);pushup(rt);
}int main() {int n = read(), k = read();py[++cnty] = 1;For(i, 1, n) {p[i].x = read(), p[i].y = read();py[++cnty] = p[i].y;py[++cnty] = p[i].y - k;}sort(py + 1, py + cnty + 1);int ny = unique(py + 1, py + cnty + 1) - py - 1;sort(p + 1, p + n + 1, cmp);int l = 1, r = 1;for(; r <= n; ++r) {if (p[r].x - p[l].x > k) break;modify(1, ny, lower_bound(py + 1, py + ny + 1, p[r].y - k) - py, lower_bound(py + 1, py + ny + 1, p[r].y) - py, 1, root);}int ans = 0;for(; r <= n; ++r) {ans = max(ans, root -> v);for(; p[r].x - p[l].x > k; ++l) modify(1, ny, lower_bound(py + 1, py + ny + 1, p[l].y - k) - py, lower_bound(py + 1, py + ny + 1, p[l].y) - py, -1, root);modify(1, ny, lower_bound(py + 1, py + ny + 1, p[r].y - k) - py, lower_bound(py + 1, py + ny + 1, p[r].y) - py, 1, root);}ans = max(ans, root -> v);printf("%d\n", ans);return 0;
}

E.飞行棋

普通题,考虑在[d−k,d−1][d-k,d-1][d−k,d−1]中的每一个位置都有1k\frac{1}{k}k1​的概率到达终点,还有k−1k\frac{k-1}{k}kk−1​的概率到达另一个[d−k,d−1][d-k,d-1][d−k,d−1]的点,所以期望步数是kkk。从终点出发逆向dp,dp[x]=k(x∈[1,k]),dp[x]=1+1k∑i=x−kx−1dp[i]dp[x]=k(x\in [1,k]),dp[x]=1+\frac{1}{k}\sum_{i=x-k}^{x-1}dp[i]dp[x]=k(x∈[1,k]),dp[x]=1+k1​∑i=x−kx−1​dp[i],由于d较大,使用矩阵加速即可。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int N = 25;int K, inv;
inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())  if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}inline void upd(int &x, int y) {x += y; x -= x >= MOD ? MOD : 0;}
inline int dec(int x, int y) {x -= y; x += x < 0 ? MOD : 0; return x;}
inline int add(int x, int y) {x += y; x -= x >= MOD ? MOD : 0; return x;}
inline int mul(int x, int y) {return 1LL * x * y % MOD;};inline int qui_pow(int x, int y) {int ret = 1;for(; y; y >>= 1) {if (y & 1) ret = mul(ret, x);x = mul(x, x);}return ret;
}struct Matrix {int num[N][N];Matrix operator * (const Matrix &A) const {Matrix ret;memset(ret.num, 0, sizeof ret.num);For(i, 1, K) For(j, 1, K) For(k, 1, K) upd(ret.num[i][j], mul(num[i][k], A.num[k][j]));return ret;}
}init, cha;inline Matrix mat_pow(Matrix x, LL y) {Matrix ret;memset(ret.num, 0, sizeof ret.num);For(i, 1, K) ret.num[i][i] = 1;for(; y; y >>= 1) {if (y & 1) ret = ret * x;x = x * x;}return ret;
}int main() {LL d = read();K = read(), inv = qui_pow(K, MOD - 2);For(i, 1, K) init.num[1][i] = K, cha.num[i][1] = inv;init.num[1][K + 1] = cha.num[K + 1][1] = cha.num[K + 1][K + 1] = 1;For(i, 2, K) cha.num[i - 1][i] = 1;K++;init = init * mat_pow(cha, d - K + 1);printf("%d\n", init.num[1][1]);return 0;
}

F.三元组

普通题,假设ai+aj≤bi+bja_i+a_j\leq b_i+b_jai​+aj​≤bi​+bj​,所以2(ai+aj)≤bi+bj,2ai−bi+2aj−bj≤02(a_i+a_j)\leq b_i +b_j,2a_i-b_i+2a_j-b_j\leq 02(ai​+aj​)≤bi​+bj​,2ai​−bi​+2aj​−bj​≤0,只需按2ai−bi2a_i-b_i2ai​−bi​排序即可,ai+aj≥bi+bja_i+a_j\geq b_i+b_jai​+aj​≥bi​+bj​亦然

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int N = 100010;inline void upd(int &x, int y) {x += y; x -= x >= MOD ? MOD : 0;}
inline int dec(int x, int y) {x -= y; x += x < 0 ? MOD : 0; return x;}
inline int add(int x, int y) {x += y; x -= x >= MOD ? MOD : 0; return x;}
inline int mul(int x, int y) {return 1LL * x * y % MOD;};inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc()) if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}struct Node {int a, b, c, v;
}p[N];
int v[N], sum[N], n;inline bool cmp(Node x, Node y) {return x.v < y.v;}inline int solve() {int ret = 0;For(i, 1, n) p[i].v = 2 * p[i].a - p[i].b;sort(p + 1, p + n + 1, cmp);sum[0] = v[0] = 0;For(i, 1, n) {v[i] = p[i].v;sum[i] = add(sum[i - 1], p[i].c);upd(ret, mul(sum[upper_bound(v + 1, v + i + 1, -v[i]) - v - 1], p[i].c));}return ret;
}int main() {n = read();For(i, 1, n) p[i].a = read(), p[i].b = read(), p[i].c = read();int ans = solve();For(i, 1, n) swap(p[i].a, p[i].b);upd(ans, solve());printf("%d\n", ans);return 0;
}

G.篮球校赛

签到题,直接状压dp,时间复杂度O(5∗25n)\mathcal{O(5* 2^5 n)}O(5∗25n)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int N = 100010;inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())    if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}LL dp[N][32], a[N][5];int main() {int n = read();For(i, 1, n) For(j, 0, 4) a[i][j] = read();For(i, 1, n) {For(j, 0, 31) {For(k, 0, 4) {if ((j >> k) & 1) dp[i][j] = max(dp[i - 1][j ^ (1 << k)] + a[i][k], dp[i][j]);dp[i][j] = max(dp[i - 1][j], dp[i][j]);}}}printf("%lld\n", dp[n][31]);return 0;
}

H.分配学号

签到题,先排序确定最终的学号集合,易证明集合是唯一的,从大到小枚举可能,运用乘法原理和加法原理求得答案

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int N = 100010;
inline void upd(int &x, int y) {x += y; x -= x >= MOD ? MOD : 0;}
inline int dec(int x, int y) {x -= y; x += x < 0 ? MOD : 0; return x;}
inline int add(int x, int y) {x += y; x -= x >= MOD ? MOD : 0; return x;}
inline int mul(int x, int y) {return 1LL * x * y % MOD;}LL a[N], b[N];
int ans = 1, cnt[N];inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc()) if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}int main() {int n = read();For(i, 1, n) a[i] = read();sort(a + 1, a + n + 1);memcpy(b, a, sizeof b);For(i, 2, n) {if (a[i] <= a[i - 1]) a[i] = a[i - 1] + 1, cnt[i] = cnt[i - 1] + 1;}int now = 0, maxi = 0, ret = 1;Rep(i, n, 1) {if (!cnt[i]) {ans = mul(ans, ret);now = maxi = 0;continue;}if (!now) now = cnt[i], maxi = a[i], ret = 1;ret = mul(ret, maxi - b[i] + 1 - now + cnt[i]);}printf("%d\n", ans);return 0;
}

I.Gree的心房

签到题,留出最短的一条路径,可见障碍物最多填充(n−1)×(m−1)(n-1)\times(m-1)(n−1)×(m−1)个位置,超过这个值就输出-1,否则输出n+m-2

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define Mp make_pair
#define Pi pair<int, int>
#define Pb push_back
#define Fi first
#define Se second
#define Gc getchar
#define LL long long
#define Res register int
#define For(i, l, r) for(int i = (int)(l); i <= (int)(r); ++i)
#define Rep(i, r, l) for(int i = (int)(r); i >= (int)(l); --i)using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;inline LL read(){LL x = 0;char ch = Gc();bool positive = 1;for (; !isdigit(ch); ch = Gc())  if (ch == '-')  positive = 0;for (; isdigit(ch); ch = Gc()) x = (x << 1) + (x << 3) + (ch ^ 48);return positive ? x : -x;
}int main() {int n = read(), m = read(), k = read();LL all = 1LL * (n - 1) * (m - 1);if (k <= all) printf("%d\n", n + m - 2);else puts("-1");return 0;
}

比赛总结:jwj是有gf的人生赢家!我也要!

CCPC-Wannafly 夏季欢乐赛 题解相关推荐

  1. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  2. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)比赛总结

    CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)比赛总结 总结: ​ 这场比赛不太顺心,B,I水题 10分钟内A了.A题推公式用double写卡了1个小时,换成其他暴力 ...

  3. 【题解】Comet OJ 夏季欢乐赛(2019)A 完全k叉树⭐⭐ 【思维】

    Comet OJ 夏季欢乐赛(2019)A 完全k叉树⭐⭐ 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球&quo ...

  4. Comet OJ 夏季欢乐赛 Gree的心房

    Comet OJ 夏季欢乐赛 Gree的心房 题目传送门 题目描述 据说每一个走进Gree哥哥心房的小姑娘都没有能够再走出来-- 我们将Gree哥哥的心房抽象成一个n \times mn×m的地图,初 ...

  5. Comet OJ 夏季欢乐赛 篮球校赛

    Comet OJ 夏季欢乐赛 篮球校赛 题目传送门 题目描述 JWJU注重培养学生的"唱,跳,rap,篮球"能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台 ...

  6. 2019BNUZ_ACM国庆欢乐赛题解

    目录 题目来源 : A.小沛的暑假安排 B.nsy上幼儿园 C.nsy上小学 D.怡姐的游戏 E.如风般奔跑 F.cjb找朋友 G. 黑魔仙wgc的攻击 H. 皓洲喜欢经纬线 I. 小枫买车 J. 单 ...

  7. 北师大珠海分校2017国庆欢乐赛题解

    我都老了还让我写这种题解. 约翰·洛吉·贝尔德 每次开k个电视,需要这k个电视的色彩都不一样 每种色彩需要一根信号源 现在问至少需要多少种信号源 那么我们可以找k个电视.他们都只用1个信号源,有不同颜 ...

  8. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)部分题解

    茶颜悦色 题意 固定kkk的矩形,能最多框住多少个点. 题解 假如我们固定一个矩形,以左下角为坐标. 这样子对于(a,b)(a,b)(a,b),那么能够包括到这个点的矩形左下角的范围: x∈(a−k, ...

  9. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E.飞行棋(期望dp+矩阵快速幂)

    题目 飞行棋的规则如下: 1.每名玩家有一个棋子,每个回合可以掷一次骰子. 2.如果使用的骰子为 k面,则这 k面上的点数分别为 1,2,3,-,k,且掷得每种点数的概率均为​. 3.如果当前回合掷得 ...

最新文章

  1. Exchange 2003群集的安装
  2. Flutter开发之Android应用打包发布(22)
  3. 【控制】遗传算法(GA,Genetic Algorithm)及 Matlab 实现 代码详细版
  4. NLP:词向量与ELMo模型笔记
  5. 什么集成mysql_mysql集成部署
  6. matlab中的 variable,matlab中的问题Missing variable or function
  7. 电影网址导航V20201218版源码
  8. 【报告分享】2020中国企业数字化转型研究报告-清华大学.pdf(附下载链接)
  9. 【HISI系列】之Hi3559A V100R001C02SPC010文档及SDK
  10. 13 岁不可能创建出 RISC-V 内核?Nicholas Sharkey:我可以
  11. js划词翻译、屏幕取词,取词位置获取(真正解决定位问题)
  12. Win10系统打开共享文件提示没有权限使用网络资源怎么处理
  13. 软件需求收集、挖掘和分析方法
  14. [NOIP 2005 T2] 过河 (动态规划+简单数论)
  15. 华为路由器用Linux开发,华为路由器常用配置 - osc_1v2pb1nt的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. 阿里犸良导出的json文件怎么使用
  17. C语言经典面试笔试题
  18. 英语作文计算机国际会议开幕词,有关英语会议开场致辞范文
  19. 【C语言基础入门】2.C语言中四则运算、关系运算、逻辑运算与位运算
  20. 如何挑选一款优秀的企业网盘

热门文章

  1. 树的平衡 AVL Tree
  2. 贾立平是中科学院计算机所博士,贾立平是哪个大学的博士曝光 贾立平秀恩爱不忘考博士...
  3. 【Android每日一讲】2012.11.27 向左或向右 - RadioGroup组与onCheckedChanged事件
  4. 不用任何软件,批量转化图片格式png转jpg,bat脚本实现
  5. 新注册公众号没有留言评论功能怎么办?如何开通公众号留言功能?
  6. 【学习笔记】《深入浅出Pandas》第17章:Pandas实战案例
  7. Opencv做鼠标绘图
  8. 漫画行业有妖气:曾经的一哥,今日的难兄
  9. Security:在 SIEM 上运用 Elastic Security
  10. Day25(线程同步安全问题,SellticketLock,DieLock,ThredGroup,ThreadPool,Timer,线程安全的类,匿名内部类的形式创建线程对象)