自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(190)
  • 收藏
  • 关注

原创 欢迎使用CSDN-markdown编辑器

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪I˙AI˙BI˙C=I˙aKV=IafKVe−j30∘=I˙bKV=IbfKVe−j90∘=−(I˙A+I˙B)\begin{equation*}\left\{\begin{aligned}\dot{I}_A &= \frac{\dot{I}_a}{K_V}=\frac{I_{af}}{K_V}e{-j30^{\circ}} \\\dot{I}_B &=\f

2017-06-03 11:38:44 226

原创 Codeforces 421D

假如选择二元组(a,b)那么怎么计算有多少人同意哪?容斥一次就好了 用同意a的人数+同意b的人数-同时同意(a,b)的人数 然后对于这题,所有的二元组分为两种情况 1.存在同时同意二元组里面的两个 2.不存在 即 同时同意(a,b)的人数=0

2017-01-02 21:34:10 330

原创 Codeforces 83C

求字典序最小的最短路 先求最短路,因为边权都为1,所以直接沿着最短路边广搜出一条 字典序最小的就好了#include<cstdio>#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;typedef __int64 LL;const int N=51;cha

2017-01-02 20:47:18 319

原创 Codeforces 160E

给定n个三元组(si,fi,ti) 有m个询问也是三元组的形式(li,ri,bi) 对于每个询问,求满足sj<=li,ri<=fj and bi <=tj 的最小的tj 思路就是 按li一维排序,求满足ri<=fj and bi<=tj 的最小的tj 然后就可以二分tj 判断 ri<=fj 然后就是线段树怼一发#include<cstdio>#include<cstring>#in

2017-01-02 20:11:01 1951

原创 Codeforces 268D

有一根柱子,每个点上可以插有且仅有一根棍子,棍子的方向有四种。 初始,可以选择任意方向往上爬,然后就只能按照原来的方向不停的往上爬。。。 dp[i][a1][a2][a3][a4]表示当前已经插前i跟棍子,第i跟棍子能否到达a1,其他三个方向的棍子与第i跟棍子的距离分别为a2,a3,a4#include<cstdio>#include<iostream>#include<cstring>u

2016-12-25 17:33:06 362

原创 Codeforces 316D2

有n个人,第i个人初始拥有第i号球, 两两之间可以交换球, 第一种人最多能交换1次 第二种人最多能交换2次, dp[i][j]表示第一种人i个,第二种人j个的情况总数 不妨设第一种人1~i,第二种人i+1~i+j,我们只关注第一个人手中的球 1.手中的球为1 dp[i-1][j] 2.手中的球为i+1~i+j j*dp[i][j-1] 3.手中的球为2~i 枚举这个球在传递过程中

2016-12-25 17:17:36 232

原创 Codeforces 283E

不合法的三元组情况一定是这样的, 存在一个项,比其他两个都大, 所以求出每个数比他小的有多少个num[i],总的不合法的就是 ∑ni=1C(num[i],2)\sum_{i=1}^n C(num[i],2) 总共 C(n,3)种情况,减一下就好了 假如要求num[i],把和i有关的区间修改,线段树操作一下, 然后统计 原本比它小的总共修改偶数次 原本比它大的总共修改奇数次, 就是n

2016-12-25 12:38:54 384

原创 Codeforces 358E

真的不会做。。。 别人的代码没怎么看懂。。。#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <cmath>#include <stack>#include <map>#pragma comment(

2016-12-25 11:51:33 216

原创 Codeforces 120I

从后往前枚举新串与原串第一个大的位置, 然后后面的就可以随便选了,然后我们贪心保存后面能得到的最大值,直到最大值大于原串, 然后递归回去求字典序最小#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=2e5+100;int cc[10]={119,36,93,109,46,

2016-12-25 11:23:29 210

原创 Codeforces 431E

1.假如没有修改,直接排序, 然后二分答案,然后找到比答案小的最大的位置,然后求前缀和怼怼 2.有了修改,离散化权值,建线段树,剩下的一样#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=1e5+10;typedef __int64

2016-12-24 22:08:28 267

原创 Codeforces 204D

dp[i]表示前i个字母里面一定有连续k个’B’的情况总数 dp1[i]表示前i个字母里面只有第i号位置出现有连续k个’B’情况总数 然后答案的话就是直接枚举第一次出现连续k个’B’的位置, 然后情况总数*后面一定出现连续k个’W’情况总数#include<cstdio>#include<iostream>#include<cstring>using namespace std;con

2016-12-24 21:32:06 250

原创 Codeforces 452F

哈希学到不好。。。 假如,a+c=2*b 对于比b小的数左高位右低位求hash 对于比b小的数低高位右高位求hash 当两个hash值完全一样就gg掉#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <set>#include <m

2016-12-24 17:17:38 331

原创 Codeforces 117D

不停的分治下去就好了, 更容易想到的是 求出(1,r,u,v)-(1,l-1,u,v)#include <cstdio>typedef long long LL;int Mod;LL u,v;int calc(LL a,LL d,LL n,LL l,LL r){ if (v<a || u>a+d*(n-1)) return 0; if (l==1 && r==n){

2016-12-24 15:42:31 1041

原创 Codeforces 176E

树链剖分 增加一个或删除一个点 1.如果有其他路径经过它,它就对答案没有影响 2.其他情况就各种找lca 反正我已经看不懂我的代码了,就酱#include<cstdio>#include<cstring>#include<iostream>using namespace std;typedef __int64 LL;const int N=1e5+100;const int IN

2016-12-24 12:23:06 383

原创 Codeforces 30D

题意从第k个点出发遍历所有的n+1个点,可以再任一点结束,的最短路#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 100100using namespace std;int n,k;double newtag;double xx[N

2016-12-24 12:12:45 275

原创 Codeforces 68C

题意:给定6个点的有上下界的网络求最大费用最小流 复杂度不可控#include<cstdio>int n,ans,l[10][10],r[10][10],f[10],c[10][10];// Last Change: 2011-03-29 11:15:29void dfs(int s,int t,int fl,int cost

2016-12-24 11:26:36 347

原创 Codeforces 433E

自动机上的数位dp dp[i][j][k] 表示将要考虑到第i个位置,目前走到自动机第j号节点,目前总的价值k,的情况总数////HDU 2457/////f[u]=r,r������u�ĺ�׺��/////last[u]=r,r������u�ĺ�׺�У�������һ������////ÿ����һ����ĸ��״̬ת��һ��#include<cstdio>#include<ios

2016-12-24 10:56:54 1738

原创 Codeforces 359E

题意:从一个点出发,可以上下左右移动,移动的前提是,方向上至少有一个灯是亮的,每次到达一个位置,可以把灯点亮或者关掉,输出一组解能把所有的等都关掉,并且回到起点。 直接搜索一遍就好了,#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>using namespa

2016-12-24 10:46:28 190

原创 Codeforces 140F

对点排序后,总共有k次魔法可以使用 枚举最左边没有用魔法直接在给定点中找到对称点的 枚举最右边没有用魔法直接在给定点中找到对称点的 枚举量分别不会超过k, 然后他们两个一定是互相匹配的,#include<cstdio>#include<set>#include<algorithm>using namespace std;#define X first#define Y se

2016-12-23 21:34:43 268

原创 Codeforces 260E

首先9!枚举儿子的位置, 1.画出水平的两根线,把平面分成三块,每块的个数是个固定值, 2.画出竖直的两根线,把平面分成三块,每块的个数是个固定值, 3.四根线合起来,计数 也不知道这个代码是复制谁的。。。#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<cmath>#include<v

2016-12-23 17:05:08 306

原创 Codeforces 198E

线段树+set 这样就可以保证,每个爪子只被拿走一次,并且只更新一次, 并且更新的复杂度总的来说为n(logn)2n(logn)^2#include <cstdio>#include <iostream>#include <algorithm>#include <set>using namespace std;int i,j,k,X,Y,all,tot,n,M[250011],P[25

2016-12-23 16:52:09 264

原创 Codeforces 491B

|x1−x2|+|y1−y2|=max((x1+y1)+(−x2−y2),(x1−y1)+(−x2+y2),(−x1+y1)+(+x2−y2),(x1−y1)+(+x2+y2))\begin{equation}|x_1-x_2|+|y_1-y_2|=\\max((x_1+y_1)+(-x_2-y_2) ,(x_1-y_1)+(-x_2+y_2) ,(-x_1+y_1)+(+x_2-y_2)

2016-12-23 15:59:29 255

原创 Codeforces 177E2

答案一定是连续的 所以二分得到上下界就好了#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#define N 220000typedef __int64 LL;using namespace std;LL l,r,mid,ans;int n,c,a[N],b[N],i;LL check(LL

2016-12-23 15:29:45 197

原创 DLX

// hdu 2828// poj 3740int mx[N][M];int U[nm],D[nm],L[nm],R[nm],X[nm],Y[nm];int S[M],H[N];int sz,ans;void ver(int x,int y){///上 下 D[x]=y;U[y]=x;}void hor(int x,int y){////左 右 R[x]=y;L[y]

2016-12-23 15:03:59 456

原创 Codeforces 154D

分类讨论 if 可以一步杀死 else if如果a<=0 肯定是draw else 只能不断靠近 1.错过了 draw 2.一定有一个死#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=1e5+10;int aa[N],bb[N],id[N];int vis[N

2016-12-23 15:02:51 419

原创 Codeforces 685D

1.枚举x的取值范围[l,l+k-1],把所有位于这个范围的点存起来; 2.枚举所有的y取值范围[l,l+k-1],然后计数更新答案 3.复杂度仔细想想,还真是对的#include<cstdio>#include<iostream>#include<vector>#include<cstring>#include<algorithm>using namespace std;const

2016-12-23 12:24:10 263

原创 Codeforces 125E

k度最小生成树#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<map>#include<string>using namespace std;const int N=5000+10;const int inf=1<<30;int g[N][N],dis[N],clo[N],pre[

2016-12-23 11:18:26 305

原创 Codeforces 76B

每只老鼠都最多有两个选择,每只老鼠的选择互不交叉,直接dp 1.dp[i][0] 老鼠i朝,离他最近的靠左的ch走 2.dp[i][1] 朝靠右的走#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=1e5+100;int mi[N],ch[

2016-12-23 11:06:57 219

原创 Codeforces 15D

1.预处理以(i,j)为左上角的子矩阵的代价 2.然后优先队列+暴力修改#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 1000+10;int val[maxn][maxn];int M,N;t

2016-12-23 10:37:30 223

原创 Codeforces 500F

1.分段搞一下就好了 2.CDQ应该也可以过吧,懒得写了#include <algorithm>#include <cstring>#include <cstdlib>#include <cstdio>#define N 4010#define For(i,x,y) for (i=x;i<=y;i++)using namespace std;struct ww { int c

2016-12-23 09:46:45 322

原创 Codeforces 309B

倍增一下就好了#include<cstdio>#include<cstring>using namespace std;int a[1000005],nex[1000005],ans[1000005];char s[6000005];int n,r,c,t=1;void ksm(int x){ if(!x)return ; ksm(x>>1); for(int i

2016-12-23 09:41:22 268

原创 Codeforces 407D

最大子矩阵问题#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#define N 402using namespace std;short p[N][N*N];int a[N][N],n,m,l,r,j,i,d[N][N],f[N][N],ans;int main(){ scanf("%

2016-12-22 23:47:23 383

原创 Codeforces 71E

dp[i] 表示状态i最多能合成前dp[i]所需要的元素#include<cstdio>#include<iostream>#include<cstring>using namespace std;int n,k,s1,s2;string s[100]={"H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P"

2016-12-22 22:40:50 291

原创 Codeforces 513E1

只会K子段最大权值和,对于这道题。。。思路代码都是抄的。。。 题解大概是说 ∑|si−si+1|=>∑si−si+1||∑−si+si+1然后两种情况取个最大值\begin{equation}\sum|s_i-s_{i+1}| =>\sum s_i-s_{i+1} | |\sum -s_i+s_{i+1}\\然后两种情况取个最大值\end{equation}#include <bit

2016-12-22 22:30:05 193

原创 Codeforces 228D

1.对于每个z开一颗线段树 2.因为周期比较小,对于每一个节点维护在周期的不同位置区间和#include<iostream>#include<cstdio>using namespace std;#define ll o<<1#define rr o<<1|1#define mid (l+r)/2typedef __int64 LL;const int N=1e5+10;LL cc

2016-12-22 22:11:16 254

原创 Codeforces21D

为什么没写个Floyd写个Spfa。。。。 度为奇数的点两两匹配,这样所有的点的度数就都为偶数了, 然后就是欧拉回路了, 然后求个最优匹配#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;const int N=20;const int M=2000+10;c

2016-12-22 20:48:38 234

原创 Codeforces 346D

建反向图,跑一遍最短路, 更新 1.p[i]=min(p[j])(i->j)+1,当p[j] (i->j)不完全相同 2.p[i]=min(p[j])(i->j),当p[j] (i->j)完全相同#include <cstdio>#include <vector>#include <memory.h>using namespace std;const int MX=1000100,MD

2016-12-22 20:27:43 257

原创 Codeforces 213E

给定两个全排列 |A|=n <= |B|=m 问有多少种不同的d使得数组A里面的所有值全部+d之后 是数组B的子序列 然后就是枚举+0,+1,+2,+3… hash判断一下 #include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<cmath>#inclu

2016-12-22 19:43:53 270

原创 Codoforces 29E

⎧⎩⎨⎪⎪dp[x][y][0]dp[x][y][1]dp[n][1][0]=0表示A在x,B在y的最短路表示A在y,B在x的最短路\begin{equation*}\left\{\begin{array}{}dp[x][y][0] & 表示A在x,B在y的最短路\\dp[x][y][1] & 表示A在y,B在x的最短路\\dp[n][1][0]=0\end{array}\right.

2016-12-22 17:20:14 157

原创 Codeforces 662C

f[i][j]表示翻转行状态为j得到包含i个1的列的个数#include<cstdio>#include<algorithm>#define N 21using namespace std;int f[N][1<<N],n,m,ans=1e9;char s[N][1000010];int main(){ scanf("%d%d",&n,&m); for(int i=1;

2016-12-08 11:09:33 561

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除