04 2014 档案
摘要:题意:现在有n个课程,每个课程有一定的参与人数,然后每个课程有开始时间和结束时间ai,bi.而且给定了一个矩阵clean(ij),表示的是上完i课程需要clean[i][j]的时间打扫卫生才能继续上j课程。也就是说如果上完i课程要上j课程就需要满足条件b[i]+clean[i][j]j'. 然后源点...
阅读全文
摘要:今天学了一下传说中的解决离线询问不修改的一种算法。题目的意思非常简单,就是询问在一个[L,R]区间里的取两个物品,然后这两个物品颜色相同的概率。其实就是对于每种颜色i,这个区间里对应的个数cnt[i],那么答案就应该是 sigma (cnt[i]*cnt[i-1]) / (R-L+1)*(R-L)....
阅读全文
摘要:看了别人写的AC自动机,瞬时觉得自己写的好难看,于是决定改写一下,贴一下模板,以后备用#define maxn 220000#define ll long longint n, m;struct Trie{ Trie *fail, *go[26]; bool ter; void init(){ m...
阅读全文
摘要:题意:给你n个禁止串,然后你只能用字符表的前m个字符去写一个无限长的串,要求是不能包含禁止串,而且串在后面不能出现循环比赛的时候想的是先建一个自动机,然后将自动机确定化,不能到达的状态全部弄出来。但是对于剩下的状态就卡住了,我怎么才能知道这些状态会构成循环呢?后来看了别人的代码,看到了强连通分量,我...
阅读全文
摘要:题意:有n个boss,m种武器,每种武器选用的时候需要有一定的花费ci,然后这个武器可以消灭掉其中一些BOSS,问你消灭完所有的BOSS,需要的最少花费是多少。当时比赛的时候,看到这题以为是什么网络流的题,一种熟悉的感觉,后来才发现,购买一次武器可以消灭掉那么多怪物才不是什么费用流呢。赛后得知这个叫...
阅读全文
摘要:下面的代码99%参考了这个网站http://www.cnblogs.com/183zyz/archive/2011/08/07/2130193.html人生的第一道DLX肯定是需要作一些参考的啦。题意:给你N个城市,M个雷达,你要在其中选K个,问当半径最小是多少的时候可以覆盖到所有的N个城市。做法:...
阅读全文
摘要:补一下一些小盲区,譬如simpson这种数值积分的方法虽然一直知道,但是从未实现过,做一道例题存一个模板。#pragma warning(disable:4996)#include#include#include#include#include#includeusing namespace std;double a, b, l, r;double sqr(double x){ return x*x;}double f(double x){ return b / a*sqrt(sqr(a) - sqr(x));}double simpson(double l, double r){ return
阅读全文
摘要:一看到ACGT就会想起AC自动机上的dp,这种奇怪的联想可能是源于某道叫DNA什么的题的。题意,给你很多个长度不大于10的小串,小串最多有50个,然后有一个长度#include#include#include#include#include#include#define maxn 1500using namespace std;char str[50][15];char T[50];int n;void convert(char *s){ int len = strlen(s); for (int i = 0; i go[c[i] - 'a'] != 0) p = p->
阅读全文
摘要:题意:给你N个的任务一定要在每天的[Li,Ri]时段完成,然后你只有K天的时间,每个任务有个val,然后求K天里能够获得的最大bonus。思路:拿到手第一直觉是最小费用最大流,然后不会建图,就跑去想dp去了。好吧最小费用最大流的做法是这样的。首先题目给的是时间,所以变成整数的区间再离散化是一个标准姿势啦。然后对于相邻的时间点 1,2,3,4顺次建立这样的边 1->2->3->4...,边的容量为inf,费用为0.然后对于源点s,我们向时间点1连一条容量为k,费用为0的边,目的是限流。最后由最后一个时间点向汇点t连一条容量为inf,费用为0的边。然后对于每个事件,li,ri,v
阅读全文
摘要:题意:给你2^n个数,每次操作将其分成2^k份,对于每一份内部的数进行翻转,每次操作完后输出操作后的2^n个数的逆序数。解法:2^n个数,可以联想到建立一棵二叉树的东西,比如 2,1,4,3就可以建成下面这样 [2,1,4,3] level 2 / \ [2,1] [4,3] level 1 / \ / \ ...
阅读全文
摘要:题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费。一开始想的时候以为是费用流,但想着想着觉得,这么大的数据量绝对不可能是费用流。最后发现它是一个最小割模型。实际上就是要将网络里的模块划分成s-t两个点集,然后我们合适的构造一下边就可以使得对应的最小割就是我们的答案,构造的方法是这样的:当模块属于A集的时候,花费为ai,所以就从向t连一条ai的边,而当模块属于B集的时候,花费为bi,所以就由s连一条向bi的边。然后对于每个任务,当ai,bi不同的时候花费为mi,所以就由ai,b
阅读全文
摘要:题目给你一棵苹果树,然后每个结点上有一定的苹果树,你要将苹果运输达到某个状态,使得均方差最小。 将苹果x个从a->b的花费是x*w,w是边权。当时比赛的时候想的就是,最后达到的状态一定是sum/n,但是除不尽的时候可能有些会多出1,譬如7个苹果,3个结点,最后的平衡一定是2,2,3。 问题就是我们需要考虑的是哪些结点是3和2,我就在这里卡住了。赛后看了一些题解,其实可以把这个看成是树dp,dp[v][n]表示结点v下有n个多出来是1的结点,然后做一个树dp,我之所以没有这么想是考虑复杂了,我是直接算从(u,v)的路径长度乘以x,但实际上没必要,因为传输的时候必然是经过父边来传输的。树dp
阅读全文
摘要:题意:给你一个圆形和很多个矩形,然后要你求圆形的圆周有多少被矩形覆盖。思路:比赛的时候是有思路的了,不过一直在调别的题,最后剩下30分钟肯定来不及敲。想法是这样的,要是我们可以求出每个矩形覆盖了圆周的哪些区间,我们最后就对这些区间排序然后求区间和就好了,但是问题是怎么知道哪些区间是要的,哪些区间是不要的呢? 首先我们对矩形的四条线段和矩形求交,把所有的交点求出来,然后将交点用atan2转化成极角(我用的区间是[0,2pi]),实际上直接用极角肯定也没问题吧),然后排序,排序之后我们会发现我们要的区间一定是相邻的两个角度的点对应的区间,但是有可能这些区间是不是我们要的,判断的条件就是两个角度的对
阅读全文
摘要:题意:一个人物有K(K#include#include#include#include#include#include#define ll long long#define maxn 120#define maxk 10using namespace std;int K, N;int b[maxk], c[maxk], d[maxk];int G[maxn][maxk];int a[maxn];int X, Y;int dp[2][maxn][1 = K) return 0; int cur = 0; if ((sta >> step) & 1) cur++; int re
阅读全文