自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 POJ 2576 Tug of War 二维背包 OR 随机化

点击打开链接题意:n个人ndp(i)[j][k]前i个人选j个是否能凑出权值为k? n为奇数可以选half or half-1 n为偶数 只能选half个 复杂度O(n*n*M) #include #include #include #include using namespace std;typedef long long ll;const int N=1e2+

2017-04-30 15:55:04 301

原创 随机化算法

随机化算法随机化算法是这样一种算法,在算法中使用了随机函数,且随机函数的返回值直接或者间接的影响了算法的执行流程或执行结果。随机化算法基于随机方法,依赖于概率大小。POJ 3318 Matrix Multiplication题意:给出三个n*n矩阵A,B,C,n矩阵乘法直接做O(N^3) TLE若AB=C 必有矩阵H使得 HAB=HC 令H为1*N的行向量,则复杂度

2017-04-30 13:51:54 676 2

原创 Codeforces 271D Good Substrings 暴力+Trie

点击打开链接题意:string s长度枚举substring 开头 直到右端点R非法 map标记重复,O(n^2logn) TLE了在标记重复上进行优化,用Tri#include using namespace std;typedef long long ll;const int N=2e3+20;string s,a;int b[N],k;int ch[N*N][30

2017-04-28 15:41:40 438

原创 Codeforces 451E Devu and Flowers 容斥原理暴力+Lucas定理

点击打开链接题意:n个box,n若盒子中花无限答案显然为 x1+x2+..xn=S 的解集个数C(n+S-1,n-1) (yi=xi+1,n+S个1,n+S-1个空隙中选n-1个)现在多了限制fi,若某个xi>fi 则方案数为C(n+S-fi-1,n-1) ,运用容斥扣掉至少有一个xi>fi的方案数nfi,用二进制数表示暴力表示2^n种情况,大组合数取模用了Lucas定理C(n,m)%

2017-04-28 14:08:35 368

原创 Codeforces 792D Paths in a Complete Binary Tree 规律+模拟

点击打开链接题意:给出包含n个结点满二叉树,按照中序遍历的从1~n赋值,n规律1:高度为k的结点可以被2^k整除,不能被2^(k+1)整除 规律2:若结点在第k层,则减去2^(k-1)能到左子树,加上2^(k-1)能到达右子树.则第k层的到达祖先要么加上2^k 要么减去2^k 得到的数必须满足规律1 模拟即可 #include using namespace std;t

2017-04-27 16:48:39 327

原创 Codeforces 460C Present 二分+前缀和

点击打开链接题意:n个数,m次操作 n,m二分最值x,判定:res为a[i]过去被累加次数,显然res=[a[i-w+1]~a[i-1]]被累加的次数之和,利用前缀和b[i]记录前i个数累加之和即可求出res 若a[i]+res#include using namespace std;typedef long long ll;const int N=2e5+20;l

2017-04-26 15:37:30 439

原创 Codeforces 439C Devu and Partitioning of the Array 模拟

点击打开链接题意:给出n加入偶数个奇数 或者若干个偶数不会改变奇偶性 先构造出p组偶数,若偶数不足p个只能用奇数去补剩下奇数个数必须大于q,每一个奇数一组,最后一组必须是奇数个奇数和才能为奇坑点:所有数都要用上,p=0,q=0 偶数,奇数有剩下,情况要补全 #include using namespace std;typedef long long ll;cons

2017-04-26 13:54:06 350

原创 Hihocoder 147周 小HI的烦恼 bitset(技巧)

点击打开链接题意:n暴力O(5*n^2) TLE设 id[i][j] 第j门课排名为i的学生编号,s[j][i] 第j门课 排名为1..i的是那些人第i人的答案为 第k门排名高于他的人的集合相交(k=1~5),则ans=s[k][a[i][k]-1]相交后集合中1的个数#include using namespace std;const int N=3e4+10;in

2017-04-25 19:14:55 393

原创 Codeforces 793D Presents in Bankopolis DP

点击打开链接题意:n个点n问能否找到长度为k的路径使得不存在已经访问过的x出现在路径的第i条边内min(u,v)从a->b ab a之后的点无法被访问,每增加一条边,能走的范围(区间)都会减小dp[l][r][cur][k] 起点为cur,下一步的合法点在(l,r)内,长度为k的路径的最小权值 按cur的边合法的转移状态 O(N^4)记忆化即可#include usi

2017-04-24 12:22:42 1088 1

原创 Codeforces 798D Mike and distribution 构造

点击打开链接题意:数组a,b共有n个数,n Sum(A) && 2*(b[p1]..b[pk]) > Sum(b)2*(a[p1]..a[pk]) > Sum(A)a[p1]..a[pk] > a[q1]..a[q(n-k)] (q为剩下的下标),因为一定有解,所以k=[n/2]+1必定有解 构造:将a从大->小排序后,当n为odd时,先选取A中最大的元素下标,则剩下2k对元素

2017-04-23 23:10:40 479

原创 Codeforces 798C Mike and gcd problem gcd+贪心

点击打开链接题意:n个数,n1的最少操作次数 若初始d=gcd(a1..an)==1,肯定使用操作,则使用操作后->d|2a[i] d|2a[i+1],可以看出最后的d一定整除偶数,所以n个数必须都为偶数. 问题转化为把n个数变为偶数的最小操作次数 a[i]-a[i+1],a[i]+a[i+1],相邻两个odd需要一次操作,相邻odd,even 需要两次操作贪心:先处理(odd

2017-04-22 19:34:44 1532

原创 HDU 3507 Print Article DP(斜率优化入门)

点击打开链接参考链接题意:n个数有代价ci ns[i]为i的前缀和,设d[i] 写出前i个数的最小代价 d[i]=min(d[j]+(sum[i]-sum[j])^2+M) j=1~i j+1~i为最后一段长度n结论1:考虑决策j,k 若决策j优于决策k d[j]+(sum[i]-sum[j])^2+M化解得 (d[j]+sum[j]^2)-(d[k]+

2017-04-21 15:43:03 377

原创 Codeforces 560E Gerald and Giant Chess 组合数学+DP

点击打开链接Change the object to DP题意:h*w地图 有n个block,每次可以向下或向右,问从左上角(1,1)到右下角(h,w)的方法数? h,w经典的DP,但是数据范围h,w先把block按照x递增then y排序,方便操作令终点(h,w)为Ak,设Di为不经过block:A0,A2...Ai-1 到达Ai的方法数,则答案就为Dk 若不存在

2017-04-20 13:00:51 445

原创 Codeforces 505C Mr. Kitayuta, the Treasure Hunter DP+技巧优化

点击打开链接题意:数轴上点[0, 30000]。先从 0 跳到 d=1,跳到某个点上可以得到相应的value,求可以得到最大的value。明显DP阿,设dp[i][j] 当前在i,上一次跳跃距离为j,dp[i][j]=max(dp[i+j][j],dp[i+j+1][j+1],dp[i+j-1][j-1])+val[i];i,j考虑最坏的情况 起点为0,任意给d d每次+1 最大可

2017-04-19 15:59:02 474

原创 Codeforces 501C Misha and Forest 拓扑序

点击打开链接题意:n个点组成的森林,n若v的degree为1,则有边v->s[v],按照拓扑序遍历树,依次更新出边即可  #include using namespace std;typedef pair ii;const int N=2e5+20;int n,d[N],s[N],vis[N];queue q;vector ans;void Topo(){ m

2017-04-18 20:13:07 312

原创 Codeforces 801D Volatile Kite 几何

点击打开链接题意:按顺时针给出n个点,n凸多边形:内角都问题转化一下:求最小D使得多边形non-convex,则改变一个内角,使得它>180 由下图(来自Codeforces题解)知道,答案为:min(点B->直线AC距离的1/2) ,改变的是内角,则ABC为连续的三点 计算点B到直线AC距离用到叉积 d=AB叉积AC/|AC| (四边形面积/底) #inclu

2017-04-18 19:13:10 560

原创 POJ 1113 Wall 凸包(模板题)

用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。题意:给出n个点 n=L?若不考虑L 则答案为凸包的周长,考虑条件L,由如下图形 答案为:凸包周长+以L为半径的圆的周长 求凸包用的是 Graham's Scan法可以根据归纳法来证明,栈中保存的是前i-1个点集的凸包的极点因为按极角排序后,若(p[i],栈顶

2017-04-18 15:50:32 1314

原创 Codeforces 797D Broken BST dfs+模拟

点击打开链接题意:n若暴力查询 最坏时,树退化成链O(n^2)  一个值x能被查询到,当且仅当从root起往值x走的路径中,端点p向右走的值都比x小,端点q向左走的值都比x大则x>=max(p) && x#include using namespace std;typedef long long ll;const int N=2e5+20;const int inf

2017-04-17 17:59:18 690

原创 Codeforces 797E Array Queries 分块思想

点击打开链接题意:给出n个数 aip+a[p]+k 问经过多少次p才能>n?p每次都加上固定的k和变化的a[p],当k>sqrt(n) 则最多循环sqrt(n)次,则可以预处理出k#include using namespace std;typedef long long ll;const int N=1e5+20;int a[N],n,q;int t[500][N]

2017-04-17 03:41:14 367

原创 Codeforces 801C Voltage Keepsake 二分+精度

点击打开链接简单的二分判定,关键精度...精度炸了 以后有关二分精度,固定二分次数 不用eps了#include using namespace std;typedef long long ll;const int N=2e5+20;double p,a[N],b[N],t[N];int n;bool check(double x){ for(int i=1;i<=n;

2017-04-17 02:51:49 560

原创 Codeforces 797C Minimal String 贪心+模拟

点击打开链接题意:给出string s长度字典序最小,greedy:从左到右,每位尽量小.先保存字符1~26的出现出现和最后出现的位置,若游标i在字符k最后出现位置之前,则继续找到k打印,k为当前最小若游标i在字符k最后出现位置之后,则预处理出后缀i内最小的字符,使栈顶元素(当前答案位置)最小即可. 复杂度O(2*n)#include using namespac

2017-04-16 23:18:37 1051

原创 AGC 013 B Hamiltonish Path 模拟(deque)

点击打开链接题意:n任意两个相邻点作为endpoint,并放入双端队列中,遍历u的相邻点,若存在v没被访问,则令v为起点 继续模拟 因为一定有解,复杂度为O(M) #include using namespace std;const int N=2e5+20;int n,m;vector e[N];int q[N],f,r; //deque,保存起点和终点 int vi

2017-04-16 19:23:40 489

原创 Codeforces 762C Two Strings 二分判定+预处理

点击打开链接题意:给出两个string a,b,长度删除字符要最小,若删除x个b为子序列,则删除y,y>=x个也肯定满足 二分答案因为要删除的连续的一段,确定x之后 b只剩下某个前缀和某个后缀组成string只要预处理出前缀i在a中匹配的子序列的最小下标结尾f[i],和后缀j在a中匹配的子序列的最大下标起点h[j]若f[i]#include using names

2017-04-15 11:04:53 500

原创 Codeforces 740D Alyona and a tree 二分+树上差分

点击打开链接题意:n个结点,带权的树,v控制u当且仅当 u为v的子孙&& dist[u,v]设d[i]为i->rt的距离,dist[u,v]=d[u]-d[v],根据u来更新答案,控制u的v必须满足 ,d[v]>=d[u]-a[u] d[i]随着深度递增,若在dfs过程中保存u的祖先的d值,可以二分找到第一个满足的pos,则ans[pos~fa[u]]都应该+1怎么判断祖先

2017-04-13 13:27:16 642

原创 Codeforces 796D Police Stations 构造+BFS

点击打开链接题意:n个点的树,k个为黑色,law:任意点距离d内都有黑点,n,k,d由于是树,每删除一条边 都增加一个联通分量,无论d是多少,每个联通分量内都要有一个黑点,所以删除的边不会超过k-1.一开始已经满足law,任意点到黑点的最短距离可以构造k个合法的联通分量:对每个点u,把它加入到和它最近的黑点的联通分量中,黑点距离自己为0,同一个联通分量只有一个黑

2017-04-12 15:29:23 722

原创 HDU 4920 Matrix multiplication 暴力(bitset)

点击打开链接题意:n*n矩阵A,B相乘后%3的结果 n直接相乘,O(n^3)=5e8 TLE由于求%3后的结果 则用bitset保存A每行和B每列%3后的情况则c[i][j]=A第i行和B第j列,共有部分的个数*权值x(x=1,2,4) #include using namespace std;const int N=2e3+20;bitset a[N][3],b

2017-04-11 20:04:05 323

原创 Codeforces 796C Bank Hacking 贪心+规律

点击打开链接题意:n个结点,n-1条边,每个点价值为a[i],两点有边直接相连,算相邻,i,j半相邻:存在没被攻击的中间点k,(i,k),(j,k)是相邻的 攻击i后,和i相邻和半相邻的点a[i]++,n除了第一次外,每次攻击的点必须满足:1:online,2:和某个offline相邻,3:a[i]n点,n-1条边且连通,则为无根的树,任取一点为根关键在于条件2:每

2017-04-11 04:45:50 1952 2

原创 Atcoder ARC 71D 井井井 / ### 公式化简

点击打开链接题意:给出m条平行于x轴的直线:yi ,n条平行于y轴的直线xi,n,mans=segma(1~n)segma(1~m)(xj-xi)*(yl-yk)ans=segma(xj-xi)*segma(yl-yk)n#include using namespace std;typedef long long ll;const int N=2e5+20;const

2017-04-10 23:35:40 721

原创 POJ 1741 Tree 树的点分治

点击打开链接题意:给出n个结点的树,边的权值和k,ndist(u,v)要么经过根结点,要么就在某个子树中,则分治来做设d[i]为i到当前根的距离,通过rt的合法对数为d[u]+d[v]不通过rt的路径为子问题,递归求解即可可以用反证法 证明若选取树的重心为根,则最大子树的结点数每层都做了排序和二分,复杂度为O(nlogn),总的时间复杂度为O(nlog^2n)

2017-04-10 22:21:39 281

原创 Codeforces 682C Alyona and the Tree DP

点击打开链接题意:n个结点带权树,边可以为负,n令dp[u]为以u开头(往祖先走)的最大子串和,(或者递归时保存最小的dist[1,v],dist[u,v]=dist[1,u]-dist[1,v]]),若dp[u]>a[u] 则u是肯定要删除滴.op每次只能删除leaf,当u变为leaf 删除的为u的子树大小,从上往下删除保证不重复删 dp[u]=max(dp[u],dp[v]

2017-04-06 20:54:02 423

原创 Codeforces 681D Gifts by the List dfs+构造

点击打开链接题意:给出n点,m边的森林,a[i]为i的祖先,问能否构造出一个list,使得每个i:在list中第一个找到的祖先为a[i]?i的祖先集合为B,则在list中,a[i]应该出现在每个b[k]之前,a[i]->b[k]连接一条边,判断拓扑序.(显然MLE,TLE!!)u-v  v为u的father情况1:u给u送礼 情况2:u不给自己送礼,则list中

2017-04-06 11:45:04 351

原创 POJ 1155 TELE 树形DP(背包)

点击打开链接题意:有n个结点的树,m个叶结点代表用户的价值,其余边表示代价,问收入不为负数时,最多能选多少个叶结点? n设dp[i][k] 表示结点i选择k个叶结点的最大收入,ans:第一个dp[1][ans]>=0转移状态时 枚举从子树中选择多少个结点,即分组背包 O(n^3)水过....#include #include #include #include #inclu

2017-04-02 21:49:03 317

原创 Atcoder AGC B Splatter Painting 记忆化+逆向模拟

点击打开链接题意:n点,m边,q个操作 vi,di,ci 每次将与v距离d以内的点涂成c,问q次操作后n个定点颜色?n,m,q//逆向考虑,从编号大的操作开始,每个点u最终颜色由最后一次对u上色的操作决定 if(!a[u]) a[u]=c,记忆化操作fun(u,d),如果fun(u,d)被执行,编号小的fun(u,d)就不用再执行了, fun(u,d)=fun(v,d-1)(v是u

2017-04-02 10:13:13 627

原创 Atcoder Beginner 057 D Maximum Average Sets 数学+思维

点击打开链接题意:n件物品,可以选a~b件,求平均值最大是多少和方法数? n固定的k=a~b ave=sum/k ave要大 sum要最大 选最大的k个 1/k*segma(vi) i=0~k-1 - 1/(k+1) segma(vi) i=0~k >=0所以选A个时的平均值最大;e.g a=2,b=4 a[i]={20,20,20,20,10} 方法数为11  

2017-04-01 21:56:14 714

空空如也

空空如也

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

TA关注的人

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