BUPT2017 springtraining(15) #3】的更多相关文章

这里这里 A.签到题 #include <cstdio> double a[] = {0.4, 0.16, 0.063, 0.025, 0.010, 0.004}; int main() { int n; double m; scanf("%d", &n);; ;i <= n;i ++) { scanf("%lf", &m); printf("Case #%d: ", i); ) puts("Too B…
我觉得好多套路我都不会ヘ(;´Д`ヘ) 题解拖到情人节后一天才完成,还有三场没补完,真想打死自己.( ˙-˙ ) A - 温泉旅店 UESTC - 878  题意 ​ 有n张牌,两人都可以从中拿出任意张,各自的得分为他们手中牌上的数字的异或和.求A的得分小于等于B的方案数. 题解: ​ DP,\(dp[i][j][k]\)表示前i张牌,使得A得分为j,B得分为k 的案数.\(dp[0][0][0]=1\) \[ dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j\wedge…
这场有点难,QAQ.补了好久(。• ︿•̀。) ,总算能写题解了(つд⊂) A. Beautiful numbers CodeForces - 55D 题意 ​ 求\([l,r](1\le l_i\le r_i\le 9\cdot 10^{18})\)的中的 可以被自己每一位上的数字整除的数 的个数. 题解: ​ 知识:如果m%a=0,则任意x, x%a = (x%m)%a. ​ 2520是2~9的lcm.因此任何时候都有2520%pre_lcm==0. ​ 因为2520%pre_lcm==0,…
拖了一周才完成的题解,抛出一个可爱的表情 (っ'-')╮ =͟͟͞͞❤️.对我来说E.F比较难,都是线段树的题,有点久没写了. A - Infinite Sequence CodeForces - 675A 公差为c,首项为a的等差数列是否有一项等于b. 注意c为0的情况. #include<cstdio> long long a,b,c; int main() { scanf("%lld%lld%lld",&a,&b,&c); if(c==0&am…
https://vjudge.net/contest/162590 A: 不难发现,当L=R时输出L,当L<R时输出2. B: 贪心得配对.1和n配 2和n-1配,对与对直接只要花1个代价就可以跳到.所以答案是(n-1)/2 C: 先考虑形式于aaaab的串变形.若有n个a,不难看出次数f[n]=2^n-1.接下来我们对于原串S从左到右扫描,若遇到a则cnt++,若遇到b则ans+=f[cnt] D: 构造aabbaabb..的串即可. E: Ans=max(s[i]). 通过dfs进行染色,对…
下面不再说明题意了请自行读题,直接放contest链接. https://vjudge.net/contest/151607 A.考虑当火车隔k站一停时 区间长度 >= k 的纪念品一定能买到 区间长度 <k 的纪念品最多覆盖一个停靠的站点 求出 n / k 个点, 每个点上覆盖的纪念品数累加即可 k 从 1 到 m 都需要求 我们只要把纪念品按区间长度排序 然后向后扫就可以了 总复杂度 O(nlog^2n) #include <cstdio> #include <algor…
题目链接 A.容易发现最后字符的对应都是一对一的 或者说我们没办法出现最后多对一或者一对多的情况 所以只要算出 ‘a’ - 'z' 每个字符最后对应的字符即可 #include <cstdio> #include <algorithm> ]; ], s[]; int main() { ], s2[]; scanf("%d %d %s", &n, &m, s); ;i < ;i ++) a[i] = i + 'a', b[i] = i; wh…
题目在这里 A.手动打表找规律得组合数 n -= 2, m -= 2, ans = C(n, m) #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll fac[]; ll calc(ll x, ) { ll ret = ; , x = x * x % Mod) ) ret = ret * x % Mod; return ret; } int main() { ios::sync_with_stdio(…
题目在这里啊 A.最长上升子序列,范围很小所以写了简单的O(n^2)算法 #include <iostream> #define rep(i, j, k) for(int i = j;i <= k;i ++) #define rev(i, j, k) for(int i = j;i >= k;i --) using namespace std; typedef long long ll; ], f[]; int main() { ios::sync_with_stdio(false…
题目在这里 A.似乎是个并查集+??? B.10W的范围,似乎可以暴力来一发二分+sort? 但我猜正解可以O(nlogn)? C.单调队列入门题目 #include <cstdio> ], ans1[], ans2[]; struct queue_1 { ]; int l, r; queue_1(): l(), r() {} int front() { return q[l]; } void push(int i) { while(l <= r && q[l] + m…
这里是contest 8道题全部来源于 cf 的两场contest (出题人可真懒啊 Codeforces Round #411 (Div. 2)的ABCDE Codeforces Round #400 (Div. 1 + Div. 2, combined)的ADE 前一场的题解在这里 后一场的题解在这里…
BUPT2017 wintertraining(15) #9A 题意 有n个纪念品,购买区间是\([l_i,r_i]\).求每i(1-m)站停一次,可以买到多少纪念品. 题解 每隔d站停一次的列车,一定能买到购买区间的长度≥d的纪念品. 长度比d小但包含了d的倍数的纪念品也可以买到. 所以,如果按长度给纪念品排序,用树状数组维护长度小于当前d的购买区间,那么就可以很快求出每个停靠点(d的倍数)有多少个长度不超过d的纪念品了. 代码 #include <cstdio> #include <…
BUPT2017 wintertraining(15) #8H 题意 求组合数C(n,i),i从0到n,里面有几个奇数. 题解 直接打表的话可能就直接发现规律了. 规律是n的二进制里有几个1,答案就是2的几次方. 证明: lucas定理有:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p 然后取p为2. 所以展开后是C(0,0),C(0,1),C(1,0),C(1,1)的乘积.其中只有C(0,1)=0. 那么C(n,i)%2==1的条件就是n对应位为0,则i对应位必须是0,n对应…
BUPT2017 wintertraining(15) #8G 题意 给一个数组a,有n个数,m次操作.\(N, M ≤ 10^5, |A i| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ≤ 10^4\) 操作有四种, C l r d:更新区间[l,r],值都加上d,并且时间前进1 Q l r:查询[l,r]的区间和 H l r t:查询t时刻的区间和 B t:回到t时刻(一定是历史时刻),且t时刻之后的操作都作废了. 题解 这道题的关键是怎么更新区间和. 本来线段树更新区间和要pu…
BUPT2017 wintertraining(15) #8F 题意 1到n的排列,经过几次置换(也是一个排列)回到原来的排列,就是循环了. 现在给n(<=1000),求循环周期的所有可能数. 题解 问题等价于几个正整数加起来等于n,求最小公倍数的可能数. 因为1不影响最小公倍数,所以等价于求几个正整数加起来小于等于n,最小公倍数的可能数. 最小公倍数与每个质因子在正整数里最大出现次数有关,所以枚举质因子的幂,进行dp. dp[i][j]表示前i个质数,和为j时,最小公倍数的可能数. dp[0]…
BUPT2017 wintertraining(15) #8E 题意 长度为n(\(n<2^{63}\))的绳子,每隔长度L(1<L<n)做一次标记,标记值就是L,L是n的约数. 每轮标记都选一个L,且L之间两两互质. 求L的最多种数K.以及标记之和S的最大值. 题解 对n进行分解质因数,K就是不同质因子的个数,S就是p^{a_i}之和.不过题目要求L<n,所以当S算出来是n时,再除以一下最小的质因子. 分解比较小的n(<1e9),可以直接枚举,复杂度是\(O(\sqrt n…
BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限时15000 MS 题解 如果不看限时,当作是1000MS的话= =,那么可以用倍增来做. 先按右端点排序. 可以去掉一下包含了其它区间的区间,可以优化一点点. 用 f[i][j] 表示 i 节点下 \(2^n\) 个不相交的线段下标. 预处理出 f 数组. 查询的时候,左端点用二分,然后右端点用倍增来找.…
BUPT2017 wintertraining(15) #8C 题意 求第n(n<2^32)个非完全平方数m,以及\(\sum_{i=1}^m{\lfloor\sqrt i\rfloor}\) 题解 设1~m中有x个完全平方数(\(1^2,2^2,3^2,...,x^2\)). 那么有 \[ \begin{cases} n+x=m\\ x^2 < m\\ (x+1)^2 \ge m \end{cases} \] 等价于求满足\(m-\sqrt m < n\)的m的最大值. 于是可以二分.…
BUPT2017 wintertraining(15) #8B 题意 给出每个黄金的坐标.价值及耗时,同一方向的黄金只能依次取,求T时间内收获的最大值. 题解 同一方向,物品前缀和构成的组合,相当于是一个分组的物品. 然后分组背包: for i:1~p个分组 for j:T~1的时间(背包容量) for k:1~当前分组物品数 if(j>=t[k])dp[j]=max(dp[j], dp[j-t[k]]+v[k]) 因为我们的t[k+1]一定大于t[k],所以else的时候可以直接break.…
BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A[i]/2(整除)的代价,B同理.求攻击全部城市的最小代价. 题解 这题很容易想到树形dp. 每个节点为根的子树,有可能是: A从根的上面攻击下来, A从根或下面攻击到根上面, B从根的上面攻击下来, B从根或下面攻击到根上面. 于是设计状态 dp[i][0..1][0..1]分别对应i为根的子树上面四种…
BUPT2017 wintertraining(15) #5I 题意 输出序列A[1..n]的第n-1阶差分(一个整数). 题解 观察可知答案就是 \[ \sum_{i=0}^{n-1} {(-1)^{i}C_n^{i} A_{n-i}} \] 需要用大整数. 代码 Java代码 import java.io.*; import java.math.*; import java.util.*; import java.text.*; public class Main{ public stati…
BUPT2017 wintertraining(15) #7FMinimax Tree 题意 给你一棵多叉树,非叶子节点中分配k个为子节点的min函数,剩下的是max函数. 现在求根节点(1)的最大值和最小值. 题解 因为最大值和最小值求法对称,以求最小值为例. 要让尽量小的上来,可以贪心选择一条路前面都是min不够了后面就用max. 因为如果min上面有max,max换到下面不会更差. 但是这条前面都是min的路选哪一条呢?显然是最后一个min节点的子节点里max取最小的. 共k个min,所以…
BUPT2017 wintertraining(15) #7E 题意 把数组A划分为k个区间,每个区间不超过L长度,每一个区间异或和之和为S.现在求:S不超过X,区间个数的最大值. 且A是这样给你的:A[1], P, Q.A[i]=(A[i-1]*P+Q)%M.M为\(2^{28}\). 题解 容易想到dp, dp[i] :前 i 个数最多划分多少个区间.s[i]为前缀异或和. dp[i]=max(dp[j]+1),i-L<j<i,且s[j]^s[i]\(\le\) x. dp[n]就是答案.…
BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结果,N是字符串总个数.Q次询问. 题解 用主席树,即函数式线段树,维护前i个字符串的区间和(每个区间的前缀个数之和). 读入每个字符串后,用Trie树给它的每个前缀分配ID,并记录每个前缀最后出现的位置pre[cur],如果当前的前缀出现过,则线段树中上一次出现的位置的值-1,相当于只把这种前缀记录…
BUPT2017 wintertraining(15) #7B 题意 n个点m条无向有权边(2 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5),每个点标记了0或1,求所有1中,最近的两个1的下标及距离. 题解 先用SPFA求出每个点离标记1的点最近的距离,d[i]. 同时记录下每个点最近的1的下标. 两个最近的1,要么是被一条边连着,要么是被几个0隔着的边连着. 我们通过寻找它们中间的边来找出它们. 枚举每条边,如果相邻都是1,或者都是0且最近的1不是同一个,或者一个1,一个0,那么这条边两…
BUPT2017 wintertraining(15) #7A 题意 给你一个图,n个点m条边,求走遍所有边,至少经过几次点,及输出依次经过的点.n and m (2 ≤ n ≤ 10^5, 1 ≤ m ≤ 2·10^5) 样例 Input 9 5 2 4 2 6 3 5 3 9 5 9 Output 7 3 9 5 3 6 2 4 Input 4 5 1 2 1 3 1 4 2 4 3 4 Output 6 4 3 1 4 2 1 题解 首先依次从度数为奇数的点出发,走完所有的链.接着把和链相…
BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小开头前两个递增的排列有几种. down[i][j]表示长度为j,以第i小开头前两个递减的排列有几种. 那么有\(down[i][j]=\sum_{k=1}^{k=j-1}up[k][j-1]\) 并且有\(down[1][1]=1\),\(up[i][j]=down[j-i+1][j]\). 然后就…
BUPT2017 wintertraining(15) #6B 题意 q次操作,每次把两个给定子矩阵交换,求最后的矩阵.(2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000) 题解 用R[i]和D[i]记录编号i的右方和下方的编号.交换两个子矩阵只要修改四周的R和D即可.为了方便查找给定位置的编号,每行每列都需要头结点,也就是给一个编号. 代码 #include <cstdio> #include <iostream> #define N 1005*1005 using…
BUPT2017 wintertraining(15) #6F 题意 \(f(1)=a,f(2)=b,f(i)=2*(f(i-2)+f(i-1)+i^4)\) 给定n,a,b ,\(N,a,b < 2^{31}\),求f(n)% 2147493647. 题解 \[ f[i]=(f[i-1]+2*f[i-2]+i^4)*2\\ i^4=(i-1)^4+4*(i-1)^3+6*(i-1)^2+4*(i-1)+1 \] 我们可以构造出矩阵乘法 \[ \left[ \begin{matrix} f_{i…
BUPT2017 wintertraining(15) #6E 题意 房间1和2,3和4,...,399和400共用一节走廊,有q次从房间li到ri的搬运桌子,一次搬运10分钟.两个搬运如果走廊有重叠部分,则必须一个结束后再执行另一个.求全部搬运所需最少的时间. 题解 对于一次搬运,我们可以求出它经过的走廊区间,给这些区间的每节走廊的经过次数都++.最少的总时间就是最大经过次数*10. 这题贪心为什么不对呢?贪心的方法是根据区间右端点排序,右端点相同再按左端点排序.然后如果当前的左端点小于前一个…