Why I choose to be a graduate student from an undergraduate student? It’s time to applying for internships. Recalling this time last year, how I beg for an ideal job. A job means the way of life, not just a screw that change the world, not even a che…
[题意]公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地. [算法]贪心+堆 [题解]线段和点的贪心,一般有按左端点排序和按右端点排序两种方法. 按左端点排序,到达了终点就下车,人数满了就贪心地删掉当前终点最远的牛. 正确性在于,在对左一致的情况下,优先删除对右影响最大的牛. 本来以为很难实现,但是想清楚之后写起来十分顺畅,还是要有信心>< 对于到达终点下车,按终点维护小根堆. 对于满人数贪心删终点最大的,维护大根堆. 用标号vis和剩…
[题意]给定s个股票和d天,给出价格矩阵s*d,每天可以买入或卖出整数倍股票,初始资金m,求最大利益.m<=200000,s<=50,d<=10. [算法]完全背包 [题解]关键在于转化:第一天买入-第三天卖出,相当于,第一天买入-第二天卖出-第二天买入-第三天卖出.那么买卖股票就变成相邻两天的事情了. 对于每一天,就是完全背包,总重量为资金,重量为当天价格,价值为第二天价格-当天价格. f[i][j]表示前i个股票使用资金j能获得的最大收益. f[i][j]=f[i-1][j-A[i]…
[算法]数学置换 [题意]给定n个数,要求通过若干次交换两个数的操作得到排序后的状态,每次交换代价为两数之和,求最小代价. [题解] 考虑置换的定义:置换就是把n个数做一个全排列. 从原数组到排序数组的映射就是经典的置换,这样的置换一定能分解成循环的乘积. 为什么任意置换都可以这样分解:原数组的每个数要交换到排序位置(有后继),每个数的原位置会有数字来替代(有前驱),故一定构成若干循环节. 循环节内要完成置换,需要按顺序依次替换位置进行len-1次对换(len为循环节长度). 对于每一循环节内部…
[算法]动态规划 [题解]DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移. 最优化问题中DP往往占据重要地位. f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶牛改为哪个编号的方案全部记录了,转移可以保证最优. 正反各做一次. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ],a[maxn]; int main() { s…
[算法]计算几何 [题解]计算所有斜率排序去重. 实数判断相等用fabs(...)≤eps. ★斜率题一定要注意斜率不存在的情况!!! 其实我觉得这份代码可以hack的…… #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; ,inf=1e20; ; ,m=; double a[maxn]; int main() { scanf…
[算法]线段树(经典线段树上二分) [题意]n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号. [题解]关键在于找连续x个空房间,经典二分. 线段树标记sum,lsum,rsum,表示最长连续房间,从左开始最长连续房间,从右开始最长连续房间. 对于区间k,如果k.sum<x,则无解. 否则,如果l(k).sum>=x,则在左区间. 否则,如果l(k).rsum+r(k).lsum>=x,则在中间,那么l(k).r-l(k).rsum+1就是答…
[算法]DFS序+树状数组 [题解]题意相当于统计前i-1个点在第i个点的祖先的个数,显然可以用dfs维护,用树状数组差分维护前缀和. 出栈不新加节点就要注意左闭右开,即in[a[i]]处+1,ou[a[i]]+1处-1. 出栈新加节点就要注意数组开双倍. #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #define lowbit(x) x&(-x) u…
[算法]动态规划DP [题解] 题目要求不严格递增或不严格递减. 首先修改后的数字一定是原来出现过的数字,这样就可以离散化. f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数组,b表示原数组. f[i][j]=min(f[i-1][k])+abs(b[i]-a[j]) min部分优化,复杂度O(n^2). #include<cstdio> #include<algorithm> #include<cstring> using namespace…
[算法]分层图最短路 [题解] 考虑k层一模一样的图,然后每个夹层都在每条边的位置新加从上一层跨越到下一层的边权为0的边,这样至多选择k条边置为0. 然后考虑方便的写法. SPFA 第一次SPFA计算常规最短路(顶层). 之后k次SPFA,松弛操作加上可以从上一层节点直接获取最短路(即相当于省一条边) 这样可以保证一次SPFA最多只有一条边省略,因为你要么从上一层前一个点下来,其实是获取上一层前一个点的最短路. 要么从前面一个点过来,其实是获取本层的最短路,本层最短路最多从上面下来一次. 因为只…