设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\(d>\sqrt{max\ d}\)的询问,我们可以爆枚其倍数.然后就变成询问一个区间内一些数的个数,可以考虑用莫队.考虑到移动和询问的根号是分开计算的,所以复杂度是\(O(q(\sqrt n+\sqrt{max\ d}))\). 代码 #include<bits/stdc++.h> #de…
题意转化 考虑我们对于集合中每一个\(i\),若\(i-2,i+k\)存在,就向其连边. 那么,一个合法的集合就需要满足,不会存在环. 这样问题转化到了图上,就变得具体了许多,也就更容易考虑.求解了. 奇偶性讨论 这题对于\(k\)为奇数/偶数的情况,要分别处理. 由于偶数情况较为简单,所以我们从偶数讲起. 当\(k\)为偶数 这时我们发现奇数和偶数是独立的. 我们分别求出奇数和偶数的方案数(\(DP(\lfloor\frac{n+1}2\rfloor,\frac k2)\)和\(DP(\lfl…
莫比乌斯反演 考虑先推式子: \[\sum_{i=l}^r[gcd(a_i,G)=1]\] \[\sum_{i=l}^r\sum_{p|a_i,p|G}\mu(p)\] \[\sum_{p|G}\mu(p)\sum_{i=l}^r[p|a_i]\] 因此我们只要枚举询问的这个数的因数,然后求出这段区间内有多少个数是它的倍数即可. 分块 我们可以统计对于每个数,每个块内有多少个数是其倍数. 数的规模\(O(n)\),块大小\(O(\sqrt n)\),所以内存是\(O(n\sqrt n)\),询问…
线段树上\(DP\) 首先发现,每个数肯定是向自己的前驱或后继连边的. 则我们开一棵权值线段树,其中每一个节点记录一个\(f_{0/1,0/1}\),表示在这个区间左.右端点是否连过边的情况下,使这个区间符合条件的最小代价. 合并时考虑如果左儿子的右端点或右儿子的左端点中有一个没有连过边,就必须连边,否则就不连边. 然后我的写法比较蠢,不知道为什么当左右儿子中某个节点只有一个数时需要特判处理. 最后答案就是根节点的\(f_{1,1}\). 具体详见代码. 代码 #include<bits/std…
LINK:qiqi20021026的T1 考场上只拿到了50分的\(nq\)暴力. 考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高. 先考虑LCS的问题 常见解决方法是后缀数组/trie树. 一个贪心是 每次让贡献最大的一对配对是最优的策略. 具体证明可以利用扰动法 或者观察法. 即设\(p,q,l,r\) 分类讨论一下情况就行辣 怎么证明全局最优?可以发现任意两个匹配都是这样最优 交换会变得更差 这样应该可以说明全局最优了吧? 这个贪心直接做复杂度还是很高 可以考虑trie树上…
11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; ; int n, m; LL ans; LL qpow(LL a, LL b) { LL res = ; while (b) { ) res = res * a % Mod; a =…
体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时,面对海量的原始数据,如何对数据进行处理,得到同学们的体育总评成绩却又成了体育部老师的一大难题. 对于大一的同学们来说,体育课的总评成绩由五部分组成:体育课专项成绩(满分50分).长跑测试成绩(满分20分).“阳光长跑”成绩(满分10分).体质测试成绩(满分10分).“大一专项计划”成绩(满分10分)…
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模拟 时间:3.5h 期望得分:100+0+40 实际得分:100+0+40 A 序列sequence(two pointers) 其实我们只要处理每个数与哪些数相加,会产生进位就行了. 把数排序后,枚举一个数x,容易想到满足使x+y进位的y是单调的(要求y<=x).所以可以二分. 但是单调,好像只需…
[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\)的时候,马在原点.每个时刻马都跳一步. 可是这个坐标图有点残缺,有几个点是不能跳到的. 然后小美很好奇在\(time=[0,K]\)中,马能跳到多少个不同的格子. [输入格式] 从文件chess.in中读入数据. 第一行两个数K,n表示时间上限和残缺的点的数量. 接下来n行,每行一个坐标 xi,yi…
写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些比较稳的暴力,虽然不见得能拿很高档的暴力或者打出正解,但至少不会挂分,最后能拿到的分数也还能看.但是一上点难度,或者不对胃口,就明显感觉力不从心.总是只能打最低档的暴力,甚至有些题只能拿\(10pts\)的\(dfs\)分.有优化想不出来,有式子也推不出来.时间也总是不够用--在某道题上浪费了太多时…
二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能经过排插数量最大的那些充电器. 所以,我们只要模拟插排插的过程,记录当前深度\(d\).插座数\(t\)即可. 设选择的能经过排插数量恰好为\(d\)的充电器有\(x\)个,则若\(t<x\),显然不合法. 否则,我们将\(x\)个位置插上充电器,其余位置尽可能地插排插,就可以了. 代码 #incl…
题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为了更好统计,把原式变为$n^2-\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)\leq n]$. 然后开始毒瘤... 首先,考虑枚举$lcm(i,j)$,设为$d$,计算有多少对$i.j$的最小公倍数为$d$. 设$i=p_1^{a_1}p_2^{a_2}\…
题目大意: 设$S(n,m)$为第二类斯特林数,$F_i$表示斐波那契数列第$i$项. 给定$n,R,K$,求$\sum\limits_{i=1}^{n}(\sum\limits_{m=1}^{R}F_i)!i!\sum\limits_{l=0}^{i}\sum\limits_{j=0}^{\sum\limits_{t=1}^{R}F_t}\frac{S(k,i-l)}{l!}\frac{S(i,\sum\limits_{w=1}^{R}F_w-j)}{j!}$的值$mod$ $10000000…
预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\equiv x(mod\ 2)\)的方案数乘上\(\prod_{i=l}^ra_i\equiv x(mod\ 5)\)的方案数. 状态设置 考虑接下来怎么求. 既然现在模数是质数,而在模质数意义下的逆元是唯一的,除了\(0\)没有逆元,因此只要特殊考虑\(0\). 设\(f_{i,j}\)表示 将区间\…
可持久化并查集 显然是可持久化并查集裸题吧... 就是题面长得有点恶心,被闪指导狂喷. 对于\(K\)操作,直接\(O(1)\)赋值修改. 对于\(R\)操作,并查集上直接连边. 对于\(T\)操作,先询问当前是否连通,若联通再询问\(t\)次操作前是否连通. 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar>…
卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p}^{y\ mod\ p}\] 也就是说,我们可以把\(x\)和\(y\)转化成两个\(p\)进制数,然后每一位分别求组合数后再乘起来. 所以问题来了,什么时候一个组合数的值模\(p\)为\(0\)? 由于它是质数,所以对于一个组合数\(C_a^b\),当且仅当\(a<b\)时它的值才会为\(0\)…
从暴力考虑转化题意 考虑最暴力的做法,我们枚举路径的两端,然后采用类似求树上路径长度的做法,计算两点到根的贡献,然后除去\(LCA\)到根的贡献两次. 即,设\(v_i\)为\(i\)到根路径上的边权异或和,那么\((x,y)\)的答案就是: \[v_x\ xor\ v_y\ xor\ v_{LCA(x,y)}\ xor\ v_{LCA(x,y)}\] 由于\(v_{LCA(x,y)}\ xor\ v_{LCA(x,y)}=0\),所以答案就是: \[v_x\ xor\ v_y\] 于是,题意就…
简单声明 我是蒟蒻不会推式子... 所以我用的是乱搞做法... 大自然的选择 这里我用的乱搞做法被闪指导赐名为"自然算法",对于这种输入信息很少的概率题一般都很适用. 比如此题,对于一组\(n,m\),我们可以进行\(10^6\)次随机,每次随机\(n\)个\(0\sim1\)之间的实数表示这个点在圆上的位置,然后我们暴力判断,用一个变量\(t\)记录下合法次数. 然后我们输出\(\frac t{10^6}\)就能得出大致概率了. 找规律 显然,上面这个"自然算法"…
转化题意 这题目乍一看十分玄学,完全不可做. 但实际上,假设我们在原序列从小到大排序之后,选择开的宝箱编号是\(p_{1\sim Z}\),则最终答案就是: \[\sum_{i=1}^Za_{p_i}(p_{i+1}-p_i)\] 其中\(p_{Z+1}=n+1\). 有了这个式子,就可做了许多. 暴力\(DP\) 我们设\(f_{i,j}\)为在前\(i\)个宝箱中选择了\(j\)个宝箱的最小代价. 枚举一个转移点\(k\)表示上个选择的宝箱,就可以得到: \[f_{i,j}=f_{k,j-1…
分治 首先,我们考虑分治处理此问题. 每次处理区间\([l,r]\)时,我们先处理完\([l,mid]\)和\([mid+1,r]\)两个区间的答案,然后我们再考虑计算左区间与右区间之间的答案. 处理的时候就需要分类讨论. 分类讨论 设\(Mn_x\)在\(l\le x\le mid\)时表示左区间的后缀最小值,\(mid+1\le x\le r\)时表示右区间的前缀最小值:\(Mx_x\)同理根据\(x\)的取值范围分别表示左区间的后缀最大值和右区间的前缀最大值. 考虑在左区间枚举左端点\(i…
莫比乌斯反演 血亏! 比赛时看到这题先写了个莫比乌斯反演,然后手造了几组数据和暴力对拍的时候发现,居然答案就是\(nm\)... 吐槽数据范围太小... 下面给上出题人对此题的解释: 原式的物理意义,就是从坐标原点(0,0),用每一种合法的斜率,穿过坐标[1~n,1~m]的方阵中的整点的个数,总数即 n*m. 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<type…
树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做到\(O(nm)\)的. 呃,复杂度为什么是这样的我也很迷,证明我也不会啊... 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<typename Ty,typenam…
暴力\(DP\) 这题做法很多,有\(O(n^2)\)的,有\(O(n^2logn)\)的,还有徐教练的\(O(nlogn)\)的,甚至还有\(bzt\)的二分+线段树优化建图的费用流. 我懒了点,反正数据范围这么小,就写了个\(O(n^2)\)的暴力\(DP\). 先将两个数组都排序,一个显然的性质,就是人选择钥匙时不可能相交. 所以我们设\(f_{i,j}\)表示前\(i\)个人选择了前\(j\)把钥匙时所用最大时间的最小值. 转移也很简单. 代码 #include<bits/stdc++.…
森林 考虑到题目中给出条件两点间至多只有一条路径. 就可以发现,这是一个森林. 而森林有一个很有用的性质. 考虑对于一棵树,点数-边数=\(1\). 因此对于一个森林,点数-边数=连通块个数. 所以,我们只要前缀和求出询问区间内的点数和边数,就可以计算出连通块个数了. 注意边数要分两个方向讨论,然后询问时注意防止越界. 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<…
\(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据发下来之后我测了一下只有45分. 就在不断优化\(IDA^*\)的过程中,我突然就想出了正解的做法,看来以后遇事不决先暴力. \(DP\)求解第一个询问 考虑一个\(DP\),我们设\(f_{i,j}\)表示当前在第一个字符串中是第\(i\)位,第二个字符串中是第\(j\)位的最小步数. 若记录\(…
\(2-SAT\) 考虑每个点只能选择\(R\)或\(B\),可以看作选\(0\)或\(1\). 然后对于给出的关系式,若其中一个位置满足关系式,另两个位置就必须不满足关系式,这样就可以对于每个关系式建出\(6\)条边. 然后就是裸的\(Tarjan\)求\(2-SAT\)一组解的板子了. 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<typename Ty,ty…
没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作,我们直接查询子树内的值. 但有了换根操作,\(LCA\)就可能不再是原来的\(LCA\),子树也就可能不再是原来的子树了. 换根操作后的\(LCA\) 通过一波画图+找规律,我们可以发现,在根为\(rt\)时,换根操作后的\(LCA(x,y)\)大致有如下几种情况:(以下讨论中\(x,y\)互换同理…
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. 则我们可以用线段树优化建图. 具体步骤就是,建两棵线段树,每次新建一个虚节点,然后把需要向外连边的区间在一棵线段树上向这个节点连边,并从这个节点在另一棵线段树上向应被连边的区间连边. 求解答案 建完图之后,考虑如何求答案. 首先,我们\(Tarjan\)缩点,显然一个强连通分量内的所有节点可以相互…
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. cnt s 查询满足 a&s = a 条件的 a 的个数3.2 输入 第一行一个整数 Q 接下来 Q 行,每一行都是 3 个操作中的一个 3.3 输出 对于每个 cnt 操作输出答案3.4 Sample Input 7 add 11 cnt 15 add 4 add 0 cnt 6 del 4 cnt…
文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核子共有26种,可以用a到z共26个字母表示. 核子聚变的过程可以用一个字符串描述. 按照顺序从左到右的顺序,假如有两个相同核子相邻,两个核子就会相互吸引发生聚变生成一个序号+1的核子,特殊的,两个z核子相邻会湮灭没有新的核子生成. 每当两个核子聚变时,就需要重新从左到右重复找到两个相邻的相同核子直到…