自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Remilia's

此博客停更了,新博客地址www.zhuoyifan.net

  • 博客(1486)
  • 收藏
  • 关注

原创 BestCoder Round #41 A B C

A:52张牌,枚举每种可以的情况,统计已经有x张牌了,需要换的就是5 - x张,不断维护最小值就可以了B:败的情况只有2种,两个串奇偶性不同,两个串完全相同,所以简单统计一下就可以了,最后除上总情况C(n, 2)即可C:这题看了官方题解才会的,dp[i][j] = dp[i - j][j] + dp[i - j][j - 1],自己也是没想到,弱爆了,具体的可以看官方题解,有的递推式子,然

2015-05-17 11:15:07 1375

原创 2011 Asia Fuzhou Regional Contest

这两天做了套题,2011的福州区域赛,把基本算能做的7题做了,感觉这套题多是,两种算法糅合在一起,硬搞出一道题- - 而且有好几道题我是用到了rmq。。A:暴力黑帅走的4个方向,然后去枚举每个红棋能不能攻击到就可以了,注意细节B:先把每个月饼,加上(m - i) * s,这样就能消除等差数列的影响,然后每个订单处理出时间后now,在now 和 now - t中找出最小值这步用rmq即可,然

2015-05-15 01:04:57 1574

原创 POJ 3264 Balanced Lineup (RMQ)

检验模板代码:#include #include #include #include #include using namespace std;const int N = 200005;int n, m;int rmax[N][20], rmin[N][20], rmi[N], dp[N];void rmqinit(int n) { rmi[0] = -1;

2015-05-12 20:23:29 901

原创 HDU 2196 Computer(树的直径)

输出一棵树上,每个点到最远点的距离思路:先搜两遍找出树的直径,然后在从这两点出发,每个点距离这两点中距离大的就是最远点距离代码:#include #include #include #include #include using namespace std;const int N = 50005;int n, m;struct Edge { int v, w

2015-05-12 17:02:44 716

原创 HDU 4006 The kth great number(优先队列)

由于只有插入操作,所以不很复杂的数据结构,优先队列就可以了,每次保持队列中有k个元素,这样取出的头必然是第k大代码:#include #include #include #include using namespace std;int n, k;int main() { while (~scanf("%d%d", &n, &k)) { char s[

2015-05-12 00:56:42 604

原创 HDU 4055 Number String(dp)

dp[i][j]表示i个数,结尾是j的种数,对于多一个数字,如果要增加dp[i][j] = sigma{dp[i - 1][k]} {k j),实际转移过程只需要循环一遍,不断记录前缀和即可代码:#include #include #include using namespace std;const int N = 1005;const int MOD = 100000000

2015-05-12 00:55:37 773

原创 HDU 4054 Hexadecimal View(模拟)

利用%x直接输出16进制数,简单模拟即可,水题代码:#include #include #include using namespace std;const int N = 1000005;char s[N];int main() { while (gets(s) != NULL) { int len = strlen(s); for

2015-05-12 00:51:33 761

原创 HDU 4004 The Frog's Games (二分贪心)

二分答案,每次贪心尽量跳远去判断即可代码:#include #include #include using namespace std;const int N = 500005;int L, n, m, a[N];bool judge(int mid) { int s = 0; int cnt = 0; while (s != n) {

2015-05-12 00:50:52 695

原创 HDU 4046 Panda(线段树)

线段树区间合并,合并注意下r, b的转移即可代码:#include #include #include using namespace std;const int N = 50005;int t, n, q;char s[3], str[N];#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)struct No

2015-05-12 00:50:17 740

原创 HDU 4041 Eliminate Witches!(模拟)

这个用类似词法分析器去模拟就可以了,对于路径,用一个栈去维护代码:#include #include #include #include #include #include #include #include using namespace std;const int N = 1000005;int t, n, u, hn;char str[N], name[15

2015-05-12 00:48:03 686

原创 hihocoder 1159 扑克牌(组合DP)

先预处理出每种牌的张数,对于花色只要考虑一下排列组合即可那么设dp[i][j],表示用到第i张牌,相邻位置为相同花色有j个,然后枚举当前的牌要分成几堆,几堆插入到相同花色位置,剩下插入到不同花色位置,这样去转移即可代码:#include #include #include using namespace std;typedef unsigned long long ll;c

2015-05-11 12:54:23 1025

原创 POJ 2976 Dropping tests(01分数规划)

01分数规划代码:#include #include #include using namespace std;const int N = 1005;typedef long long ll;int n, k;double a[N], b[N], tmp[N];bool cmp(double a, double b) { return a > b;}in

2015-05-11 11:21:49 695

原创 hihocoder 1157 建造金字塔 (DP)

每个金字塔其实相当于一个区间,把这个区间按左端点排序,然后dp[i][j]表示,用到第i个金字塔,j表示覆盖到j,因为按左端点排序了,所以如果j被覆盖到,那么当前的i,往前肯定不会覆盖超过前面金字塔的覆盖,所以只要考虑后一部分的转移,转移具体见代码代码:#include #include #include using namespace std;typedef long long

2015-05-11 11:00:19 1034 2

原创 hihocoder 1169 猜数字

线段树离线处理,把数字和询问一起排序,然后从小到大插入数字,每次询问就找寻区间最大值,在从大到小做一遍,每次询问找区间最小值,这样每次询问出来的值肯定是原来数字左右两边最接近的代码:#include #include #include using namespace std;const int N = 200005;int n, m, t, qn;struct Query

2015-05-10 23:35:05 853

原创 hihocoder 1170 机器人

预处理每两个颜色i,j,j完全移动到i之前的代价,这个只要计算j每个位置之前有多少个i,累加起来就是了然后状压DP,每次新加入一个颜色,就计算把这个颜色和移到已有颜色之前的代价总和,然后进行转移即可代码:#include #include #include using namespace std;const int N = 100005;typedef long long

2015-05-10 23:34:46 875

原创 hihocoder 1160 攻城略地

先并查集处理出每个集合,和每个集合最小的点的下标然后把每个点权值从大到排序,砍k条边其实相当于加m - k条边,每次加一条边可以减少一个点的权值(除了每个集合的最小点),这样从大到小把能删的尽量贪心删掉即可代码:#include #include #include #include using namespace std;typedef long long ll;con

2015-05-10 23:31:07 687

原创 hihocoder 1158 质数相关

很明显的最大独立集, 预处理出矛盾边点数1000个,用HK算法保险代码:#include #include #include #include #include using namespace std;const int N = 1005;const int INF = 0x3f3f3f3f;bool bmask[N];int nx, ny, dis;int c

2015-05-10 23:29:04 581

原创 hihocoder 1156 彩色的树

这题快速维护的方法是:每个节点只有一个父亲,和许多儿子这样每个节点存放儿子每种颜色的数目,用个map来存,然后和父亲的关系每次特殊考虑即可每次染色完,把当前节点颜色修改,然后父亲的map修改即可代码:#include #include #include #include #include using namespace std;const int N = 1000

2015-05-10 23:28:56 551

原创 hihocoder 1150 基站选址

首先X,Y轴分开考虑,枚举B,对于坐标分成左边和右边,这两边都是满足凹函数的,可以三分求解,维护最小值(不过据说这题数据很水,我模拟退火的也过了代码:#include #include #include using namespace std;typedef long long ll;const int N = 105;int ax[N * 10], ay[N * 10

2015-05-10 23:26:01 911

原创 BestCoder Round #40 A B C

A,水题,直接枚举到sqrtB,每次对于每一位枚举,如果小于当前位,那么答案可以计算出来,增加得答案为:设3个部分,前完全一样的部分a,中间新选的一个b,后面的全排列c,这样就把每部分和每两部分能够组成的逆序对个数计算出来,由于n只有100,里面在去枚举也是没问题的,主要是后面全排列c的逆序对数,这个可以利用dp处理出来,dp[i] = dp[i - 1] * i + i! * sum(i -

2015-05-10 15:05:16 1305

原创 赛码"BestCoder"杯中国大学生程序设计冠军赛

今天终于有时间补题了。。06神数论没补。01:贪心的思路,扫3遍,尽量找右区间小的02:这里用的是kuangbin神的黑科技,并查集,把一个点拆成一个奇数点和偶数点,每次连边就奇数边和偶数边连,如果出现一个点自己的奇数和偶数点在一个集合中就是有奇环,如果在加一条边的时候,这条边已经在一个集合了,那么肯定会出现偶环(如果本来是奇环,加一条边进去必然出现偶环)03:和官方题解一个思路,主要

2015-05-08 14:19:44 1234 3

原创 福州大学第十二届程序设计竞赛题解

A:这题利用单调栈,先预处理出每个位置向下的最远位置,那么每一行单独考虑,每行就相当于一些段的子矩阵个数,利用单调栈维护,每次出栈的时候把大于当前要入栈(高度0的不入栈了)的段的部分计算出来,累加一下答案即可B:这题可以枚举,因为一个10^15开3方之后是10^5枚举起来是没有问题的,然后枚举一个数字i,等于要计算在max(a, i * i * i)到min(i * i * i, b)区间,有

2015-05-04 02:05:43 1849

原创 Acdream 1076 XXX的机器人(dp + 线段树)

题目链接:http://acdream.info/problem?pid=1076这题DP的状态很好设计,dp[i][j]表示指令i的时候,全排列状态是j,全排列一共就120个,预处理出来就可以了那么问题就在于对于一个指令怎么快速获得这个整个区间的置换乘积,这步其实利用一个线段树维护就可以了,但是要注意置换是不满足交换律的,所以正序逆序都要保存一遍代码:#include #inc

2015-05-04 00:56:56 1511

原创 SGU 120 Archipelago (计算几何)

就计算几何向量旋转什么的搞搞搞就OK了代码:#include #include #include #include using namespace std;const int N = 155;const double pi = acos(-1.0);int n, n1, n2;struct Point { double x, y; int id;

2015-05-02 01:55:10 599

原创 SGU 119 Magic Pairs(数论)

做这题的时候真的是脑子短路了,记录一下。首先已知一个解了,由于有mod n这个东西,所以剩下的解肯定为已知解的x倍mod n,于是在a和b上进行操作就可以了,循环节为n / gcd(n, a),那么a和b的循环节都求出来,他们的lcm就是公共循环节,也就是答案的个数了代码:#include #include #include #include using namespace s

2015-04-30 23:27:23 1045

原创 ZOJ 3871 Convex Hull(计数)

一个n边形的面积,可以三角剖分成n 个每个边和原点构成的三角形的有向面积这样每条边等于一个有向面积,那么问题转化成只要求每条边能作为几个凸包的边那么枚举一点O,这样对于任意一点X会有一条OX的边,而这条边构成凸包的数量,显然就是只能在和他夹角180度以内的边以内找,也就是有多少个点,就是2^num - 1(因为至少要有一个点)于是进行极角排序,双指针扫一遍就能得到所有答案代码:

2015-04-29 12:47:27 1807

原创 SGU 109 Magic of David Copperfield II(构造)

这题UVA上做过类似题,不过这一题又多了一个条件,就是步数只能在n到300之间那怎么办呢。其实多一个构造就可以了,一开始走n步,把右下角整块移除掉,那剩下n条对角线,那最多就只用到299步就可以啦代码:#include #include #include using namespace std;int n;int main() { while (~scanf(

2015-04-27 18:22:59 707

原创 HDU 2865 Birthday Toy(ploya好题)

对于这种颜色多的,但是限制简单的情况,可以利用dp推出公式,然后矩阵快速幂求解代码:#include #include #include using namespace std;const int MOD = 1000000007;typedef long long ll;int n, k;int phi(int n) { int ans = n; fo

2015-04-26 13:58:57 604

原创 POJ 2888 Magic Bracelet(ploya)

跟POJ2154一样的思路,但是这题多了个颜色限制构造关系矩阵,每次有i个循环节,就做i次矩阵乘法,得到的就是每个颜色经过i步能回到自身的情况数,利用矩阵快速幂就可以快速计算了代码:#include #include #include using namespace std;const int MOD = 9973;int t, n, m, k;struct Mat

2015-04-25 10:37:53 544

原创 POJ 2154 Color (ploya欧拉函数)

ploya定理,然后公式利用欧拉函数优化,gcd必然是因子,这样只要枚举因子,每个因子利用欧拉函数计算出现次数代码:#include #include #include using namespace std;int t, n, p;int pow_mod(int x, int k) { x %= p; int ans = 1; while (k) {

2015-04-23 09:58:14 915 3

原创 SGU 108 (空间优化)

这题本来觉得是道没什么的水题,结果没想到空间卡得这么死于是注意观察式子,发现每个推到后面最多加7 * 9 (7位数,每位是9)于是就只要开64的空间,利用滚动数组去优化即可另外还要注意,答案表全打出来也是会MLE的,只能根据输入的k去存放k个答案代码:#include #include #include using namespace std;int n, k, dp

2015-04-22 13:02:01 621

原创 SGU 103 Traffic Lights(最短路)

这题不错,是一个最短路,但是中间有一个限制条件,就是等待时间首先先看一下为什么仍然满足最短路因为最短路肯定是每个结点求出最早到达的时间,那么其实不管有没等待,从队头取出去转移的肯定是最早的时间,仍然满足转移那么就是等待时间如何去计算的问题其实就先写一个函数,获得当前的颜色,和到下一个颜色的时间然后如果颜色相同就不用等如果颜色不同,到下一个颜色时间又不同,就返回其中小的时间

2015-04-22 10:44:55 595

原创 SGU 106 The equation(拓展欧几里得)

通解形式然后利用x,y去求出范围,就能得到解的个数注意特判a和b都为0的情况代码:#include #include #include #include using namespace std;typedef long long ll;ll a, b, c;double a1, a2, b1, b2;ll exgcd(ll a, ll b, ll &x,

2015-04-21 21:06:36 507

原创 SGU 101 Domino(欧拉路径)

0-6作为结点,那么每个骨牌相当于一条无向边了建图,进行欧拉路径判断,然后dfs找出路径打印即可代码:#include #include #include using namespace std;const int N = 7;int n;struct Edge { int u, v, tp, id, vis; Edge() {} Edge

2015-04-21 17:12:01 586

原创 编程之美2015资格赛

A:处理下日期,容斥加减一下B:DP,dp[l][r]表示区间回文子序列个数C:模拟退火过了,然后还有个比较科学的方法,就是枚举B点,XY轴分开考虑,三分求解代码:#include #include #include #include #include using namespace std;int t, year;char m1[2][15];int m[2]

2015-04-20 07:02:19 1027

原创 SPOJ 7001 Visible Lattice Points(莫比乌斯反演)

莫比乌斯反演,注意0的情况特殊考虑下就可以了#include #include #include using namespace std;const int N = 1000005;int mo[N], prime[N], pn;bool vis[N];void Moblus() { memset(vis, false, sizeof(vis)); mo[1

2015-04-16 16:22:02 619

原创 HDU 3929 Big Coefficients(容斥+证明)

(1 + x)^n 的奇数项系数个数等于 2^(bitcount(n)),bitcount(x)为x有多少个1.然后容斥枚举每一项存在不存在,然后容斥加加减减即可这题用二进制枚举会T,只能DFS代码:#include #include #include using namespace std;const int N = 15;typedef long long ll

2015-04-16 14:02:07 1002 1

原创 ZOJ 3556 How Many Sets I (容斥)

这题是个容斥。总情况有2^(nk)中,但是其中包含了1个重复元素,2个,3个。。用容斥,1个重复元素加上,2个减去,3个加上这样推出公式为C(n, 0)2^(nk) - C(n, 1)2^((n -1)k) + C(n, 2)2^((n - 2)k)......==> (2^k - 1)^n 快速幂取模计算即可代码:#include #include type

2015-04-15 17:12:54 563

原创 HDU 1695 GCD(容斥 or 莫比乌斯反演)

这题可以用容斥做,然而效率并不高。。于是学了下莫比乌斯反演(资料百度找)求出mo数组后设f(x)为gcd为x的种数F(x)为gcd为x倍数的种数那么显然F(x) = (b / x) * (d / x)莫比乌斯反演之后,得到f(x) = sum(mo[i] * F(i))。然后还要容斥减去对称重复的。对称重复的情况为min(b, d)小的中,求一遍除2,(因为存在x =

2015-04-15 16:25:42 861

原创 HDU 1176 免费馅饼(DP)

很显然的DP。。dp[i][j], i秒位置在j的最大接饼数代码:#include #include #include using namespace std;const int N = 100005;const int INF = 0x3f3f3f3f;int n;int dp[N][11], g[N][11];int main() { while (~sc

2015-04-14 16:41:44 566

空空如也

空空如也

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

TA关注的人

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