
codeforces
行走天涯的豆沙包
人生天地间,忽如远行客。
展开
-
G. Reducing Delivery Cost
题解:题意让我们让一条边变成0,然后计算k条路的路径总和最小是多少。我们选择的边有两种情况,分别是选的时候这条边是否在最短路上面,所以我们预处理出所有点与点之间的最短距离,然后枚举让哪条边的权值变成0。#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e3+10;typedef pair<int,int> pp;int head[N],e[N<<1],原创 2020-10-29 10:53:22 · 364 阅读 · 0 评论 -
E. Two Round Dances
先贴代码题解明天写#include<bits/stdc++.h>#define int long longusing namespace std;signed main(){ cin.tie(0);std::ios::sync_with_stdio(false); int n;cin>>n; int fac=1; for(int i=1;i<=n;i++){ fac=fac*i; } fac*=2;原创 2020-10-21 22:59:31 · 255 阅读 · 1 评论 -
2020-9-21训练
B. Balls of Buma祖玛游戏,如果我们只射出一个子弹可以把所有都消掉的话那么我们分段的数量一定是一个奇数,然后对称的地方的种类是相同的并且对称位置相加后的数字一定是大于3的。#include <bits/stdc++.h>//#define int long longusing namespace std;const int N=3e5+10;int a[N],pos[N];char s[N];void solve(){ cin>>s+1;原创 2020-09-21 19:40:01 · 441 阅读 · 0 评论 -
C. Square Subsets
题解:题目让找几个数的乘积是一个完全平方数,我们知道完全平方数的质因数分解之后的因子的指数都是偶数,70以内的素数只有10多个,所以选择用状压dp。我们状压的状态就是这些素数因子的指数是否为偶数。选择一个数的时候相当于把这个数的连续质因子指数加到另一个质因子的指数上面,当我们这个质因子的指数为偶数的时候那么加上偶数不影响当前的奇偶性,直接由上一个状态转移过来就行了。为奇数的时候就转移到亦或为0的状态。根据二项式定理我们知道,k个数里选1,3,5。。这样的奇数个的方案为2k−12^{k-1}2k−1,偶数的原创 2020-09-18 19:56:10 · 191 阅读 · 0 评论 -
D. Unusual Sequences
题解:看到和式的时候就想到了插板法,然后我们需要剔除因子为gcd的倍数的情况,就比如我们在隔板(3,3,3,3)的时候算方案为232^323已经把(6,6)这种情况算了,但是这个是不满足的。所以我们在筛m的因子时候特判一下是否有因子能够整除n,如果能就需要减去。#include <bits/stdc++.h>#define int long longusing namespace std;const int mod=1e9+7;const int N=1e5+10;int f[N]原创 2020-09-17 19:57:15 · 206 阅读 · 0 评论 -
C. Minimum Sum
题解:定义每个数的权值为出现的次数乘上位数上的权值,比如十位就乘以10。#include <bits/stdc++.h>//#define int long longusing namespace std;int a[100],lead[1000],vis[100],b[100];char s[1000];int qmi(int a,int b){ int res=1; while(b){ if(b&1) res=res*a;原创 2020-09-17 11:47:19 · 319 阅读 · 0 评论 -
D. Inversion Counting
题解:我们假设一个逆转[l,r]这个区间,那么对于[1,l-1],[r+1,n]这里面的数他们逆序数是没有影响的。那么对于我们[l,r]区间的里面数,对于一个数的逆序数是a,那么逆转过后逆序数就变成了(r-l+1)(r-l)/2-a然后我们再减去一个a,2a是不影响奇偶性的,所以我们判断一下前面的奇偶性就好了。#include <bits/stdc++.h>using namespace std;//#define int long longconst int N=2e3+10;i原创 2020-09-08 22:41:30 · 192 阅读 · 0 评论 -
B. Jamie and Binary Sequence (changed after round)
题解:我们先把这个值按照二进制进行分解过后统计有多少项,如果大于k的话那么代表k不够用。否则我们先遍历高位,因为要让高位的系数尽可能的高,所以先把能转换到合法位置的全部转换过来,然后要让字典序最大,所以我们尽量让地位减1去补齐k,尽量不动高位。因为中途可能补齐低位的时候低位开始不满足但是被高位传过来贡献后又满足了,所以需要扫描一下前两个位置。#include <bits/stdc++.h>using namespace std;#define int long longconst in原创 2020-09-08 16:45:12 · 179 阅读 · 0 评论 -
A. The Monster
题解:我们知道从左边往右边扫的时候如果左括号+?小于)那么一定会有)失衡无法匹配,右边扫过来同理。#include <bits/stdc++.h>using namespace std;#define LL long longconst int N=5010;//LL p,k,cnt=0,ans[100000];int ok[N][N];void solve(){ string s; cin>>s; for(int i=0;i<s.length原创 2020-09-08 14:22:01 · 162 阅读 · 0 评论 -
D. Fafa and Ancient Alphabet
题解:我们可以推出公式pi∗pi−1p_i*p_{i-1}pi∗pi−1这个公式累加起来,直到我们遇见两个字符串的第i个位置是两个字母都是确定的时候,pip_ipi代表的是当前a字母大于b字母的概率乘以前面字母都相同的概率。#include <bits/stdc++.h>using namespace std;#define int long longconst int mod=1e9+7;typedef long long ll;const int N = 1e5+10;原创 2020-09-08 08:28:10 · 174 阅读 · 0 评论 -
E. Cashback
题解:做过一道相似的题,方法也差不多,就是分块的时候要么把块分成长度为1,要么分成长度为m,这样就是最优的,当分成1的时候我们就不用去除最小块了,当分成长度为m的时候我们就用st表查询区间最小值然后删掉。#include <bits/stdc++.h>using namespace std;#define int long longtypedef long long ll;const int N = 1e5+10;int f[N],pre[N],a[N],n,m;int st[N原创 2020-09-07 16:49:30 · 193 阅读 · 0 评论 -
A. Save Energy!
题解:考虑周期类问题就需要先把周期找到,在这里一个周期就是炉子打开到关上所用的时间。所以一个周期就是ceil(k/d)*d的时间。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2010, M = 4000010;void solve(){ ll k,d,t,T; scanf("%lld%lld%lld",&k,&d,&t);原创 2020-09-07 15:16:03 · 234 阅读 · 0 评论 -
E. Bus Number——排列组合
E. Bus Number题解:多重集,我们先把所有方案排列出来也就是不管前导零的方案数,然后将一个0固定在开头,其他0随便插空,把这个方案数减去最后就是答案。#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll;int num[10],tempNum[10],a[10];ll jc[20],ans=0; void dfs(int x){ if(x==原创 2020-09-01 13:54:47 · 749 阅读 · 0 评论 -
最大子段和——Maximum Sum on Even Positions
题解:首先我们知道如果反转奇数的长度的话那么翻转的序列是没有变化的。所以我们只能反转奇数长度的数组。然后我们模拟反转偶数长度的时候,可以发现其实交换的就是相邻数组的位置。所以我们每次交换得到的贡献有两种,一个是a[i]-a[i-1],另一种是a[i-1]-a[i];所以我们先将偶数下标的答案加起来,再枚举反转区间,也就是找最大连续子段和。#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;typedef原创 2020-07-17 16:36:59 · 963 阅读 · 0 评论 -
构造——Grid-00100
题解:构造题。构造方法如下。当我们k%n==0的时候我们可以按照构造方法每次每行每列放n个,这样可以保持等于0.否则的话我们至少有一行和一列会多1,所以答案就是2.#include <bits/stdc++.h>using namespace std;const int N=305;int ma[N][N];signed main(){ int t; scanf("%d",&t); while(t--){ int n,k; scanf("原创 2020-07-15 21:54:35 · 192 阅读 · 0 评论 -
B. Edge Weight Assignment
传送门题解:看样例猜结论。讨论最小值:开始没看到大于0 的数导致以为可以2个数就行了,因为大于0所以我们用的数就可能是1或者3个,1的时候就是所有叶子节点的度的奇偶性相同,如果不同那么就是3个数,最后一个边填充和前面亦或值相同的值。讨论最大值:首先有个限制就是,如果我们叶子节点具有相同的祖先那么他们这两条边的值就必须要相同。然后n个点n-1条边在没有限制的情况下我们可以填充的权值也是N-1种。#include<bits/stdc++.h>const int N=1e5+10;usi原创 2020-06-02 11:21:17 · 372 阅读 · 0 评论 -
组合数学——Monotonic Renumeration
题目链接题解:首先我们列出不等式。1,bi<=bi+1,rmax[bi]<i+11,b_i<=b_{i+1},rmax[b_i]<i+11,bi<=bi+1,rmax[bi]<i+12,bi=bi+1,rmax[bi]>=i+12,b_i=b_{i+1},rmax[b_i]>=i+12,bi=bi+1,rmax[bi]>=i...原创 2020-04-06 12:13:28 · 291 阅读 · 0 评论 -
思维——Number of Components
题目链接题解:如图就是区间扫描,可以发现当区间扫描不包含ai,ai+1a_i,a_{i+1}ai,ai+1的区间的时候就是有贡献的 ,然后就是计算这种区间有多少个。#include <bits/stdc++.h>using namespace std;const int N=2e5+7,M=20;const int mod=998244353 ;typedef lo...原创 2020-04-05 20:04:25 · 499 阅读 · 0 评论 -
组合数学——Nauuo and Circle
题目链接题解:让我们选出一个根然后画一科树使得这个数载圆上面排列之后边不能相交。通过画图可以发现,要使得边不能相交那么以u为根的子树一定要在圈上连续。那么我们先C(n,1)C(n,1)C(n,1)选出一个数为根然后,他的子树的序列的全排列都是满足的,所以乘法原理分别相乘就可以了。#include <bits/stdc++.h>using namespace std;const...原创 2020-04-05 13:25:38 · 274 阅读 · 0 评论 -
状压DP——Playlist for Polycarp (easy version)
题目链接题解:我们看到n只有15并且让我们求 方案数的时候就可以考虑用dp了,并且是状压DP,这道题的状态方程是f(i,j)f(i,j)f(i,j)代表为i状态并且以j歌曲结尾的的方案数。所以我们只需要知道上一个状态并且使新状态加上他就可以完成更新了。这里的入口就是f(0,0)=1f(0,0)=1f(0,0)=1。#include <bits/stdc++.h>using na...原创 2020-04-05 12:28:37 · 190 阅读 · 0 评论 -
组合数学——Print a 1337-string...
题目链接题解:构造出一种方案让存在刚好n个子序列为1337,想办法构造m个3C(m,2)C(m,2)C(m,2),如果3的个数不够或者多了,不能刚刚好n个,那么就考虑在中间加7。因为7只用一个C(k,1)C(k,1)C(k,1)所以就是C(m,2)+k=nC(m,2)+k=nC(m,2)+k=n。#include <bits/stdc++.h>using namespace s...原创 2020-04-04 20:13:05 · 179 阅读 · 0 评论 -
容斥原理——Number Of Permutations
传送门题解:正难则反,我们减去不合法的,根据容斥原理我们可以知道,减去a不合法,减去b不合法,再加上a,b都不合法的就是答案了。#include <bits/stdc++.h>using namespace std;const int N=3e5+7;const int mod=998244353;typedef long long ll;ll fac[N];pair...原创 2020-04-03 13:08:17 · 394 阅读 · 0 评论 -
容斥原理——AB-string
传送门题解:先计算一共有多少个字串,然后减去不合法的字串就行了。#include <bits/stdc++.h>using namespace std;const int N=5e5+7;typedef long long ll;int main(){ int n; scanf("%d",&n); string a; cin>>a;...原创 2020-04-02 20:44:07 · 228 阅读 · 0 评论 -
DFS+组合数学——Two Fairs
传送门题解:只有a能到达的点的数量X只有b能到达的点的数量就是答案。#include <bits/stdc++.h>using namespace std;const int N=5e5+7;int vis[N],ne[N<<1],head[N],e[N<<1];typedef long long ll;ll cnt;void add(int a...原创 2020-04-02 19:20:41 · 211 阅读 · 0 评论 -
组合数学——Count The Blocks
传送门题解:和上一道题差不读多,都是连续块状的类似问题,这道题需要考虑边界,当我们块在最开始或者最后面的时候,和这个块相邻的位置只有一个,这个位置不能和块内数字一样所以他只有9种选法,而块内和块外一共有10种选法,因为这种块只有2种情况所以再乘以2。再看看其他位置,在其他位置的时候块旁边有两个位置,所以是9*9再看看这种块存在多少个,一共存在(n-(i+2)+1)块。所以代码如下。#incl...原创 2020-04-02 16:18:37 · 638 阅读 · 0 评论 -
组合数学——New Year and Permutation
传送门题解:对于一段连续块状的子序列。因为我们知道其最大值-最小值等于这个块状长度就是合法的子序列,所以我们改为枚举子序列长度,因为我们一段连续上升的子序列是一定满足的。这样的子序列个数一共有n-i+1块(i为子序列长度)。快内的子序列个数是长度的阶乘,然后其他的n-i+1个数字再全排列一下就是答案。#include <bits/stdc++.h>using namespace...原创 2020-04-02 15:59:26 · 193 阅读 · 1 评论 -
Educational Codeforces Round 72 (Rated for Div. 2)
A题:题意:给每个人物分配技能点,但是需要保证力量大于智力。问可以有几种 分配方式。每种分配必须把所有技能点全部分配完。题解:列出不等式可以找到力量值的最小加点,然后最小加点后剩余加点怎么加都不会让智力大于力量。#include <bits/stdc++.h>using namespace std;int main(){ int n; scanf("%d",&...原创 2020-03-31 16:12:43 · 105 阅读 · 0 评论 -
Ehab the Xorcist
Ehab the Xorcist题解:我们知道亦或操作并不改变数的奇偶性,并且亦或就是mod2意义下的加法,所以我们将a,b同于2的情况下看是否相等,如果不想等那么就是无解,然后我们知道a+b=a^b+2(a&b),因为亦或就是不进位的加法,所以加法就等于亦或值加上进位的值。所以接下来就很好构造了。我们令x=(v-u)/2,如果x&u=0,那么x和u的二进制每一位上的数都是不一...原创 2020-03-23 21:36:48 · 216 阅读 · 0 评论 -
Codeforces Round #627 (Div. 3) E&F
E题解:线性dp,f(i,j)f(i,j)f(i,j)表示处理到第i个任务且在第j时间睡觉的最大好的答案总数。#include <bits/stdc++.h>using namespace std;int dp[2005][2005], a[2005];int main(){ int n, h, l, r; cin >> n >> h...原创 2020-03-13 17:11:35 · 134 阅读 · 0 评论 -
Educational Codeforces Round 83 (Rated for Div. 2)
A题:签到:#include<bits/stdc++.h>//#define int long longusing namespace std;int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ int a,b; cin>>a>>b; i...原创 2020-03-10 10:51:34 · 185 阅读 · 0 评论 -
A Game with Traps—— 二分
A Game with Traps题解:上图其实是我们两种决策的方案。决定我们在某点时刻到底是折返回去带队还是继续排雷。我们发现当区间有交集的时候就继续排雷。否则折返回去带队这样花费的代价是最小的。然后就是去找题目中的二分性在哪里。我们可以发现当我们二分最低敏感度士兵的时候是具有二分性的。我们需要带的士兵的敏感度越低我们需要排的雷越多代价也就越大。这道题用了一个排序再间接通过队内士兵中的...原创 2020-03-07 14:43:07 · 176 阅读 · 0 评论 -
Common Number—— 二分
Common Number题解:我们打下草稿可以知道,对于一个x如果x是奇数那么他可以由:2x,2x+1…过来如果x是偶数那么他可以由:x+1,2x,2x+1过来。其实画出来就是一个树,然后要分奇数偶数来讨论。因为如果是偶数的时候我们需要计算两个树的大小,但是如果是奇数那么只用计算以这个奇数为根的子树大小因为奇数只能由2*x过来。#include <bits/stdc++.h&g...原创 2020-03-06 23:30:26 · 262 阅读 · 0 评论 -
Beautiful Mirrors —— 期望DP
Beautiful Mirrors题解:f(i)f(i)f(i)表示到达第i个关卡所用的期望天数。f(i)=pi∗(fi−1+1)+(fi+fi−1+1)∗(1−pi)f(i)=p_i*(f_{i-1}+1)+(f_i+f_{i-1}+1)*(1-p_i)f(i)=pi∗(fi−1+1)+(fi+fi−1+1)∗(1−pi)然后根据下面化简得到递推式。#include <...原创 2020-03-06 19:20:41 · 269 阅读 · 0 评论 -
Portals—— DP
Portals题解:这道题首先我们知道是DP但是先要贪心出全集中的一小块区域来优化我们的DP(我们DP都是在一个大的集合方案上面找最优解决子集)。这道题我们肯定对于一个点驻扎的情况的时候我们肯定贪心选择距离这个点最远的地方来驻扎,因为这样过来的路上可以收尽量多的兵。还有就是我们需要确定我们的步骤顺序,我们需要先征兵,再驻扎。对于征兵来说我们肯定需要占领这个地方。一旦占领了肯定是要收兵的,兵当然...原创 2020-03-06 18:23:16 · 157 阅读 · 0 评论 -
Domino for Young——二分图
Domino for Young题解:首先肯定不是用匈牙利匹配算法去做啦。。。。数据太大了。那么我们根据增广路的定义:若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径.由增广路的定义可以推出下述三个结论:1-P的路径长度必定为奇数,第一条边和最后一条边都不属于M.2-P经过取反操作可以得到一个更大的...原创 2020-03-05 17:55:37 · 239 阅读 · 0 评论 -
Dr. Evil Underscores——字典树
Dr. Evil Underscores题解:看到异或就能想到字典树,这道题最大位数是30位,我们按照高位开始贪心,如果字典树上这一位既有1又有0,那么无论我们X的这一位选择什么去异或都会是1(先要保证最大值),然后分析这一位只有1或者只有0的时候那么我们的决策就可以选择和这一位相同的数把这一位给约掉从而保证最小。然后通过分治去解决就好了。#include <bits/stdc++.h...原创 2020-03-05 14:23:42 · 276 阅读 · 1 评论 -
Minimax Problem——状压+二分
Minimax Problem题解:最小值最大就可以往二分想了,然后看到m的数值非常的小,就可以用状压去暴力枚举。但是我们知道状压记录的01状态,这里可能有很多个不同的数怎么转化成01状态,因为二分所以我们可以把他归结于二分类问题,大于等于mid就是1,否则就是0。然后枚举过程中需要保证每个状态是存在的。并且从两列中选出来的一个新排列的个数需要保证有m个。#include <bits/...原创 2020-03-05 11:29:00 · 355 阅读 · 0 评论 -
Codeforces 1294F three paths on a tree
Codeforces 1294F three paths on a tree题解:树的直径的思想,但是这里是三个点,并非两个点,但是我们任然可以用树的直径的思想,首先肯定存在x,y两个端点他们之间的距离是图中任意两点间最远的。其次我们第三个点肯定是和x,y的距离和加起来在任意三点间距离和最大。然后我们定义p=lca(x,y,c)p=lca(x,y,c)p=lca(x,y,c)可以知道:de...原创 2020-03-04 20:04:10 · 158 阅读 · 0 评论 -
E2. String Coloring (hard version)
E2. String Coloring (hard version)题解:分析可以知道我们肯定是一个字典序大于了一个字母的字典序那么就交换,所以题目就转换成了找序列的有多少个不下降序列。根据Dilworth’s theorem:我们知道:不下降子序列的个数=最长不上升序列的长度。不上升子序列的个数=最长不下降序列的长度。所以我们这道题就是查找最长不上升序列的长度。我们定义dp1[i...原创 2020-03-04 18:56:48 · 251 阅读 · 0 评论 -
Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)
A题:既然保证了不同那么排个序就行了。#include <bits/stdc++.h>using namespace std;int a[105],b[105];int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); for(i...原创 2020-03-04 15:32:02 · 167 阅读 · 0 评论