codeforces
文章平均质量分 54
我的妹妹syf
我的妹妹不可能那么胖
展开
-
codeforces 154 C - Double Profiles
题目大意:N个点,M条边,问有多少个点对对除彼此之间的点外对其他点的连接情况完全相同。(N,M显然能想到hash。如果我们给每个点一个hash值,再将每个和这个点相连的点加上这个hash值。不难发现,如果不考虑彼此的连接情况,我们可以进行hash。hash后会被分成若干个连接情况完全相同的块,那么这些块对答案的贡献就是size*(size-1)/2。如果彼此之间有边相连,那么我将连原创 2017-07-11 09:24:45 · 268 阅读 · 0 评论 -
codeforces 590D
题目大意:N个数,最多S次交换次数,每次能交换相邻两个数,问前k个数的最小总和是多少。比较简单的dp,一开始想复杂了。用f [ i ] [ j ]表示考虑了i个数,用了j次交换的情况。发现有方程f[i+1][j+l-i-1]=min(f[i+1][j+l-i-1],f[i][j]+a[l]);如果我们先从小到大枚举l(从哪里交换过来),就避免了后效性。接下来从大到小枚举i,原创 2017-07-08 09:59:45 · 306 阅读 · 0 评论 -
2009-2010 ACM-ICPC, NEERC, Southern Subregional Contest B kakuro
神奇搜索题。题目大意:填数游戏。格子有墙壁和空格两种。如果墙壁的下方/右方不是墙壁,那么上面会有一个数,表示这个墙壁沿竖直/水平方向一直走到下一个墙壁上空格的数总和要和这个数相同,同时这条路径上不能有相同的数。找出任意一种合法的方案。填的数在1-9之间。显然是搜索剪枝题,没什么好说的,但是有几个比较重要的剪枝,比如:1、用2进制位表示哪些数已经出现过了。这样我们就能用一个0-1原创 2017-07-08 10:39:10 · 515 阅读 · 0 评论 -
codeforces 115D
#include#define N 2010using namespace std;const int MOD=1e6+3;int n;string s;int dp[N][N];int sum[N][N];int w[N];int z[N];int main(){ cin>>s; int siz=s.size(); int len=0; if(s[0]=='/'||s原创 2017-10-01 19:58:26 · 334 阅读 · 0 评论 -
codeforces 571B
#include#define N 300100using namespace std;inline int read(){ int f=0,a=0;char ch=getchar(); while(ch'9'){if(ch=='-') f=1;ch=getchar();} while(ch='0') a=a*10+ch-'0',ch=getchar(); if(f) return原创 2017-10-01 20:00:01 · 219 阅读 · 0 评论 -
codeforces 84E
#include#define N 55using namespace std;struct Node{ int x,y,bs,mas; string s;};operator < (Node a,Node b){ if(a.bs!=b.bs) return a.bs>b.bs; return a.s>b.s;}int dt[N][N];int fx[4]={0,0,1,-原创 2017-10-01 20:01:28 · 282 阅读 · 0 评论 -
codeforces 163D
#include#define N 127#define eps 1e-6using namespace std;typedef long long LL;LL t,w[N];int n,c[N];long long v=1,s=3e18;long long A,B,C;long long alpha(long long a){return 2*sqrt(a)*sqrt(v)+v原创 2017-10-01 20:03:16 · 721 阅读 · 0 评论 -
codeforces 293B
#include#define N 55#define K 11using namespace std;const int MOD=1e9+7;int jc[K],a[N][N];int cu[N][N][K];int cx[K];int n,m,k,ans,zy;inline int A(int n,int m){ long long tmp=1; for(int i=n;原创 2017-10-02 20:15:11 · 275 阅读 · 0 评论 -
Codeforces Round #124 (Div. 1) D. The Next Good String
#include#define N 400100using namespace std;typedef unsigned long long ULL;const ULL MOD=29;ULL cf[N],a[N];int n,m;char s[N];inline void ex(){ puts("Impossible"); exit(0);}ULL h[N];void d原创 2017-10-04 14:22:17 · 276 阅读 · 0 评论 -
codeforces 505C Mr. Kitayuta, the Treasure Hunter
比较简单的题,然而我老毛病又犯了,调错的时候容易上头= =用dp[i][j]表示走到i,上一步走了j。但是直接做显然又T又M。由于速度大于零,所以设最大变化量为x,显然有(x+1)*x附代码#include#define N 30010using namespace std;int dp[N*2][1010];int va[N*2];int n,d;int main(){ m原创 2017-07-06 13:49:14 · 306 阅读 · 0 评论 -
Codeforces 267C Berland Traffic
这题真是相当的妙啊,让我对OI有了更深的认识。题目大意:有N个点,M条有向边的有流量上限的图。要满足1到N所有路径上使用的流量总和相同,求最大的总流量以及这个情况下每条边使用的流量。老师讲的相当的好啊。这里要引入一个势能的概念。物理中,忽略阻力的下落运动就是重力势能和动能相互转化的过程。我们把不同的路径看做是沿着不同的斜面下滑,因为忽略阻力,所以即使路径不同,势能变化也是相同的。这原创 2017-07-06 10:51:02 · 401 阅读 · 0 评论 -
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) C DNA Evolution
题目大意:给出一个字符串S(|S|先将E的开头和S中的第l个对齐,然后一个一个匹配。如果到了E的结尾,那么将E转到开头,继续匹配。如果S中的位置超过r,则退出。一道比较简单的C题(然而我并没有打这场)不难发现,由于字符集很小,我们可以分开考虑每个字符。而询问的位置,显然是只和l和|E|有关。那么我们可以再分开考虑|E|中的每一位。这里可以建立10*10*4个树状数组来解决,线段原创 2017-07-12 10:50:42 · 311 阅读 · 1 评论 -
codeforces 442D - Adam and Tree
题目大意:给一棵树上的每条边染色,每种颜色只能用一次,一次染色树上的一条链。问(从根到所有节点经过的颜色的最大值)的最小值是多少。树是通过每次加一个点得到的,问每次加点之后的最小值是多少。点数不难发现,答案肯定是小于等于直接树剖的答案,也就是log当前点数。显然能想到dp:用f[i]表示处理i的所有子树和i所需的最小颜色。如果正常染色的话,我们会尝试把f值最小的两棵子树和i原创 2017-07-12 11:45:51 · 1015 阅读 · 0 评论 -
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) B HIGH ROAD
构造题。题目大意:构造一棵有N个节点,其中K个是孩子节点的树,让它的直径最小,并输出这棵树的所有边和直径。不难发现,孩子节点越多,这棵树的直径就越小。那么我们考虑删去K个孩子节点后的树。这棵树的孩子节点数肯定不能超过K,所以就让它的孩子节点数为K。一直进行下去,我们就得到了一棵每片花瓣长度为K或K-1的菊花树。那么这样构造出来的树就能满足直径最小。那么直径是多少呢?你可以跑出来,当然也可以原创 2017-07-12 14:13:37 · 392 阅读 · 1 评论 -
codeforces 113D&bzoj 3270
题目大意:一张图,N(N对于每个点,有Pi的几率留在原地,否则等概率的向相连的点走去。问对于每个点,有多少的概率两个人在这个点相遇?这题显然是概率型dp+高斯消元。但是要注意求方程组的方法。一开始,我试图枚举x,用P[x][x]表示同时在x点相遇的概率,P[i][j]表示从i,j出发同时到达x点的概率。然而这样似乎可以做,但是解N次N*N个点的方程组,复杂度是O(N原创 2017-07-03 15:08:57 · 268 阅读 · 0 评论 -
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A 题目忘了
题目大意:反正就是字符串覆盖,但是已经被覆盖了就不会再被覆盖了,问最终的字符串。非常显然可以用链表/并查集/线段树做。这是比较显然的做法。这里我用优先队列做了一发,效果还不错。首先需要了解堆的删除操作和离线区间加。那么我就用离线区间加的思想,开一个vector,在开始位置加入插入节点,在结束位置加入删除节点。由于修改是有顺序的,那么可以通过调用优先队列的队头来用最早的字符串覆盖。做法非原创 2017-07-13 11:20:56 · 338 阅读 · 0 评论 -
codeforces 482C Game with Strings
真是一道神题=。=做了一上午题目大意:给你N个等长字符串(N因为长度小于等于20,所以可以比较显然地想到状压DP。接下来YY一下转移方程、首先我们需要知道,按照当前猜的位置,能否得到答案。那么用一个数组f[i]表示猜的状态是f[i]时,还没有猜出的字符串的状态、我们可以先找到哪些操作不能区分两个字符串。那么我们枚举两个字符串的序号i,j,那么对于每一位s[j][place]==s[原创 2017-07-04 15:56:50 · 374 阅读 · 0 评论 -
codeforces 444D DZY Loves Strings
似乎还没有靠谱的题解嘛。。。我来写一发。首先我们发现,每个询问都很短,最长只有四。27^4=531441,所以显然可以把这个字符串hash一下,把出现的所有位置存下来,直接丢到vector里。由于是从头到尾扫一遍,所以vector里面的元素已经是有序的了。然后我们发现有这样一个特点:如果询问的两个字符串出现次数都不超过根号|S|,我们可以直接利用单调性扫过去,枚举A的出现位置,每次找到离它原创 2017-07-06 09:25:55 · 339 阅读 · 0 评论 -
codeforces 555C - Case of Chocolate
#include#define N 1000100using namespace std;struct Seg{ int a[N<<2],lt[N<<2]; inline void push_down(int k){ a[k<<1]=max(a[k<<1],lt[k]); a[k<<1|1]=max(a[k<<1|1],lt[k]); lt[k<<1]=max(lt[k<<1原创 2017-10-06 15:41:19 · 384 阅读 · 0 评论