05 2018 档案

摘要:就是套路咯,设s[i]为1+2+...i 首先列出dp方程\\( f[i]=min(f[j]+a[i]+(i j) i (s[i] s[j])) \\) 然后推一推 $$ f[i]=f[j]+a[i]+(i j) i (s[i] s[j]) $$ $$ f[i]=f[j]+a[i]+i i i j 阅读全文
posted @ 2018-05-31 11:33 lokiii 阅读(199) 评论(0) 推荐(0)
摘要:这个可以用异或高斯消元,但是~~我不会呀~~我用的暴搜 2的m次方枚举第一行的翻转情况,然后后面的就定了,因为对于一个j位置,如果i 1的j位置需要翻,那么一定要翻i的j,因为这是i 1的j最后翻的机会 按字典序搜索然后取次数min即可 cpp include include include inc 阅读全文
posted @ 2018-05-26 22:29 lokiii 阅读(154) 评论(0) 推荐(0)
摘要:我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和,st是t的前缀和: $$ f[i]=min(f[j]+s (sf[n] sf[j])+st[i] 阅读全文
posted @ 2018-05-26 11:55 lokiii 阅读(148) 评论(0) 推荐(0)
摘要:最大流生动形象的板子,注意数组开大点 cpp include include include include using namespace std; const int N=100,inf=1e9; int n=26,m,h[N],cnt=1,s=1,t=26,le[N],x; char s1[5 阅读全文
posted @ 2018-05-25 18:25 lokiii 阅读(159) 评论(0) 推荐(0)
摘要:首先O(n^3)的贪心很好想,就是枚举k然后从前往后扫,扫到反就翻转区间 然后考虑优化掉翻转区间维,就是搞成差分的形式,在翻转区间的尾部打上标记,再用一个变量维护当前的翻转次数,加到当前状态上来判断是否需要翻转即可 cpp include include include using namespac 阅读全文
posted @ 2018-05-25 18:09 lokiii 阅读(198) 评论(0) 推荐(0)
摘要:算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v] (1 p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可(记得输出大难的时候除以总概率和) cpp include include using namespa 阅读全文
posted @ 2018-05-25 17:09 lokiii 阅读(157) 评论(0) 推荐(0)
摘要:其实是可以斜率优化的但是没啥必要 设st为花费时间的前缀和,sf为Fi的前缀和,f[i]为分组到i的最小花费 然后枚举j转移,考虑每次转移都是把j到i分为一组这样意味着j及之后的都要增加s的时间,同时增加这段的结束时间/ F,取min即可 cpp include include using name 阅读全文
posted @ 2018-05-25 14:45 lokiii 阅读(282) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-05-17 18:54 lokiii 阅读(17) 评论(0) 推荐(0)
摘要:枚举建图.jpg 一开始建的图挂了,于是枚举了几种建图方式…… 因为要删点,所以拆点,连接(i,i',1),对于原来图上的边(u,v),连接(u',v,inf),(v',u,inf),然后连接(s,i',inf),对于不能和1相连的点x,建边(x,t,inf) 跑dinic即可 原因的话,~~枚举出 阅读全文
posted @ 2018-05-09 21:18 lokiii 阅读(135) 评论(0) 推荐(0)
摘要:我%&&……&()&%????? 双模hashWA,unsigned long longAC,而且必须判断hash出来的数不能为0???? 我可能学了假的hash 这个题求个前缀和,然后目标是找到距离当前位置最远,且能使这两个数组差分后2—k位相同 hash把差分后数组的2到k位压起来即可,用map 阅读全文
posted @ 2018-05-09 19:37 lokiii 阅读(179) 评论(0) 推荐(0)
摘要:几乎是板子,求有几个size 1的scc 直接tarjan即可 cpp include include include using namespace std; const int N=10005; int n,m,h[N],cnt,ans,tmp,dfn[N],low[N],s[N],top; b 阅读全文
posted @ 2018-05-09 17:32 lokiii 阅读(171) 评论(0) 推荐(0)
摘要:满脑子组合数学,根本没想到dp 设f[i][j]为前i只蚂蚁,选出j只的方案数,初始状态为f[0][0]=1 转移为 $$ f[i][j]=\sum_{k=0}^{a[i]}f[i 1][j k] $$ $$ f[i][j]=\sum_{k=max(j a[i],0)}^{j}f[i 1][k] $ 阅读全文
posted @ 2018-05-09 17:26 lokiii 阅读(112) 评论(0) 推荐(0)
摘要:按左端点排序,贪心的选即可 cpp include include include using namespace std; const int N=10005; int n,l,p,ans; struct qwe { int x,y; }a[N]; bool cmp(const qwe &a,co 阅读全文
posted @ 2018-05-09 16:10 lokiii 阅读(113) 评论(0) 推荐(0)
摘要:二分答案,贪心判定 阅读全文
posted @ 2018-05-09 15:40 lokiii 阅读(117) 评论(0) 推荐(0)
摘要:用单调递减的栈从后往前扫一遍即可 cpp include include using namespace std; const int N=1000005; int n,s[N],top,a[N],ans[N]; int read() { int r=0,f=1; char p=getchar(); 阅读全文
posted @ 2018-05-09 15:01 lokiii 阅读(142) 评论(0) 推荐(0)
摘要:裸的区间dp,设f[i][j]为区间(i,j)的答案,转移是f[i][j]=max(f[i+1][j]+a[i]\(n j+i),f[i][j 1]+a[j]\ (n j+i)); cpp include include using namespace std; const int N=2005; 阅读全文
posted @ 2018-05-09 14:50 lokiii 阅读(125) 评论(0) 推荐(0)
摘要:首先来分析一下,这是一张无向图,要求没有两条路联通的点对个数 有两条路连通,无向图,也就是说,问题转化为不在一个点双连通分量里的点对个数 tarjan即可,和求scc还不太一样…… cpp include include using namespace std; const int N=5005; 阅读全文
posted @ 2018-05-09 14:40 lokiii 阅读(138) 评论(0) 推荐(0)
摘要:居然要用高精度! 懒得operator了,转移是裸的完全背包 cpp include include using namespace std; int n,k,f[1005][45]; int read() { int r=0,f=1; char p=getchar(); while(p '9'|| 阅读全文
posted @ 2018-05-09 11:56 lokiii 阅读(208) 评论(0) 推荐(0)
摘要:这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 cpp include include include include using namespace std; const 阅读全文
posted @ 2018-05-09 11:46 lokiii 阅读(137) 评论(0) 推荐(0)
摘要:好久没写kmp都不会写了…… 开两个栈,s存当前串,c存匹配位置 用t串在栈s上匹配,栈每次入栈一个原串字符,用t串匹配一下,如果栈s末尾匹配了t则弹栈 cpp include include include using namespace std; const int N=1000005; int 阅读全文
posted @ 2018-05-09 10:49 lokiii 阅读(114) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/mars_ch/article/details/53011234 我背包真是好不熟练啊…… 第一天买了第三天卖相当于第一天买了第二天卖第二天再买第三天再卖。所以问题转化成完全背包,每天转移即可 cpp include include include 阅读全文
posted @ 2018-05-09 09:13 lokiii 阅读(214) 评论(0) 推荐(0)
摘要:洛谷的数据毒啊 把(i,j,k)作为一个点spfa,表示点(i,j)朝向k方向,然后向四个方向转移即可 cpp include include include using namespace std; const int N=105,inf=1e9,dx[]={ 1,1,0,0},dy[]={0,0 阅读全文
posted @ 2018-05-09 08:24 lokiii 阅读(130) 评论(0) 推荐(0)
摘要:把关系变成有向边,稍微想一下就是要求在有向图中不能到达的点对个数,这个可以用Floyd传递闭包来做,但是n^3的复杂度跑不了1000 考虑bitset优化! 因为传递过程只会出现0和1,用bitset完全没问题,而且重要的是bitset可以进行位运算,一下转移一整行:如果j能到i,也能到i能到的所有 阅读全文
posted @ 2018-05-08 21:37 lokiii 阅读(122) 评论(0) 推荐(0)
摘要:把长度转成右端点,按右端点排升序,f[i]=max(f[j]&&r[j] include include using namespace std; const int N=100005; int n,t[N],f[N],ans; struct qwe { int l,r; }a[N]; bool c 阅读全文
posted @ 2018-05-08 21:26 lokiii 阅读(125) 评论(0) 推荐(0)
摘要:洛谷数据好强啊,普通spfa开o2都过不了,要加双端队列优化 因为是双向边,所以dis(u,v)=dis(v,u),所以分别以pa1和pa2为起点spfa一遍,表示pb pa1 pa2和pb pa2 pa1,取个min即可 cpp include include include using name 阅读全文
posted @ 2018-05-08 21:11 lokiii 阅读(138) 评论(0) 推荐(0)
摘要:因为是双向边,所以相当于两条到1的最短路和,先跑spfa然后直接处理询问即可 阅读全文
posted @ 2018-05-08 20:52 lokiii 阅读(156) 评论(0) 推荐(0)
摘要:二分图最大点覆盖模型,因为对于一个点(x,y)显然只要选x或者y就好了,于是连边,跑最大匹配=最大点覆盖(不会证) cpp include include using namespace std; const int N=10005,inf=1e9; int n,m,h[N],cnt,con,lk[ 阅读全文
posted @ 2018-05-08 20:20 lokiii 阅读(170) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-05-08 19:09 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:bzoj题面什么鬼啊…… 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi 1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即可 cpp include include include include using namesp 阅读全文
posted @ 2018-05-07 16:23 lokiii 阅读(128) 评论(0) 推荐(0)
摘要:设f[u][0/1]为u这个点不选/选,转移的时候从儿子转移,f[u][1]=sum(f[son][0])+1,f[u][0]=sum(max(f[son][0],f[e[i].to][1])) cpp include include using namespace std; const int N 阅读全文
posted @ 2018-05-07 15:24 lokiii 阅读(108) 评论(0) 推荐(0)
摘要:每个ai在最后sum中的值是本身值乘上组合数,按这个dfs一下即可 cpp include include using namespace std; int n,s,ans[15],c[20][20]; bool u[15],f=0; int dfs(int a,int b) { if(b==n) 阅读全文
posted @ 2018-05-07 14:58 lokiii 阅读(121) 评论(0) 推荐(0)
摘要:DAG上的dp 因为本身升序就是拓扑序,所以建出图来直接从1到ndp即可,设f[i][j]为到i花费了j cpp include include using namespace std; const int N=1005,inf=1e9+7; int n,m,b,h[N],cnt,f[N][N],a 阅读全文
posted @ 2018-05-07 14:45 lokiii 阅读(126) 评论(0) 推荐(0)
摘要:预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为 1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=min(f[i],f[i+strlen(b[j]+1)+g[i][j]]+g[i][j]) 也不是很难理 阅读全文
posted @ 2018-05-06 22:02 lokiii 阅读(167) 评论(0) 推荐(0)
摘要:只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从i到j的价格,长度从小到大枚举更新就行了 f[i][j]=min(f[i][j 1]+cost[s[ 阅读全文
posted @ 2018-05-06 21:25 lokiii 阅读(141) 评论(0) 推荐(0)
摘要:好久没写2 SAT了啊,还以为是网络流 设点x为选,x'为不选,因为一头牛至少要满足一个条件,所以对于牛条件的两个点,选了一个不符合的点,就要选另一个符合的点,这样连两条边 然后枚举所有议案的选和不选点,从当前枚举的点出发,dfs一遍,把经过的点都打上标记,然后判断当前枚举的点是否合法(没有一个议案 阅读全文
posted @ 2018-05-06 20:28 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:……这可能是早年Pascal盛行的时候考排序的吧居然还是Glod…… 阅读全文
posted @ 2018-05-06 17:54 lokiii 阅读(97) 评论(0) 推荐(0)
摘要:k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则ans++ cpp include include include using namespace s 阅读全文
posted @ 2018-05-06 17:49 lokiii 阅读(136) 评论(0) 推荐(0)
摘要:模拟即可,注意包含可以是不连续的 方便起见读入的时候全转成小写 cpp include include using namespace std; const int N=1005; int n,m,s1,s2,ans[N]; struct qwe { int len; char s[N]; }c[N 阅读全文
posted @ 2018-05-06 17:32 lokiii 阅读(176) 评论(0) 推荐(0)
摘要:高精乘法板子 然而WA了两次也是没救了 cpp include include include using namespace std; const int N=105; int la,lb,lc,a[N],b[N],c[N],tot; char ch[N]; int main() { scanf( 阅读全文
posted @ 2018-05-06 17:13 lokiii 阅读(123) 评论(0) 推荐(0)
摘要:震惊!记忆化搜索忘记返回map值调了半小时! 边(u,v)的经过次数是:能到u的牛数\ v到n的方案数。正反两次连边,dfs两次即可 cpp include include include using namespace std; const int N=5005,M=50005; int n,m, 阅读全文
posted @ 2018-05-06 16:35 lokiii 阅读(180) 评论(0) 推荐(0)
摘要:长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.html非常严谨的证明 阅读全文
posted @ 2018-05-06 15:12 lokiii 阅读(128) 评论(0) 推荐(0)
摘要:4维枚举平方小于10000的数,相加等于n则ans++ cpp include include using namespace std; const int N=105; int n,a[N],ans; int main() { scanf("%d",&n); for(int i=1;i 阅读全文
posted @ 2018-05-06 14:21 lokiii 阅读(109) 评论(0) 推荐(0)
摘要:唔不知道怎么说……大概核心是把矩阵快速幂的乘法部分变成了Floyd一样的东西,非常之神 首先把点离散一下,最多有200个,然后建立邻接矩阵,a[u][v]为(u,v)之间的距离,没路就是inf 然后注意重载乘号的部分,注意到这样乘一次就相当于把本来存了经过k条路的最短路的邻接矩阵变成存了经过k+1条 阅读全文
posted @ 2018-05-06 12:04 lokiii 阅读(164) 评论(0) 推荐(0)
摘要:洛谷上能过的最大流bzoj上T了……但是贪心做法明明在洛谷上比最大流要慢啊……如果是最大流的话就是裸题了吧 说一下贪心,就按照防晒霜排序,然后对每一个防晒霜选一头可以使用的且r最小的牛 就,没了。 贪心 阅读全文
posted @ 2018-05-06 11:09 lokiii 阅读(188) 评论(0) 推荐(0)
摘要:和March的那道不一样,只是非常单纯的带着贪心的dfs 首先一个点被隔断,与它相邻的所有点也会被隔断,打上删除标记,从1dfs即可 cpp include include using namespace std; const int N=30005,M=200005; int n,m,q,h[N] 阅读全文
posted @ 2018-05-06 09:31 lokiii 阅读(118) 评论(0) 推荐(0)
摘要:直接bfs即可,注意开double,还有驱动和终点的齿轮都在序列里,要把它们找出来= = cpp include include include include using namespace std; const int N=1505; int n,sx,sy,s,t,q[N],fr[N]; bo 阅读全文
posted @ 2018-05-05 21:47 lokiii 阅读(143) 评论(0) 推荐(0)
摘要:A\ K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis; A\ ,估价函数:g(已走过价值)是已走过的路长度,h(到终点价值估计)是到目的地的最短路,建 阅读全文
posted @ 2018-05-05 21:23 lokiii 阅读(214) 评论(0) 推荐(0)
摘要:设f[i]为i时刻最小花费 把牛按l升序排列,每头牛能用f[l[i] 1]+c[i]更新(l[i],r[i])的区间min,所以用线段树维护f,用排完序的每头牛来更新,最后查询E点即可 cpp include include include using namespace std; const in 阅读全文
posted @ 2018-05-05 20:43 lokiii 阅读(186) 评论(0) 推荐(0)
摘要:参考:http://hzwer.com/3917.html 好神啊 注意到如果分成n段,那么答案为n,所以每一段最大值为\\( \sqrt{n} \\) 先把相邻并且值相等的弃掉 设f[i]为到i的最小答案,b[j]表示的是从b[j]+1开始到i共有j个不同的数字,p[a[i]]表示a[i]上次出现 阅读全文
posted @ 2018-05-05 18:03 lokiii 阅读(229) 评论(0) 推荐(0)
摘要:不是严格小于是小于等于啊!!!!!不是严格小于是小于等于啊!!!!!不是严格小于是小于等于啊!!!!! 是我看不懂人话还是翻译不说人话= = 把所有格子按值排个序,bfs扩展打标记即可 cpp include include include include using namespace std; 阅读全文
posted @ 2018-05-05 16:41 lokiii 阅读(127) 评论(0) 推荐(0)
摘要:至今都不知道置换群是个什么东西……题解说什么就是什么.jpg 以下来自hzwer:http://hzwer.com/3905.html cpp include include include using namespace std; const int N=10005; int n,w[N],a[N 阅读全文
posted @ 2018-05-05 15:56 lokiii 阅读(206) 评论(0) 推荐(0)
摘要:对这个奇形怪状的图tarjan,然后重新连边把图变成DAG,然后记忆化搜索即可 cpp include include using namespace std; const int N=100005; int n,a[N],h[N],cnt,dfn[N],low[N],tot,s[N],top,bl 阅读全文
posted @ 2018-05-05 14:44 lokiii 阅读(150) 评论(0) 推荐(0)
摘要:从小到大排个序,然后能选就选 阅读全文
posted @ 2018-05-05 11:48 lokiii 阅读(154) 评论(0) 推荐(0)
摘要:s[i]为差分后的“i这头牛前有几头比它高”,计算答案的时候加成前缀和,假设第一头最高减一下即可 用map记录一下被加过的区间,避免重复 cpp include include include include using namespace std; const int N=10005; int n 阅读全文
posted @ 2018-05-05 11:40 lokiii 阅读(184) 评论(0) 推荐(0)
摘要:c[x][y]为从(x,y)到(n,m)的最大值,记忆化一下 有个剪枝是因为y只能+1所以当n x m y时就算x也一直+1也是走不到(n,m)的,直接返回0即可 cpp include include using namespace std; const int N=105,dx[]={ 1,0, 阅读全文
posted @ 2018-05-05 11:24 lokiii 阅读(181) 评论(0) 推荐(0)
摘要:二分答案,把边权小于mid的边的两端点都并起来,看最后是否只剩一个联通块 阅读全文
posted @ 2018-05-05 10:59 lokiii 阅读(109) 评论(0) 推荐(0)
摘要:参考:https://www.cnblogs.com/N C Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算…… 贪心是错的,对拍出好多异常情况 s[i]为前缀和,从顶向下dp;设f[i]为本层宽度,g[i]为这 阅读全文
posted @ 2018-05-05 10:39 lokiii 阅读(123) 评论(0) 推荐(0)
摘要:参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x y),距离就变成了max(x',y'); 先按x排序,维护两个指针,指针内区间的x差总是 include include include using namespace 阅读全文
posted @ 2018-05-05 09:07 lokiii 阅读(146) 评论(0) 推荐(0)
摘要:还以为是dp呢 首先默认答案是n 对于一个影子,如果前边的影子比它高则可以归进前面的影子,高处的一段单算; 和他一样高的话就不用单算了,ans ; 否则入栈 阅读全文
posted @ 2018-05-04 21:56 lokiii 阅读(137) 评论(0) 推荐(0)
摘要:我是怎么想出来的…… 把种族为0的都变成 1,按位置x排升序之后,s[i]表示种族前缀和,想要取(l,r)的话就要\\( s[r] s[l 1]==0 s[r]==s[l 1] \\),用一个map存每个s[i]最早出现的牛的下一个牛的位置,然后每次取到一个s[i],如果mp[s[i]]!=0,则用 阅读全文
posted @ 2018-05-04 21:40 lokiii 阅读(107) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/u010336344/article/details/53034372 神一样的线段树 线段树上维护:ll从左开始最长空段;rr从右开始最长空段;len区间中最长空段;tg: 1不全是空的,0区间内全是空的,1区间内全是满的;lz下传标记: 1没标记 阅读全文
posted @ 2018-05-04 21:12 lokiii 阅读(203) 评论(0) 推荐(0)
摘要:脑子一抽写了个堆,发现不对才想起来最值用二分 然后判断的时候贪心的把不合mid的区间打通,看打通次数是否小于等于m即可 阅读全文
posted @ 2018-05-04 16:52 lokiii 阅读(141) 评论(0) 推荐(0)
摘要:高端贪心,好久没写splay调了好久…… 以下v为价格,w为鲜嫩度 把牛和草都按v排升序,扫草,首先把v小于等于当前草的牛都丢进splay,这样一来splay里全是可选的牛了,按w排序,然后贪心的为当前的草取牛:w小于等于当前草的w的牛,取出来删除,ans加上当前草的价格(没有则跳过) 取牛的时候统 阅读全文
posted @ 2018-05-04 16:34 lokiii 阅读(183) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/qq_34564984/article/details/53843777 可能背了假的板子…… 对于每个灯建立方程:与它相邻的灯的开关次数的异或和为1 异或高斯消元,然后dfs,遇到自由元就分两种情况走,答案取max,加上最优性剪枝 cpp incl 阅读全文
posted @ 2018-05-04 11:17 lokiii 阅读(156) 评论(0) 推荐(0)
摘要:从每个奶牛所在草场dfs,把沿途dfs到的草场的con都+1,最后符合条件的草场就是con==k的,扫一遍统计一下即可 cpp include include using namespace std; const int K=105,N=1005; int k,n,m,p[K],h[N],cnt,c 阅读全文
posted @ 2018-05-04 10:12 lokiii 阅读(153) 评论(0) 推荐(0)
摘要:先跑一遍取max版的Floyd,直接用数组回答询问即可 cpp include include using namespace std; const int N=305,inf=1e9; int n,m,q,a[N][N]; int read() { int r=0,f=1; char p=getc 阅读全文
posted @ 2018-05-04 09:59 lokiii 阅读(175) 评论(0) 推荐(0)
摘要:考虑每头牛到达之后的影响,u到达之后,从1到其子树内的点需要放慢的都多了一个,p为u子树内点的牛ans会加1 用线段树维护dfs序,每次修改子树区间,答案直接单点查询p即可 cpp include include using namespace std; const int N=100005; in 阅读全文
posted @ 2018-05-04 09:50 lokiii 阅读(127) 评论(0) 推荐(0)
摘要:凸包模板 cpp include include include include using namespace std; const int N=5005; int n,w,top; struct dian { double x,y; dian(double X=0,double Y=0) { x 阅读全文
posted @ 2018-05-04 09:22 lokiii 阅读(99) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/cgh_andy/article/details/52506738 没有get到什么重点的dp……做的莫名其妙 注意滑雪一个坡可以滑很多次 设f[i][j]为时间为i能力为j的最大滑雪次数,预处理l[i][j]为在i时获得j能力的最晚开始时间,w[i 阅读全文
posted @ 2018-05-04 08:27 lokiii 阅读(170) 评论(0) 推荐(0)
摘要:这不就是个n方dp吗……看了眼洛谷题解简直神仙打架 我全程没用到n…… 把休息时间并入产奶时间,注意“结束时间不挤奶”,所以ei=ei+r 1,注意这个 1! 然后按r排序,设f[i]为选i的最大收益,因为r是单调的所以直接从左到右扫一遍满足rj include include using name 阅读全文
posted @ 2018-05-03 21:15 lokiii 阅读(180) 评论(0) 推荐(0)
摘要:tag是假的,用了及其诡异的方法判负环 正权无向边和负权有向边的图 cpp include include include using namespace std; const int N=505,inf=210000000; int n,m,w,h[N],cnt,d[N]; struct qwe 阅读全文
posted @ 2018-05-03 20:36 lokiii 阅读(193) 评论(0) 推荐(0)
摘要:在洛谷上被卡了一个点开了O2才过= = bfs即可,为方便存储,把所有坐标+500 cpp include include include using namespace std; const int N=1005,dx[]={ 1,1,0,0},dy[]={0,0, 1,1}; int n,sx, 阅读全文
posted @ 2018-05-03 20:13 lokiii 阅读(151) 评论(0) 推荐(0)
摘要:dfs,如果一个点的儿子、本身、父亲都没有塔,就在父亲上建一个 原理不明…… cpp include include using namespace std; const int N=10005; int n,h[N],cnt,ans; bool v[N]; struct qwe { int ne, 阅读全文
posted @ 2018-05-03 19:58 lokiii 阅读(122) 评论(0) 推荐(0)
摘要:弗洛伊德之后按序列加起来即可 cpp include include include using namespace std; const int N=50005; int n,m,a[10001],d[101][101],ans; int read() { int r=0,f=1; char p= 阅读全文
posted @ 2018-05-03 19:36 lokiii 阅读(81) 评论(0) 推荐(0)
摘要:仿佛学到了贪心的新姿势…… 考虑相邻两头牛,交换它们对其他牛不产生影响,所以如果交换这两头牛能使这两头牛之间的最大值变小,则交换 阅读全文
posted @ 2018-05-03 19:26 lokiii 阅读(162) 评论(0) 推荐(0)
摘要:忘开long long了居然没WA 二分答案,枚举判断看最后需要的月份数是否小于等于要求的即可 阅读全文
posted @ 2018-05-03 17:55 lokiii 阅读(132) 评论(0) 推荐(0)
摘要:是时候复习一波背包了 完全背包裸题 cpp include include using namespace std; int m,n,a[30]; long long f[10005]; int main() { scanf("%d%d",&m,&n); for(int i=1;i 阅读全文
posted @ 2018-05-03 17:29 lokiii 阅读(146) 评论(0) 推荐(0)
摘要:不能用read会TLE!!不能用read会TLE!!不能用read会TLE!! 一开始以为要维护每个点,线段树写了好长(还T了…… 首先dfs一遍,求出点1为集会地点的答案,处理处val[u]为以1为根u子树点权和 然后从1带着当前点答案ans跑dfs,向儿子转移的时候就是带下去儿子的ans'就是a 阅读全文
posted @ 2018-05-03 17:13 lokiii 阅读(178) 评论(0) 推荐(0)
摘要:这几天写USACO水题脑子锈住了……上来就贪心,一交就WA 事实上这个是一个叫最短路树的东西,因为能保证只有一条最短路,所以所有最短路合起来是一棵以1为根的树,并且在这棵树上,每个点被精灵占据的路是它通向father的 先spfa把最短路dis[]和最短路树求出来,把被选入最短路树的边打上删除标记 阅读全文
posted @ 2018-05-03 15:18 lokiii 阅读(135) 评论(0) 推荐(0)
摘要:因为是单调不降或单调不升,所以所有的bi如果都是ai中出现过的一定不会变差 以递增为例,设f[i][j]为第j段选第i大的高度,预处理出s[i][j]表示选第i大的时,前j个 a与第i大的值的差的绝对值 的和。 转移显然是 $$ f[i][j]=min{f[i 1][k]+s[i][j] s[i][ 阅读全文
posted @ 2018-05-03 10:11 lokiii 阅读(104) 评论(0) 推荐(0)
摘要:按s从大到小排序,逆推时间模拟工作 阅读全文
posted @ 2018-05-03 07:58 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:因为交换相邻两头牛对其他牛没有影响,所以可以通过交换相邻两头来使答案变小。按照a.t b.f排降序,模拟着计算答案 cpp include include include using namespace std; const int N=100005; int n; long long ans,su 阅读全文
posted @ 2018-05-02 22:00 lokiii 阅读(175) 评论(0) 推荐(0)
摘要:压一维状态,转移时把符合条件的上一行加上 cpp include include using namespace std; const int N=5005,mod=1e9; int m,n,x,a[20],st[N],k,f[20][N],ans; int main() { scanf("%d%d 阅读全文
posted @ 2018-05-02 21:31 lokiii 阅读(109) 评论(0) 推荐(0)
摘要:这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便 先按起始时间从小到大排序。 我用的是greater重定义优先队列(小根堆)。用pair存牛棚用完时间(first)和牛棚编号(second),每次查看队首的first是否比当前牛的起始时间早,是则弹出队首记录当前牛的答案,再把新的pair放进去 阅读全文
posted @ 2018-05-02 21:19 lokiii 阅读(199) 评论(0) 推荐(0)
摘要:直接枚举两两牛之间的距离即可 cpp include include include using namespace std; const int N=10005; int n,a[N]; int read() { int r=0,f=1; char p=getchar(); while(p '9' 阅读全文
posted @ 2018-05-02 20:00 lokiii 阅读(139) 评论(0) 推荐(0)
摘要:把add传参里的double写成int我也是石乐志…… 首先这个东西长得就很01分数规划 然后我不会证为什么没有8字环,我们假装他没有 那么设len为环长 $$ ans \leq \frac{\sum_{i=1}^{len}f_i}{\sum_{i=1}^{len}t_i} $$ $$ ans \s 阅读全文
posted @ 2018-05-02 19:52 lokiii 阅读(143) 评论(0) 推荐(0)
摘要:设f[i]为i不选的最小损失,转移是f[i]=f[j]+e[i[(i j 1 include using namespace std; const int N=100005; int n,m,e[N],q[N],l,r; long long f[N],ans,mn=1e18; int read() 阅读全文
posted @ 2018-05-02 18:28 lokiii 阅读(152) 评论(0) 推荐(0)
摘要:至死不用dijskstra系列2333,洛谷上T了一个点,开了O2才过 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为0,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表 阅读全文
posted @ 2018-05-01 08:40 lokiii 阅读(134) 评论(0) 推荐(0)