- 博客(190)
- 收藏
- 关注
原创 欢迎使用优快云-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
256
原创 Codeforces 421D
假如选择二元组(a,b)那么怎么计算有多少人同意哪?容斥一次就好了 用同意a的人数+同意b的人数-同时同意(a,b)的人数 然后对于这题,所有的二元组分为两种情况 1.存在同时同意二元组里面的两个 2.不存在 即 同时同意(a,b)的人数=0
2017-01-02 21:34:10
367
原创 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
384
原创 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
2168
原创 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
416
原创 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
260
原创 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
421
原创 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
246
原创 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
245
原创 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
298
原创 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
287
原创 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
376
原创 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
3718
原创 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
463
原创 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
306
原创 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
399
原创 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
1828
原创 Codeforces 359E
题意:从一个点出发,可以上下左右移动,移动的前提是,方向上至少有一个灯是亮的,每次到达一个位置,可以把灯点亮或者关掉,输出一组解能把所有的等都关掉,并且回到起点。 直接搜索一遍就好了,#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>using namespa
2016-12-24 10:46:28
221
原创 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
302
原创 Codeforces 260E
首先9!枚举儿子的位置, 1.画出水平的两根线,把平面分成三块,每块的个数是个固定值, 2.画出竖直的两根线,把平面分成三块,每块的个数是个固定值, 3.四根线合起来,计数 也不知道这个代码是复制谁的。。。#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<cmath>#include<v
2016-12-23 17:05:08
333
原创 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
301
原创 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
300
原创 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
222
原创 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
488
原创 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
460
原创 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
293
原创 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
329
原创 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
246
原创 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
255
原创 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
352
原创 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
295
原创 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
426
原创 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
312
原创 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
219
原创 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
310
原创 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
264
原创 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
290
原创 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
329
原创 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
179
原创 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
617
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人