csps模拟87888990部分题解】的更多相关文章

题面:https://www.cnblogs.com/Juve/articles/11752338.html https://www.cnblogs.com/Juve/articles/11752414.html 最近咕的稍多,就简单写一下题解了(其实也不算题解),反正就是一句话,而且都是这几套题改完的 模拟87: maze: 在实数上二分,跑最短路check,spfa比dij快多l #include<iostream> #include<cstdio> #include<c…
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> using namespace std; ; struct BigInt{ ]; BigInt(){memset(a,,]=a[]=;} BigInt friend operator * (BigInt x,int y){ ],las=; ;i<=len;++i){ x.a[i]=x.a[i]*y+las; l…
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化dp了 关于斜率优化 T2: 究极大模拟,懒得打,鸽了 T3: 蒟蒻博主用的是记忆化搜索的方法,其实和抵制克苏恩那题思路很像,因为他的小球个数很少,颜色种数也很少,所以这是可行的,记搜时我们只需记录还有多少个1个的,2个的,3个的,和上一个选取的是剩几个的,然后这一次可能选剩1个的,2个的,3个的,如…
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好像很难搞,但是我们用exgcd求出一组特解之后的通解公式是个一次函数,通过手玩可知x,y只可能是最小正整数或最大负整数解,这就很好整,时间复杂度$O(n)$,当然也可以三分. #include<bits/stdc++.h> #define int long long using namespace…
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T2 巨神兵: 大神题,一看数据范围这么小,我们考虑状压,最傻逼的暴力思路是压边,但是这显然不行.正解是压点,设$f[s]$为当前选定点集状态为$s$的方案数. 我们考虑转移,当前选定的点集肯定是可以通过边和没有连过来的点相连构成新的方案.所以转移所以我们考虑枚举补集的子集$k$,设$cnt$为s与k…
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力了,带着前两题都不会的心情,看了T3发现是期望,完了爆0了,在一看,发现是sb原题,还简单一点,赶紧把T3码了一遍过大样例,觉得很稳就交了,然后用一点时间把T1树的分给码了,然后开始磨T2,发现啥都不会开始dfs,一开始觉得只能拿30pts,后来发现没有回溯是$O(n^2)$的,打完就没剩多少时间了…
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来发现只要每个人都有怪兽打就吼了,然后显然二分答案,1h 打完. T2没什么思路,想拆柿子,但没什么用,只qj了链的测试点,用来跑所有测试点竟然得了40pts. T3一眼看错题,然后一眼wqs二分,然后调到考试结束也没调出样例. 题解: T1 kill: 先把人和怪兽得坐标sort一下. 显然这n个人…
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼知道为什么要等于这个) 然后再定义当前局面的期望函数为每个人期望函数之和. 然后你会发现每次猜拳后局面期望函数变化量都是1 那么期望步数其实就是终止局面期望函数值-初始局面期望函数值 $ans=2^{n-1}-1-\sum (2^{cnt[x]}-1)$ #include<bits/stdc++.h…
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘数里的2去掉就好了. 坑点2:1e18炸long long $\rightarrow$ 慢速乘即可 #include<cstdio> #include<iostream> #include<cstring> #include<vector> using name…
A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千万不要懒. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> using namespace std; const int N=1e5+5; int read() {…
好久没有写整套题的题解了呢……主要是这两天考试题愈发神仙 实在是超出了垃圾博主的能力范围啊QAQ A.异或 不难想到,如果我们得到了$[L,R]$中每一位上0和1的个数,那么答案即为$2 \times \sum \limits _{i=0} ^{\log R} num0[i]\times num1[i] \times 2^i$ 所以可以得到一个暴力的思路,枚举$[L,R]$中的每个数按位统计. 现在瓶颈在于区间每一位的0/1个数的统计.如果我们把连续的数写成二进制表示,可以发现一些规律: 000…
A.小P的2048 作为一个看B哥玩了一个寒假的人这种题闭眼切好吧 模拟即可.程序模块化后直接复制粘贴. 说什么模拟不能复制粘贴的都没水平 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(c…
以后题解还是单独放吧. A.Divisors 根号筛求所有数的因子,扫一遍去重统计即可. #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<map> using namespace std; const int N=205; int a[N],m,n; map<int,int> bu; vector<int> re…
A.平均数 看到第K小,又确定跟平衡树/主席树没有关系,可以把问题转化为有K-1个答案比它小再考虑二分. 二分平均值x,之后将原序列统一减去x.这时序列中区间和<0的区间个数就是原序列中平均值小于x的区间个数. 求个前缀和,那么区间和<0转化成$sum_l > sum_r$,归并排序求逆序对即可.复杂度$O(n\ log^2 \ n)$ #include<cstdio> #include<iostream> #include<cstring> #inc…
开局一行$srand$,得分全靠随机化. A.kill 发现两个并不显然的性质: 1.选中的人和怪物一定是按顺序的.第一个人打所有被选中怪物的第一只,第二个人打第二只,$etc$. 2.最优方案打的怪物一定是一段连续的区间.(因为过去再反方向回来到任务点一定不优) 所以直接枚举第一个打哪只怪即可. #include<bits/stdc++.h> using namespace std; typedef long long ll; int read() { int x=0,f=1;char ch…
题面: 666: 重点在题意转化:每个数可以乘k,代价为k,可以减一,代价为1, 所以跑最短路即可 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int MAXN=1e6+100; int n,ans; char f[MAXN]; bool in[MAXN];…
一如既往的垃圾,又回到了那个场场垫底的自己,明明考场上都想到正解了,但是就是拿不到分,可能是互奶把rp用光了吧以后一定加强训练代码能力. T1: 考场上一直yy矩阵快速幂,虽然自己矩阵快速幂一点都不会还是硬着头皮yy,发现不可做之后并没有及时转化思路,但其实自己预处理的数组就是正解. 切记:不仅矩阵快速幂是log的,普通快速幂也是2333 然后这题其实很水啊,我们设$dp[i][j]$为前$i$列放$j$个棋子的方案数,然后枚举最后一列放多少个棋子就好了. 转移方程为$dp[i][j]=\sum…
也许是最后一篇了. A.最大或 不错的签到题. 对于二进制位来说,高位的一个1比低位的所有1的贡献总和还要大. 显然,$r$必选,因为$r$中所有1的相对考前.那么考虑如何构造另一个数. 首先$l$和$r$前几位相同的部分肯定是不能动的,所以从$l,r$不同那位开始贪心即可.如果$r$这位为0,只要构造的这个数爆不了$r$就让它的这位为1. #include<cstdio> #include<cstring> #include<iostream> #include<…
A.凉宫春日的忧郁 高精硬上似乎跑不过,其实可以都取个$log$.那么只需要比较$y\times log ^x$和$\sum \limits _{i=1}^y log^i$就好了. #include<bits/stdc++.h> using namespace std; int T; double x,y; void work() { scanf("%lf%lf",&x,&y); double res1=y*log2(x); double res2=0; f…
咕咕咕 A.序列 无解情况:$n>a*b$或$n<a+b-1$ 把序列分成B段,每段内部上升,各段分界处构成下降子序列. 实现并不是太简单,要动态地考虑一下边界什么的. #include<cstdio> #include<iostream> #include<cstring> using namespace std; int T,n,a,b; void work() { scanf("%d%d%d",&n,&a,&…
A.梦境 如果不用去重一定要用Multiset……挂30分算是出题人手下留情了. 贪心.把点排序,区间按右端点递增排序.依次考虑每个区间,取能选的最靠左的点即可.multiset维护. #include<cstdio> #include<iostream> #include<cstring> #include<set> #include<algorithm> using namespace std; int read() { int x=0,f=…
A.简单的序列 遇到括号匹配,先将左右括号转化为1和-1. 那么一个括号序列合法的必要条件:总和为0且所有时刻前缀和$\ge 0$. 用dp预处理出长度为$i$,总和为$j$的括号序列数量.那么如果p的方案数为$dp[i][j]$,与之匹配的q的方案数即为$dp[n-m-i][j+串m的总和]$. 注意需要保证统计的方案前缀和处处$\ge 0$.用原串的最小前缀和限制一下即可. #include<cstdio> #include<iostream> #include<cstr…
时隔多年,终于又有了一套我能改完的题…… A.神炎皇 遇到这种要求整除的题显然拆出gcd 设$d=gcd(a,b)\ \ \ a'=\frac{a}{d} \ \ \ b'=\frac{b}{d}$ 原式转化为$(a'd+b'd)|(a'db'd)$ $(a'+b')|(a'b'd)$ 又因为$gcd(a',b')=1$ 所以$a'+b'$一定不是$a'b'$的因子,进而得到$(a'+b')|d$ 又由$a+b \leq n \rightarrow (a'+b')d \leq n \righta…
A.Median 这题的数据生成方式并没有什么规律,所以可以认为是随机数据. 维护一个桶,表示当前K长区间里的值域情况. 并且用变量记录中位数值域上的左侧有多少个数,当区间调整时一并调整桶和这个变量即可. 由于是随机数据,所以每次的调整幅度并不会很大,近似于常数. 复杂度$O(n)$. #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespa…
A.Graph 因为点可以随便走,所以对于每个联通块,答案为边数/2向下取整. 用类似Tarjan的方式,对于每个联通块建立一棵搜索树,尽量让每一个节点的儿子两两配对,如果做不到就用上头顶的天线. #include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; const int N=2e5+5; int read() { int x=0,…
回去要补一下命运石之门了…… A.嘟嘟噜 给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$. 考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了.问题在于如何找到下一次需要取模的位置. 解不等式$ans+km \ge i+k$即可,需要处理一下边界. 据说可以证明复杂度是$O(m \log n)$的,但我不是很会. //考场代码 稍丑 #include<bits/stdc++.h> using namespace std; typedef long lon…
A.u 只涉及到区间修改可以考虑差分,然而如果每一行都差分复杂度还是过高.我们发现差分标记也是连续的(一行横着的一行斜着的),所以可以维护两个 差分的差分,扫两遍统计即可. #include<cstdio> #include<iostream> #include<cstring> using namespace std; typedef long long ll; const int N=2005; int read() { int x=0,f=1;char ch=ge…
爆零了.少特判见祖宗.还好这场不计入总分. 考场上什么都没想.感觉考试状态又回到了两个月前. A.Antipalindrome 手玩样例,不难发现题目中要求的合法串的充要条件是:对于任意$i \in [2,n]$,有$ s[i] \neq s[i-1]\ and \ s[i-1]\neq s[i+1]$ 那么第一个位置有$m$种选择,第二个位置有$m-1$种,第三个位置往后都有$m-2$种. $ans=m(m-1)(m-2)^{n-2}$ 注意特判.如果判少会直接爆0. #include<cst…
错失人生中第一次AK的机会…… A.attack 支配树板子题.考场上发明成功√ 首先支配树上两点路径之间的点都是必经之点,根据这个性质我们就可以yy出建树的方法.跑拓扑,在每个点(设为$x$)即将入队之前利用反图找到$x$的入点,显然这些点都不是根到$x$的必经之点.那么谁才是呢?这些点在支配树上的lca.因为建树是拓扑进行的,所以$x$入队一定是在它的入点入队之后,也就是说这些点此时已经在树上了,那么就可以查询到这些点在支配树上的lca并由它向$x$连边(支配树上). 如果把根节点深度设为1…
中间咕的几次考试就先咕着吧…… A.夜莺与玫瑰 枚举斜率.只考虑斜率为正且不平行于坐标轴的直线,最后把$ans\times 2$再$+1$即可. 首先肯定需要用$gcd(i,j)==1$确保斜率的唯一性,但由于题目中Deadline的定义是直线不是线段,所以一个方向只能有一条,需要去重.那么我们计算一条直线的贡献,当且仅当它和它的前驱线段在点阵内且后继线段不在点阵内. 暴力求解:$ans=\sum \limits_{i=1}^{n-1} \sum \limits_{j=1}^{m-1} [gcd…