华容道 华容道最优解,请将代码末的棋盘输入,程序会打印每一步走法。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define RepE(i, x
【SRM 565 UnknownTree】计数 分类讨论 一个有N + 3个点的树,告诉你123号点到其他点的距离,求合法的边权为正整数的树个数。#include #include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y
【codeforces 576D】LCS Again 给一个串,问有多少和它长度相同的串,使得LCS为l - 1。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define RepE(i,
【VOJ1895】 ニニスの守護 后缀数组 DP 有一个十进制数字符串S,它是由一个严格上升的数列A拼接而成,要求你构造A使得:1. 最后一个数最小2. 在1的基础上字典序最大#include #include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y)
【Topcoder SRM 641】BitToggler 期望 高斯消元 有一个长度为n的01数列a和一个指针,每次随机将指针移至j,并将aj取反,花费为|i - j|,当数列全0或全1停止,求期望花费。n 使用期望的线性性,每次只统计i到j的贡献,这样其他位置就没有区分了,压个状态就可以消元了。#include #include #include #include #include #include #define Rep(i, x,
【NOI2015】小园丁与老司机 DP 网络流 一开始你在原点,有n棵许愿树,你每次可以向左,右,左上,右上,上到达最近的一棵许愿树许愿。问最多能到达多少许愿树,输出方案。在所有可能的路径中,保留所有非左右的边,问最小路径覆盖所有的边。n 首先按y坐标排序,使用map进行转移,同层的点一起转移。建出第三问的图后,考虑一个点的入度和出度,如果路径不可相交,答案就是Σmax(in[x] - out[x], 0),考虑增建平行边,就可以网络流
【Bestcoder 68C】function 莫比乌斯函数 已知 n2−3n+2=∑d|nf(d) n^2 - 3n + 2 = \sum_{d | n} f(d) 求 ∑ni=1f(i) \sum_{i=1}^{n}f(i) n <= 10^9 莫比乌斯反演得:f(n)=∑d|ng(d)∗mu(n/d) f(n) = \sum_{d|n}g(d)*mu(n/d) ∑i=1nf(i)=∑i=1ng(i)∗∑j=1n/imu(j) \sum_{i
【bzoj3992】序列统计 FFT 原根 给一个集合,用这个集合组成的长度为n的序列中,在mod m下乘积为x的个数。n 首先可以把乘积变为原根的指数相加的形式,然后取模FFT即可。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for
【bzoj 3615】MSS 分块 线段树的合并和拆分 二维坐标上有n个点,每维坐标互不相同。初始时每个点为一个独立的集合,要求维护:合并两个集合将集合id某一维以v为界拆分为两个集合将集合x的数都加d询问一个集合的sum,max,min考虑按x坐标分块,对每个集合,每块建一个线段树。/************************************************************** P
Polya定理 burnside引理:在一个置换群上的等价类为:(1 / n) * sigma(一个置换的不动点个数)对于旋转的问题,暴力统计要枚举每种置换,则循环节长度为(n, i),可以发现只要枚举n的约数k,统计后乘上phi(n / k)即可。对于翻折是和奇偶有关, 通常有ans[n] = (1/2) * (f[n] + f[ floor(n + 1 / 2) ]),有时需根据奇偶分类处理。
【WC2013】糖果公园 树上莫队 树上莫队,将树分块,以x,y为一二关键字,以时间为第三关键字。暴力修改。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define Re
【bzoj 3815】卡常数 找球面点,用k-d树,在不可能出现的长方体剪枝即可。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define RepE(i, x) f
【noi2007】生成树计数 连通性DP 有n个点,距离不超过k的有连边,求生成树个数。用最小表示法和矩阵乘法。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define R
【poj 2451】半平面交 注意先弹出队顶,dz #include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define RepE(i, x) for(int i = pos[x]
【bzoj 3821】玄学 线段树 给一个数列ai。要求维护(在线):1.将ai到aj的值变为(ax + b) mod m2.问执行操作i到操作j后ak的权值对操作建线段树,一个线段树节点只在加入操作r后update,一个节点可以用一个长度为O(l)的数组维护,询问时二分下即可。log平方n。#include #include #include #include #include #define Rep(i
【poj3831】Open-air shopping malls 给一些圆,求一个大圆使得对每个圆都覆盖了至少一半,求其最小半径,大圆的圆心要是一个小圆的圆心。直接枚举圆心,二分半径,相交区域是两个拱形。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (
【NOI2014】购票 线段树做法 先推出动态转移方程方程,它有一个距离限制,这一维可以用线段树维护,然后线段树中的凸包要求有回溯操作,这个每次只会修改top和那一为的值,记录一下即可。(bzoj上TLE了。。。
【Spoj COT3】SG函数 Trie启发式合并 给一颗有黑白点的有根树,每次可以选一个白点并将其到根的路径染黑,问先手是否必胜以及第1步的可能选择。子树间相互独立,用Trie维护一个子树操作一次可达SG值,这个用Trie启发式合并可求,需要打标记。#include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i
【bzoj1576】[Usaco2009 Jan]安全路经Travel 给一张无向图,1号点到i号点的最短路唯一,求1到i不经过原最短路最后一条边的最短距离。n 由于最短路唯一,先求最短路径树,考虑非树边uv,它能使uv以上,lca以下的点多一种路径,长度为dis[u] + dis[v] + edge[i] - dis[x]。我们令这条非树边的值为val[i] = dis[u] + dis[v] + edge[i],我们只需对每个x,找出最小的val。可以先按va
【bzoj4150】[AMPPZ2014]The Staging 线段树 在舞台上有n个枪手,第i个枪手瞄准了第p[i]个枪手,将于第u[i]秒开枪。一个枪手如果成功开枪,那么被瞄准的枪手会立刻死亡。现在给出q次修改操作,请在一开始和每次修改操作后统计出最后存活的枪手个数。p[i]互不相同,p[i] != i。首先发现枪手形成若干环。于是可以用线段树维护,一个区间的开头那个人的状态对应结尾的状态,以及存活人数。其他想法:u[i]折线图中只有下降的区间