CSP-S 模拟1 洛谷上原题,不挂题面了。 A.斐波那契 P3938 斐波那契 观察上图,可发现规律:一个数的父亲等于这个数减去最大的小于它的斐波那契数。特殊的,如果这个数是斐波那契数,设这个数为 \(x\),\(x = fib(i)\),那它的父亲为 \(fib(i - 2)\)。 数据最大到 \(1e12\),打表发现,\(fib(60) >
部分内容参考了李煜东的《算法竞赛进阶指南》,在此声明。 单源最短路径 单源最短路径问题,是说,给定一张有向图(无向图)\(G=(V,E)\) ,\(V\) 是点集,\(E\) 是边集,\(|V|=n\),\(|E|=m\),节点是 \([1,n]\) 之间的连续整数,\((x,y,z)\) 描述一条从 \(x\) 到 \(y\) 边长为 \(z\) 的有向(无向)边
棋局评估(MINMAX搜索+α-β剪枝) 这是一个博弈的问题,在这里,你的对手希望他得高分,你希望你得高分,可是你分数高了他的分就低了。下棋的时候,你希望走出最好的局面,即使输也要分数最高,而你的对手恰恰相反,他要走出他的最好局面,也就是你的最坏局面,让你分数最低。这样交替行棋,也就完成了对
下发文件和题解 A. 斐波那契 对于上面这张图,尝试从2开始依次写下每个兔子的父亲的标号: 那么转换成数列就是这样的: 1 1 1 2 1 2 3 1 2 3 4 5 ... 可以发现这个序列由多个连续从 1 开始的序列组合到一起,每段长度依次是斐波那契数列里面的每一项. 那么就有以下规律: 令f(i)表示第i个
Madoka and Formal Statement 思维 如果合法,说明 \(a_i \le b_i\),因此也可以认为 \(b_i\) 就是 \(a_i\) 最后能变成的最大值 根据题意操作,只有 \(a_i \le a_{i+1}\) 的情况,才能使 \(a_i + 1\),因此 \(a_i\) 的理论最大值应该是 \(b_{i+1} + 1\) 因此只要所有的 \(b_i\) 都不大于 \(
Madoka and Underground Competitions 构造 在一行里,如果选定了其中一个位置是 \(X\),接下来就直接往左和往右每 \(k\) 个放置一个 \(X\) 就行了 每一行的初始位置根据一开始的那个 \(X\),斜着一个方向铺满,即可做到每一行都存在一个 \(X\) . X . . . . . X . . . . . X .
题目传送门 Solution 非常神奇的一道题。 我们不考虑交换操作,相反,我们去考虑把多少个 \(0\) 的位置变为 \(1\),同时我们记录选了多少个黑点,如果跟原来黑点数量相同即是合法。 此时我们可以发现一个神奇的性质对于 \(u\) 的儿子 \(v\),如果覆盖 \(u\) 的节点不覆盖 \(v\),那么覆盖 \(v
Counting Rectangles 思维 把所有的矩形左上角都叠在一起,就会发现是一个二维前缀和的求解问题:\(\sum_{i=h_s+1}^{h_b-1} \sum_{j=w_s+1}^{w_b-1} (i*j*cnt_{ij})\) 这个显然就是一个二维前缀和的问题,直接算就好了 #include <iostream> #include <cstdio> #include <string> #inclu
How Many to Be Happy? 最小割 因为是最小生成树,因此可以考虑对于一条边来说,他的左右两端的点视为处于两个不同的集合,然后只通过该边进行连接,这样最小生成树就必然会利用这条边 比该边大的边显然不用考虑,就考虑比该边边权小的边,然后进行最小割,边流量为 \(1\)(分割成两个集合,且割的
多重背包问题 II(水题但有注意点) 二进制优化的多重背包问题(主要注意的是二进制优化后的数组的大小问题) AC代码 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn=2010; int dp[maxn]; int w[maxn<<3],v[maxn
Erudite of words 组合数学 + 容斥 定义 \(F_i\):表示由 \(i\) 个字母组成的长度为 \(n\) 的单词数(每个字母必须在单词中出现) 显然答案就是 \(F_k * C_{m}^{k}\) 关于 \(F_i\) 的递推式: \[F_i = i^n - \sum_{j=1}^{k-1}(F_j) \]显然 \(i^n\) 代表 \(i\) 个字母随意摆放的情况,容斥地
前言 题目传送门! 更好的阅读体验? 感觉 D1 和 D2 不是同一个难度档次的呀...... 思路 设 \(a_j\oplus i < a_i \oplus j\),这意味着数字 \(a_j\oplus i\) 中,从个位起前 \(k\) 位和 \(a_i \oplus j\) 相同,之后第 \(k+1\) 位就不同了。 两个不同下标的数有点难处理,考虑转化为同一个下
函数 - 洛谷 可以发现性质 \(g(f^m(x))=f^m(g(x))\) 。 若设左侧 \(x\) 所在环大小为 \(size(x)\) ,右侧 \(g(x)\) 所在环的大小为 \(size(gx)\) 。 可以得到,\(size(gx)\mid size(x)\) 。 这是因为左侧下标呈循环,右侧的值呈循环,若环的大小不满足 \(size(gx)\mid size(x)\) ,必然会出
【模板】割点(割顶) tarjan 学了一下割点,发现就是找 \(low[nex] \ge dfn[now]\) 的点,同时根的话要求有两个分支才能作为割点 搜索的时候如果 \(nex\) 没有被访问过,则直接继续搜,如果访问过,则尝试通过 \(dfn[nex]\) 来松弛自己的 \(low[now]\),因为只考虑当前点能跑到的最上面的点,这与
Mr. Kitayuta's Technology tarjan + 思维 先缩点,然后考虑如何建边 如果其中一个 \(DAG\) 图中出现一个缩点后大小大于 \(2\) 的连通块(环),则考虑直接将这个 \(DAG\) 图变成一个环,代价显然都是相同的,即点的数量 因此延伸,考虑多个缩点前都有环的 \(DAG\) 图,我们不妨将他们全部变成一
【题解】P5304 [GXOI/GZOI2019]旅行者 一道利用 dijkstra 的很妙的图论题! 加深了我对于 dijkstra 的理解。 (于是在做完这道题两天后的模拟赛中遇到了和它套路几乎一样的,我却甚至没有想到用最短路……) 所以写个题解记录一下吧。 题目链接 [GXOI/GZOI2019]旅行者 - 洛谷 题意概述
Warp dp 状态优化 一开始想到的状态为:\(dp[i][x][y]\),第 \(i\) 步走到 \((x,y)\) 的方案数,但是发现状态转移非常难写,原因是坐标计算非常大 后来可以优化一下 \(dp\) 的状态:\(dp[i][j][k]\) 表示第 \(1,2,3\) 个方向走了 \(i,j,k\) 步 的方案数 这样就可以确定好所在的坐标,然后进行
暑假集训要结束了,快乐的时光总是短暂的,下面是丧心病狂的焚化课时间(人已经焚化了) 最后一场考试又来了一次模拟退役,,体验感极差 暑假结束了, 但是我还是这么菜。。。。。 A. T1 出了个大阴间题 考场一眼装压, 打了个一维的轻松过样例, 然后对拍, 一拍就假 然后发现子问题不优,但是全局可能
Preface 没有序言 Content [luogu P4059][Code+#1]找爸爸 题面太长难以概括,不写简要题目了QAQ。 首先发现,肯定没有两个对应位置都是空格的,否则可以去掉让答案更优。 因此,我们只需要考虑最后一位是不是空格,如果是,讨论它在小 A 还是小 B。 具体而言,令 \(dp(i,j,k)\) 表示两个字符
Preface 回归 Content [luogu P4310]绝世好题 给定序列 \(a_{1\sim n}\),求子序列 \(b\) 的最长长度 \(k\),使得 \(\forall i \in [2,k],b_i\mathsf{\&}b_{i-1}\gt 0\)。 \(1\le n\le 10^5,1\le a_i \le 10^9\)。 跟二进制有关,考虑位运算。 发现 \(b_i \mathsf{\&}b_{i-1}\gt 0
Connections 思维 真没看出来 由于给的是强连通图,直接保留从 \(1\) 开始深搜,保证 \(1\) 能访问到其他所有点的,然后反向建图,保证所有点能够到达 \(1\) #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <vector> using namespace std; const
[2011年NOIP提高组] 铺地毯 题目描述: 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上
首先,如果将题目的“圆环”改成“数组”,相信大家都会做,就是如下 int sum=0,maxn=0;//sum更新最大值 for(int i = 1;i <= n;i++){ scanf("%d",&a); if(sum < 0)sum = 0;//当sum小于零时,不如啥都不选 sum += a; maxn = max(maxn,sum); } printf("%d\n",maxn); 但是此题是一个环
Description 给定一张带权完全图,求一条路径满足 不重复经过一个点。 在过点 \(i\) 时,\(1\cdots i - 1\) 要么全访问过,要么都没有访问过。 点数 \(n\) 有 \(1\le n\le 1e3\) Solution % 你赛唯一做出来一道题 wwwwwwww QAQ 花了 1h30min 发现自己找的规律不对 QAQ 所以找规律最好
图的存储 邻接矩阵 它是利用矩阵的二维结构,使其中的一维代表其中一个端点,另一维代表另一个端点。 scanf("%d",&m); memset(G,0,sizeof(G)); for(int i=1;i<=m;++i) { scanf("%d%d",&x,&y); G[x][y]=G[y][x]=1;//无向图 } 缺点:空间占用太大,