01 2016 档案

摘要:数位DP。dp[i][j][k]表示有i位,首位为j,有k个1的二进制数字有几个。 很容易写出递推式: dp[i][0][k]+=dp[i-1][0][k]; dp[i][0][k]+=dp[i-1][1][k]; dp[i][1][k]+=dp[i-1][0][k-1]; dp[i][1][k]+ 阅读全文
posted @ 2016-01-29 23:03 Fighting_Heart 编辑
摘要:简单DP。dp[i][j]表示完成第i段,有j体力的情况下,获得的最小时间, 然后就可以递推: //高速跑 if(j-s[i].f1>=0) dp[i][j-s[i].f1]=min(dp[i][j-s[i].f1],dp[i-1][j]+s[i].t1); //中速跑 dp[i][j]=min(d 阅读全文
posted @ 2016-01-29 20:47 Fighting_Heart 编辑
摘要:网络流,Dinic G++ 964ms水过,SAP 620ms AC 源点到每一个防晒霜建边,容量为cover[i]; 每一个防晒霜与它能保护的奶牛之间连一条边,容量为1; 每一个奶牛连到汇点一条边,容量为1。 最大流就是答案。 Dinic模板: #include<cstdio> #include< 阅读全文
posted @ 2016-01-29 15:26 Fighting_Heart 编辑
摘要:数位DP,题意转换一下就是说,其B进制表示的各位数字都只能是0和1。 求区间L....R之间的符合要求数字有几个,可以使用容斥原理。 计算小于X的符合要求的数有几个的时候,我们需要先找到比X小的最大的符合要求的数字,然后以这个数字往下推导,和之前做的数位DP方法一样了。 dp[i][j][k]表示的 阅读全文
posted @ 2016-01-29 11:02 Fighting_Heart 编辑
摘要:数位DP dp[i][j][k][m]表示最高位为i,数字j在首位,之前是否出现过13,余数是m的情况下的个数 代码有详细注释,做完这题,感觉逐渐了解了数位DP #include <iostream> #include <cstdio> #include <cstdlib> #include <cs 阅读全文
posted @ 2016-01-28 18:35 Fighting_Heart 编辑
摘要:数位DP #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <cma 阅读全文
posted @ 2016-01-28 14:48 Fighting_Heart 编辑
摘要:数位DP #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <cma 阅读全文
posted @ 2016-01-27 22:58 Fighting_Heart 编辑
摘要:简单模拟 阅读全文
posted @ 2016-01-27 20:02 Fighting_Heart 编辑
摘要:先从衣服处理到裤子,在从裤子处理到鞋子 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <vector 阅读全文
posted @ 2016-01-27 20:01 Fighting_Heart 编辑
摘要:水题。。。但是研究了半天 最后发现是这样排序的,两个项目进行排序,哪一个代价小,哪一个放前面 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #inclu 阅读全文
posted @ 2016-01-27 20:00 Fighting_Heart 编辑
摘要:刚学的数位DP。 dp[i][j]表示,长度为i的数字,并且最高位为j的情况下的吉利的数字有几个 很显然dp[i][j]是由dp[i-1][0,1,2,3,.....9]推导而来的 处理出dp数组之后,我们能在o(1)效率内得到比某个数字小的吉利数有几个,然后容斥原理一减就是答案 #include 阅读全文
posted @ 2016-01-27 10:36 Fighting_Heart 编辑
摘要:这题本身并不难,但是给我的深深的教训就是——尽量少用STL!!!。我用map出事情了。#include #include #include #include #include #include #include #include #include #include using namespace s... 阅读全文
posted @ 2016-01-26 21:59 Fighting_Heart 编辑
摘要:水题。题目这样定义的,另f(x)为x有几位,x[i]=f(x[i-1]);求最小的i使得x[i]==x[i-1]#include#include#include#include#includeusing namespace std;char s[1000000+10];int x[1000000+1... 阅读全文
posted @ 2016-01-26 17:25 Fighting_Heart 编辑
摘要:求二分图的最小点覆盖集,并输出 对于每一个a[i][j]=1,我们从行i-->列j建立一条边 显然,这张图是一张二分图。左边的节点代表删除哪一行,右边的节点代表删除哪一列。中间的边代表所有a[i][j]为1的点。 现在,我们需要做的事情就是找出最少的点,使这些点覆盖住所有的边(即删去哪几行哪几列,没 阅读全文
posted @ 2016-01-26 16:56 Fighting_Heart 编辑
摘要:因为第一行和最后一行都是0,我们只需枚举最左边或最右边一列的01情况,即可得到整张表然后再检验表是否符合要求#include#include#include#include#include#include#includeusing namespace std;int T;int n,m;int a[... 阅读全文
posted @ 2016-01-25 22:28 Fighting_Heart 编辑
摘要:暴力搜索,据说精度卡的紧。。。但我是double过了的。#include#include#include#include#include#include#includeusing namespace std;const double eps=1e-8;int dir[4][2],t[4][2];do... 阅读全文
posted @ 2016-01-25 17:09 Fighting_Heart 编辑
摘要:暴力枚举#include#include#include#include#include#include#includeusing namespace std;int T,a,b,C;int main(){ scanf("%d",&T); while(T--) { s... 阅读全文
posted @ 2016-01-25 17:08 Fighting_Heart 编辑
摘要:#include#include#include#include#include#include#includeusing namespace std;int T,n;char s[20];long long a,b;int q1[20],q2[20];long long f(){ if(s[... 阅读全文
posted @ 2016-01-25 17:08 Fighting_Heart 编辑
摘要:统计一下 每两个1之间0的个数+1,把这些数字乘起来就可以。注意两个地方:会爆int,需要开long long。所有数字都是0的时候输出0。#include#include#include#include#include#include#includeusing namespace std;cons... 阅读全文
posted @ 2016-01-25 10:34 Fighting_Heart 编辑
摘要:C语言语法入门题#include#include#include#include#include#include#includeusing namespace std;int main(){ int x; scanf("%d",&x); int ans=x/5; if((x%... 阅读全文
posted @ 2016-01-25 10:14 Fighting_Heart 编辑
摘要:无脑暴力判断。#include#include#include#include#include#include#includeusing namespace std;struct point{ long long x; long long y;}p1,p2,p3;int main(){ ... 阅读全文
posted @ 2016-01-25 10:10 Fighting_Heart 编辑
摘要:无脑暴力题,算出所有点到圆心p1的距离的平方,从小到大排序。然后暴力枚举p1的半径的平方,计算剩余点中到p2的最大距离的平方,枚举过程中记录答案#include#include#include#include#include#include#includeusing namespace std;co... 阅读全文
posted @ 2016-01-25 10:09 Fighting_Heart 编辑
摘要:先判断是不是N多边形,求一下凸包,如果所有点都用上了,那么就是凸多边形判断圆是否在多边形内,先排除圆心在多边形外的情况剩下的情况可以利用圆心到每条边的最短距离与半径的大小来判断#include#include#include#include#include#include#includeusing ... 阅读全文
posted @ 2016-01-24 21:00 Fighting_Heart 编辑
摘要:判断两个多边形是否相交,只需判断边是否有相交。编码量有点大,不过思路挺简单的。#include#include#include#include#include#include#include#include#includeusing namespace std;string s;struct poi... 阅读全文
posted @ 2016-01-24 14:08 Fighting_Heart 编辑
摘要:枚举两个点作为光线,计算最远的点即可可以把管子一段一段分开来看,计算光线是否在每一段管子内,某一段内出界了,那么算交点坐标注意判断光线不能进入第一个管子#include#include#include#include#include#include#includeusing namespace st... 阅读全文
posted @ 2016-01-24 11:01 Fighting_Heart 编辑
摘要:极角排序每次选择一个最外围的没选过的点,选择的时候需要利用极角排序进行选择#include#include#include#include#include#include#includeusing namespace std;const double eps=1e-8;struct point{ ... 阅读全文
posted @ 2016-01-23 22:45 Fighting_Heart 编辑
摘要:判断直线与线段相交#include#include#include#include#include#include#includeusing namespace std;int T,n;int tot;struct point{ double x; double y;} p[200+10... 阅读全文
posted @ 2016-01-23 16:37 Fighting_Heart 编辑
摘要:一个对精度要求比较高的题。如果两个线段没交点,那么肯定是0。有交点也不一定就有水,水可以进不来。最后答案要加一个eps,防止出现-0.00的答案#include#include#include#include#include#include#includeusing namespace std;st... 阅读全文
posted @ 2016-01-23 13:28 Fighting_Heart 编辑
摘要:不包括端点和部分重合const double eps=1e-8;double xmult(point p1,point p2,point p0){ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}int opposite_side... 阅读全文
posted @ 2016-01-23 09:57 Fighting_Heart 编辑
摘要:和矩形某一条边相交,则输出T在内部,则输出T题目描述不对,后台数据的矩形坐标不保证是左上角和右下角,也可能是左下角和右上角,所以预先处理一下。#include#include#include#include#include#include#includeusing namespace std;int... 阅读全文
posted @ 2016-01-23 09:56 Fighting_Heart 编辑
摘要:计算几何,判断线段相交注意题目中的一句话:You may assume that there are no more than 1000 top sticks.我认为是没有描述清楚的,如果不是每次扔完都保证不超过1000,此题很难做吧。如果每次扔完保证小于1000根在顶部,那么暴力即可。开一个vec... 阅读全文
posted @ 2016-01-22 22:20 Fighting_Heart 编辑
摘要:计算几何+最短路枚举线段是否相交建图,然后跑最短路#include#include#include#include#include#includeusing namespace std;const int maxn=1000+10;const double eps=1e-8;int n;int to... 阅读全文
posted @ 2016-01-22 20:11 Fighting_Heart 编辑
摘要:线段树+位运算首先对树进行DFS,写出DFS序列,记录下每一个节点控制的区间范围。然后就是区间更新和区间查询了。某段区间的颜色种类可以用位运算来表示,方便计算。如果仅有第i种颜色,那么就用十进制数(1#include#include#include#include#include#include#i... 阅读全文
posted @ 2016-01-22 14:38 Fighting_Heart 编辑
摘要:水题,每当出现重复就分割开来,最后留下的尾巴给最后一段#include#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=3*100000+10;mapm... 阅读全文
posted @ 2016-01-22 14:36 Fighting_Heart 编辑
摘要:水题#include#include#include#include#include#include#include#includeusing namespace std;int x[20];int main(){ int a,b; int ans=0; x[0]=6; x[... 阅读全文
posted @ 2016-01-22 14:34 Fighting_Heart 编辑
摘要:水题#include#include#include#include#include#include#include#includeusing namespace std;int sx,sy;int ex,ey;int main(){ scanf("%d%d",&sx,&sy); sca... 阅读全文
posted @ 2016-01-22 14:33 Fighting_Heart 编辑
摘要:简单细节题。输出的时候%.2lf C++能过,G++过不了。改成%.2f G++才能过......#include#include#include#include#include#include#include#includeusing namespace std;struct J{ int ... 阅读全文
posted @ 2016-01-22 09:28 Fighting_Heart 编辑
摘要:感觉此题略难。。。。。。背包问题。据说有一种二维DP的写法是错的。亲测,背包做法无误。dp[i][j][k]表示前i个物品,选择j个,差值为k的情况下获得的最大总和dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][k-差]+和)即第i个物品用或者不用。DP完成之后... 阅读全文
posted @ 2016-01-21 17:42 Fighting_Heart 编辑
摘要:好难。。。想了半天,用了类似于POJ 3186那样的DP写了一发,结果WA(其实写的时候也觉得过不了的。。。。)结果看了别人的题解报告,发现真的有点难想到。。。。。。首先要知道一个结论:构造好之后最优解的数组中的每一个数字肯定在原数组中能找到dp[i][j] 以第i个数字结尾,第i个数字用第j小的数... 阅读全文
posted @ 2016-01-21 09:45 Fighting_Heart 编辑
摘要:简单二维dp。o(n^3)效率过的。不知道有没有o(n^2)的解法。为了方便点,先左右交换一下。dp[i][j]表示以[i,j]为左上角的最大对称矩阵长度那么dp[i][j]=min(Max,dp[i+1][j+1])+1;其中Max是以[i,j]为起点,i这一行和j这一列最长公共前缀的长度#inc... 阅读全文
posted @ 2016-01-20 13:51 Fighting_Heart 编辑
摘要:简单DP因为一定是小的数字推到大的数字,所以排序,转化成线性的DP#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=100+10;int a[maxn]... 阅读全文
posted @ 2016-01-20 10:37 Fighting_Heart 编辑
摘要:简单DP,每一条线段记录两个值,到左端点最少时间与到又端点最少时间。按照这个往后推导。#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=1000+10;... 阅读全文
posted @ 2016-01-20 08:55 Fighting_Heart 编辑
摘要:简单DPdp[i][j]表示的是i到j这段区间获得的a[i]*(j-i)+... ...+a[j-1]*(n-1)+a[j]*n最大值那么[i,j]这个区间的最大值肯定是由[i+1,j]与[i,j-1]区间加上端点的较大值推过来的。#include#include#include#include#i... 阅读全文
posted @ 2016-01-19 21:28 Fighting_Heart 编辑
摘要:排序+枚举+二分最大的那些变成A,小的那部分提高最小值#include#include#include#includeusing namespace std;const int maxn=100000+10;int n;long long A,cf,cm,m;struct X{ long lo... 阅读全文
posted @ 2016-01-19 12:33 Fighting_Heart 编辑
摘要:简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可#include#include#include#includeusing namespace std;const int maxn=100000+10;struct Point{ double x,y;} p[maxn];doubl... 阅读全文
posted @ 2016-01-19 12:31 Fighting_Heart 编辑
摘要:#include#include#include#include#include#include#include#includeusing namespace std;long long L,R,K;long long POW(long long m,long long n){ long lo... 阅读全文
posted @ 2016-01-19 12:30 Fighting_Heart 编辑
摘要:#include #include #include #include #include using namespace std;int flag;char s[100000+10];int zero;char q[100000+10];bool Perfect(){ int len=strl... 阅读全文
posted @ 2016-01-19 12:30 Fighting_Heart 编辑
摘要:简单DP,感觉就是最长上升子序列的变形#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=1000+10;struct X{ int St,En,E... 阅读全文
posted @ 2016-01-18 20:40 Fighting_Heart 编辑
摘要:好难想到... ... 状态压缩DP,写的较搓#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=15;string CMP[40000];struct ... 阅读全文
posted @ 2016-01-18 18:39 Fighting_Heart 编辑
摘要:简单DP,最长上升子序列。先对W排序,然后对S做做LIS#include#include#include#include#include#includeusing namespace std;const int maxn=10000+10;struct X{ int w,s; int i... 阅读全文
posted @ 2016-01-18 13:25 Fighting_Heart 编辑
摘要:最长上升子序列#include#include#include#includeusing namespace std;const int maxn=1000+10;int a[maxn];int dp[maxn];int n;int main(){ while(~scanf("%d",&n))... 阅读全文
posted @ 2016-01-17 21:15 Fighting_Heart 编辑
摘要:最长公共子序列#include#include#include#includeusing namespace std;const int maxn=1000+10;int a[maxn],b[maxn];int dp[maxn][maxn];char s[maxn];int main(){ w... 阅读全文
posted @ 2016-01-17 21:09 Fighting_Heart 编辑
摘要:dp[i]表示到i这个人所用的最少时间状态转移方程dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);最后转换一下时间就可以了,当小时大于等于12的时候显示pm,其余显示am#include#include#include#includeusing namespace st... 阅读全文
posted @ 2016-01-17 20:53 Fighting_Heart 编辑
摘要:可以说想了好多时间。。。但是最终还是想出来了。。。感觉是DAG上的DP,dp[i][j]表示到第i分钟,第j个位置最多能接的数量。dp[i][j]有三个来源:状态转移方程:dp[i][j]=dp[i][j]+max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]) ;#in... 阅读全文
posted @ 2016-01-17 19:55 Fighting_Heart 编辑
摘要:好难。。看了kuangbin大神的博客讲解才会。。自己写的时候又写了好久。。。#include#include#include#includeusing namespace std;const int maxn=1000000+10;int a[maxn],b[maxn];int c[maxn];i... 阅读全文
posted @ 2016-01-17 16:47 Fighting_Heart 编辑
摘要:简单DP,最长上升子序列变形#include#include#include#includeusing namespace std;const int maxn=1000+10;int a[maxn];int dp[maxn];int n;int main(){ while(~scanf("%... 阅读全文
posted @ 2016-01-17 13:07 Fighting_Heart 编辑
摘要:简单dp#include#include#include#includeusing namespace std;const int maxn=1000;int a[maxn];int b[maxn];int n;int ans;int main(){ while(~scanf("%d",&n)... 阅读全文
posted @ 2016-01-17 11:20 Fighting_Heart 编辑
摘要:最长上升序列变形#include#include#include#includeusing namespace std;const int maxn=1000;struct X{ int x,y,z;} s[maxn];int n,tot;int dp[maxn];bool cmp(const... 阅读全文
posted @ 2016-01-17 11:09 Fighting_Heart 编辑
摘要:BFS。#include#include#include#include#include#include#includeusing namespace std;int n,m,k;struct Node{ int nowN; int tot; string op; Node(... 阅读全文
posted @ 2016-01-15 08:53 Fighting_Heart 编辑
摘要:先预处理出所有连通块,对于每一个*,看他四周的连通块即可#include#include#include#includeusing namespace std;const int maxn=1000+10;char s[maxn][maxn];int Map[maxn][maxn];int n,m;... 阅读全文
posted @ 2016-01-14 14:57 Fighting_Heart 编辑
摘要:用队列维护一下即可#include#include#include#includeusing namespace std;const int maxn=500000+10;int n,k;int a[maxn];int tot[1000000+10];struct Node{ int id; ... 阅读全文
posted @ 2016-01-14 14:57 Fighting_Heart 编辑
摘要:水题#include#include#includeusing namespace std;const int maxn=1000000+10;char s1[maxn],s2[maxn];int a[maxn],b[maxn];int lena,lenb;int c;int main(){ ... 阅读全文
posted @ 2016-01-14 14:55 Fighting_Heart 编辑
摘要:水题#include#include#includeusing namespace std;const int maxn=100+10;int a[maxn][maxn];int n,m;int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;... 阅读全文
posted @ 2016-01-14 14:55 Fighting_Heart 编辑
摘要:树状数组+离散化。把所有数字离散化到1--n,设离散化之后的数组为m[a[i]],对于主元,只有m[a[i]]==i的m[a[i]]才可能。然后要算m[a[i]]之前比m[a[i]]小的个数是否为m[a[i]]-1,如果是的,那么就是主元,利用树状数组可以在log(n)效率内运算前缀和或者更新单点。... 阅读全文
posted @ 2016-01-14 08:28 Fighting_Heart 编辑
摘要:n*n预处理。询问的时候用容斥,再删除边界。#include#include#include#includeusing namespace std;const int maxn=500+10;char s[maxn][maxn];int n,m;int q;int p[maxn][maxn];int... 阅读全文
posted @ 2016-01-02 09:43 Fighting_Heart 编辑
摘要:暴力搞#include#include#include#includeusing namespace std;long long a,b;long long tmpa,tmpb;long long num1[70],num2[70];int tot1,tot2;int main(){// fr... 阅读全文
posted @ 2016-01-02 09:42 Fighting_Heart 编辑
摘要:#include#include#include#includeusing namespace std;char num[1000];char s[1000];int week[10];int main(){ week[1]=1; week[2]=1; week[3]=1; ... 阅读全文
posted @ 2016-01-02 09:41 Fighting_Heart 编辑