牛客网CSP-S提高组赛前集训营 标签(空格分隔): 题解 算法 模拟赛 题目 描述 做法 \(BSOJ6377\) 求由\(n\)长度的数组复制\(k\)次的数组里每个连续子序列出现数字种类的和 对每一种颜色计算贡献区间 \(BSOJ6378\) 求树上两条长度分别为\(p\),\(q\)不相交路径对数 换根背包\(dp~or~\)\(LCA\)+差分 \(BSOJ6379\) \(T1\) 有一个长为\(n×k\)的数组,它是由长为\(n\)的数组\(A_1\),\(A_2\),...,\(…
货物收集 二分答案.复杂度\(O(n\log n)\). 货物分组 用费用提前计算的思想,考虑用一个新的箱子来装货物会发生什么. 显然费用会加上后面的所有货物的总重. \(60\)分的\(O(n^2)\)DP代码: #include<bits/stdc++.h> #define LL long long const int SIZE=100005,INF=0x3F3F3F3F; int n; LL W,A[SIZE],sum[SIZE]; LL DP[SIZE]; using std::max…
复读数组 分成 3 种区间算答案: 一个块内的区间 两个块交界处,长度小于块长的区间 长度不小于块长的区间 对于第三种区间,容易发现每个区间的权值一样,只需要算出个数即可. 对于前两种空间,我的思路是:对于一个重复出现的元素,记第一次出现的这个元素贡献权值,然后讨论每一个数会给哪些区间贡献权值即可. 3年OI一场空 不开long long见祖宗 代码: #include<bits/stdc++.h> #define LL long long #define int long long cons…
A.无形的博弈 心理题. 答案为\(2^n\),可感性理解结论的正确性. #include<bits/stdc++.h> #define LL long long const LL Mod=998244353; int n; int main() { scanf("%d",&n); LL Ans=1; for(int i=1;i<=n;i++) Ans=(Ans<<1)%Mod; printf("%lld",Ans); retu…
比赛链接 A.服务器需求 维护每天需要的服务器数量的全局最大值(记为\(Max\))和总和(记为\(sum\)),那么答案为: \[max(Max,\lceil\dfrac{sum}{m}\rceil)\] 证明略. 由于只有单点修改,可用一个 multiset 维护全局最大值和总和,当然,线段树也是可以的. 不过有一个易错点,在使用 multiset 的\(\text{.erase()}\)函数时, 如果写\(\text{s.erase(5)}\),传入一个值,会删除所有的 5 . 如果写\(…
牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓鼠的石子游戏 题目描述 一共n个石子堆,每个石子堆有ai个石子,两人轮流对石子涂色(先手涂红,后手涂蓝),且需要保证当前回合涂的石子颜色不能和它相邻的两个同色,谁涂不下去谁输.一共T个询问,对于每个询问输出先手必胜还是后手必胜. \(1<=n<=10^3,1<=ai<=10^9,1&l…
A 货物收集 显然是一个二分答案的题. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define dbg(x) cerr << #x << " = " << x <<endl #define dbg2…
比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa  cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostream> #include<cstdio> #include<algorithm> #define int long long using namespace std; int n,q,m; ; ]; int x,y; inline int read(); int cha() { ;…
期望得分:100+0+10 实际得分:40+0+0 考炸了... T1:题目链接 究竟为什么会这样,,, 仔细研读我的丑代码 发现... 枯辽.... #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; int T,n; ]; int flag; inline void out1() { cout<<"…
原题链接 算法不难,比赛的时候就和cyc大佬一起yy了正解,不过因为交的时候比较急(要回寝室惹),我有两数组开错大小直接爆到50,cyc大佬则只把文件输入关了一半,直接爆零(╯ ̄Д ̄)╯┻━┻ 要尽量使\(k\)次删边都能有贡献,那么很容易就想到割边. 所以我们先用\(\mathtt{tarjan}\)跑出所有割边,而每一条割边都能产生\(1\)的贡献,因此有\(sum_{bridge}\)条割边,就能增加\(sum_{bridge}\)个连通块. 若\(k \leqslant sum_{bri…