![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
lightoj
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
Lightoj1577【数位DP】
题意: 求两字符串LCS的个数。 思路: LCS的状态转移应用吧,如果当前字符种类相同的,dp[pos1][pos2]肯定是最长的。 根据求LCS的DP状态转移回溯,如果枚举那些位置往前回溯肯定GG。 考虑对于两个字符串每个位置上的字符,枚举字符种类,那么如果当前字符种类相同的,dp[pos1][pos2]肯定是最长的,那么就可以往前再找。 所以预处理一下对于每个位置,每个字符之前离当前原创 2017-11-22 14:02:02 · 371 阅读 · 0 评论 -
Lightoj1083【单调栈】
#include #include #include #include #include using namespace std;typedef long long LL;const int N=5e4+10;struct asd{ LL pre; LL next; LL num;};int n;LL ww[N];int main(){原创 2016-11-21 20:12:24 · 438 阅读 · 0 评论 -
Lightoj 1082【RMQ】
这里很low地写了个线段树。。。#include using namespace std;typedef long long LL;const int N=1e5+10;struct SegT{ int left; int right; int w;};SegT q[N*4];void Build(int num,int L,int R){ q原创 2016-11-21 19:05:00 · 442 阅读 · 0 评论 -
lightoj 1422【区间DP·分类区间首元素的情况】
题意:给你n天分别要穿的衣服种类,可以套着穿,一旦脱下来就不能再穿,求n天至少要几件。思路:区间DPdp[i][j]代表i到j需要至少几件衣服第i天的衣服在第i天穿上了,dp[i][j]=dp[i+1][j]+1,枚举区间(i,j],如果有第k天的衣服=第i天的,考虑第i件衣服在在第i天没穿(因为穿上了,第k天还需要穿么?)dp[i][j]=dp[i+1,k-1]+原创 2016-12-14 20:27:48 · 371 阅读 · 0 评论 -
lightoj 1085【离散化+树状数组】
题意:求所有的上升子序列种数;思路:我想先离散化一下,然后用树状数组维护一下。最终答案就是sum(n) ?卧槽,好像是;然后就过了。。#include using namespace std;typedef long long LL;const LL mod=1000000007;const int N=1e5+10;LL arr[N],n;LL c[N*4]原创 2016-11-20 00:54:44 · 429 阅读 · 0 评论 -
Lightoj1084【DP啊DP】
题意:给你n个人的位置,每个人最多移动k个单位,然后在某点>=3人可以抱团,问你这n个人最少抱团数,只要有一个n不能抱团输出-1;思路:感觉又是超级超级狗血。。。。剪不断,理还乱。。。现对人的位置拍个序一开始想的是贪心,纯粹因为n1e5...,然后思路是对于每个位置搞一下,能延伸的最远距离,然后自然而然GG,位置没有办法。后面去想对于每个人,向两边延伸最长距离,然后状态原创 2016-12-02 09:44:21 · 282 阅读 · 0 评论 -
lightoj1066【BFS】
题意:就是按照A->B->C->D....去拿,求步数;思路:有一个注意点:如果碰到合法字母吃掉,那么下一步就可以吃了;有一种方法,就是我BFS最多26次,每次走个A->B,一步一步走;还有就是搞一个BFS,然后中间初始化一下就好了。这道题目深刻地理解BFS就是起点到终点的一个过程~(●'◡'●)也像走一步再走一步#include using namespace st原创 2016-11-30 23:27:41 · 369 阅读 · 0 评论 -
lightoj1062【几何(二分)】
其实就应该想到,哪有那么简单让你直接搞出答案的几何题啊;(而且很有可能是二分?题意:有两个梯子,一个靠在左边墙上,一个靠在右边墙上,长度分别为 x 和 y,他们的交点距离地面高度是 c,求两个梯子底部的距离。思路:二分底部距离,然后算C(通过相似三角形就好了,两个比值(C比梯子顶部到墙底的高度)相加是1),和C比较,很容易发现,底部距离一大,C就小,一小,C就大,满足单调性。原创 2016-12-02 00:11:12 · 411 阅读 · 0 评论 -
lightoj1145 【DP优化求方案】
题意:有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案;思路:dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案;显然dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j - 2] + ... + dp[i - 1][j - k];我们算 dp[i][j] 的时候,需要dp[i-1] 的前缀和已经打出来了我们求dp原创 2016-12-11 21:50:23 · 326 阅读 · 0 评论 -
lightoj 1099【dijkstra/BFS】
题意:求 1-N 的第二长路,一条路可以重复走if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path思路:一开始想的就是:我只要在spfa中更新的时候记录原创 2016-11-15 21:28:40 · 454 阅读 · 0 评论 -
Lightoj 1129【字典树】
#include using namespace std;const int N=1e5+10;//一共有n(10000)个串,每个串有10个数字struct Trie{ Trie* next[15]; int num;};Trie q[N];bool flag;int tol;Trie* Creat(){ Trie *p; p=&q[tol原创 2016-11-15 19:14:49 · 388 阅读 · 0 评论 -
lightoj 1089 【离散化+线段树】
题意:给你n个区间,然后给你m个i点问你这个点在几个所给定的区间里;思路:离散化+区间覆盖#include using namespace std;typedef long long LL;const int N=5e4+10;struct SegT{ int left,right; int val; int flag;};SegT q[N*1原创 2016-11-19 11:00:39 · 423 阅读 · 0 评论 -
lightoj 1088【树状数组+离散化】
题意:给你n个数,然后给你q个区间,然后问你这n个数有多少个在这个区间上;思路:树状数组搞搞,但是注意到数的范围很大,所以先离散化一下。初始化初始化!!!卧槽,wa的我好郁闷。。。#include using namespace std;typedef long long LL;const int N=2e5+10;int arr[N];int c[N*4];in原创 2016-11-18 20:32:12 · 438 阅读 · 0 评论 -
lightoj1087 【线段树】
题意:给你n个数,然后给你q个询问,有两种询问:a: 表示在右边插入一个数c:表示从左边拿出一个数,然后输出;思路:一开始在想,自己手上的黑科技:线段树和树状数组线段树上的操作:求区间最大,没说区间第几个啊;树状数组:搞一发前缀和,妈个鸡,树状数组还需要知道下标和位置;还有什么:数组,感觉黑科技没什么了;然后。。。线段树维护区间有多少个数,好像很原创 2016-11-18 19:39:43 · 467 阅读 · 0 评论 -
lightoj1064 【DP求方案】
题意:n个相同的骰子,问你掷出>=x点数的可能性;思路:dp[i][j]代表前 i 个骰子掷出 j 点数的方案数;然后卧槽,一开始想的是拆分搞。。。。。。其实这种就是个简单DP啊///#include using namespace std;typedef long long LL;typedef unsigned long long ULL;typed原创 2016-11-30 21:59:41 · 403 阅读 · 0 评论 -
lightoj1063【求割点】
题意不懂。。只知道求割点。贴一发我bin模板先。#include using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pairPII;const double eps=1e-5;const double pi=acos(-1.0);const int mod=1e9原创 2016-11-30 16:03:26 · 354 阅读 · 0 评论 -
Lightoj1081【500棵线段树维护】
#include using namespace std;typedef long long LL;const int N=5e2+10;const int INF=0x3f3f3f3f;struct SegT{ int left; int right; int w;};SegT q[N][N*4];int dp[N];int a[N][N];v原创 2016-11-21 21:04:34 · 372 阅读 · 0 评论 -
Lightoj 1147【DP】
题意:把n个人分成两部分,要你怎么分使得两部分尽可能相等;思路:如果我们把一部分人的重量达到离sum/2最近,那就一定行啊其实就是一条棒,两种不同的棒去拼接成一条棒,然后最好就是离mid最近,一定会得到这个值啊。然后搞出这个值,mid-x就是他们的最小差值。不就是一个0/1背包取或不取。然后wa了,人数相差不超过1个///后来肯定要维护人数啊,纯粹的+,dp[j]=dp原创 2016-12-12 18:52:50 · 589 阅读 · 0 评论 -
Lightoj1080 【线段树】
题意:给你一个0/1的数组,然后给你n段区间,说这个区间里要反转一次,然后给你Q个询问,问你这个位置是什么;思路:我们线段树维护一下就好了额;其实反转的话,还是算次数是不是,奇偶嘛;#include using namespace std;typedef long long LL;const int N=1e5+10;struct SegT{ int sum;原创 2016-11-23 01:58:38 · 372 阅读 · 0 评论 -
Lightoj1156【二分+贪心】
题意:略。 思路: 以为我这个思路是大众思路原来不是。。。百度了一下什么最大流(膜拜熟练应用最大流选手) 二分很显然对吧,然后我就想二分完DP嘛,好像不行,感觉怎么搞都是你已经把答案搞出来的感觉,所以二分显得没有意义,想想贪心吧~ 然后突然一想,其实你想啊,走回来和走过去是一样的对吧,无非就是有些不能一起走。那么我们先在起始位置(0)放两个人,然后一起往前走,首先肯定是走到一个能走的最远无约原创 2017-11-21 17:32:58 · 369 阅读 · 1 评论 -
Lightoj1147【二进制表状态】
思路: dp[ i ]表示价值i需要多少人。//#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#includ原创 2017-11-29 14:48:07 · 521 阅读 · 0 评论 -
lightoj刷题日记
yep.原创 2016-10-16 17:58:14 · 1047 阅读 · 0 评论 -
Lightoj 1119【状压DP】
题意: 有N个任务,对于每个任务给出N个花费,第 i 个花费指 这个任务执行之前已经完成了 i 任务的花费,求完成所有任务的最小花费。 思路: N <= 14 直接状压吧#include<bits/stdc++.h>using namespace std;typedef long long LL;/*题意:给出m个数,然后取n位数,保证相邻两个数的差值小于等于2,问有多少种这样的数原创 2017-07-18 20:47:31 · 419 阅读 · 0 评论 -
Lightoj 1138【二分 + 求 N! 的后导零个数】
怎么对于N求有多少后导零??? 因为每间隔 5 个数有一个数可以被 5 整除, 然后在这些可被 5 整除的数中, 每间隔 5 个数又有一个可以被 25 整除……一直到0然后知道了这个就可以直接二分求值; 二分类型:0000011111111 1: 代表num(x)>=num(mid)#include<bits/stdc++.h>using namespace std;typedef lon原创 2017-07-18 20:45:26 · 489 阅读 · 0 评论 -
Lightoj 1122【计数DP】
dp[ i ][ j ]: 前 i 位为第 j 个数字的方案; #include<bits/stdc++.h> using namespace std; typedef long long LL; int dp[15][15]; int a[15], n, m; int main(){ int T, cas = 1; sca原创 2017-07-18 20:41:48 · 514 阅读 · 0 评论 -
lightoj1191【DP】
0.5s时限,所以就预处理了(好像不预处理也能过,一开始用 cin/cout T掉的。dp[i][j][k][m] 代表 第 i 个数 是 第 j 个部分 第 k 个 约数条件 m 部分下的答案。然后切掉 m 这一维,拿ans[i][j][m]记录。1.产生新部分的首个,为前一部分所有方案和。 dp[i][j][1]=sigma(dp[i-1][j-1][2~min(m,i-1)]原创 2017-04-05 07:54:58 · 156 阅读 · 0 评论 -
Lightoj1028【计算约数个数】
思路:最终就是求一个数的约数(除了1)对吧.然后想要枚举sqrt(N)受阻,枚举素数数组受阻,加上prime[i]*prime[i]#include using namespace std;typedef long long LL;LL prime[1000100];bool IsPrime[1000100];int num;void init_prime(){原创 2017-03-06 20:36:27 · 603 阅读 · 0 评论 -
lightoj1010【规律】
思路:根据案例的规律其实已经猜的差不多了,answer=n*m/2;有一条边是1的情况,也很好判断,answer=n*m;就是有一条边是2的时候比较隐秘:是连续2*2一块可以填,然后2*2不填,没想出总结的公式,就直接模拟了。#includeusing namespace std;typedef unsigned long long ULL;typedef long long原创 2017-03-08 21:39:21 · 565 阅读 · 0 评论 -
lightoj1047 【简单线性DP】
因为写不出hdu3401...好像要用单调队列优化...这边水了一个...题意:给n个房子涂色,给出n个房子对应颜色的花费,问涂完所有颜色花费最少。保证相邻房子颜色不能相同。思路:dp[i][j] 表前i个房子,第i个房子是j颜色的最少花费;#includeusing namespace std;int dp[2][3];int a,b,c,n;int mai原创 2016-12-27 22:39:34 · 479 阅读 · 0 评论 -
Lightoj1122 【数位DP】
题意:给你m个数,让你在里面挑n个组合,保证位数相差不超过2,求能够组合多少种情况;思路:dp[i][j]代表第i个结尾为j的方案数。#includeusing namespace std;typedef long long LL;int dp[15][15];bool vis[15];int n,m;int main(){ int T,cas=1;原创 2016-12-19 18:01:59 · 97 阅读 · 0 评论 -
lightoj 1076 【二分找满足条件的最左】
#include using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pairPII;const double eps=1e-5;const double pi=acos(-1.0);const int INF=0x3f3f3f3f;const int N=1e3+10;原创 2016-11-25 15:35:20 · 284 阅读 · 0 评论 -
Lightoj 1067【逆元模板(求C(N,M))】
#include using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pairPII;const double eps=1e-5;const double pi=acos(-1.0);//const int mod=1e9+7;const int INF=0x3f3f3f3f原创 2016-11-25 14:14:54 · 504 阅读 · 0 评论 -
lightoj 1125【背包·从n个选m个】
题意:给你 n 个背包,然后给你两个数,D,M,问你从n个里面挑M个出来,有多少种方法能够整除D;思路:试想我先不挑M个出来的话,仅仅是构造一个D的倍数,其实就是构造一个数的话,其实就是个递推,然后方案的叠加挑M个,D的倍数。能对M个状压;但是对于D的倍数呢?其实就是取膜就好了,比如5的倍数,那么dp[个数][j]+=dp[个数-1][j-X];原创 2016-12-13 16:47:37 · 476 阅读 · 0 评论 -
lightoj 1078【同余定理】
题意:给你一个n和一个数 digit ,问你最少需要多少个 digit 使得整除于n;思路:同余定理(a+b)%n=(a%n+b%n)%n;(m%n+m%n*10+m%n*100+m%n*1000......)%n==0;temp=m%n;temp=(temp*10+m)%n=(10*m%n+m%n)%n;temp=(temp*10+m)%n=(10*10*m%n+10原创 2016-11-23 22:11:41 · 454 阅读 · 0 评论 -
lightoj 1027【数学概率】
#include using namespace std;typedef long long LL;const int N=1e2+10;int main(){ int T,cas=1,n,x; scanf("%d",&T); while(T--) { scanf("%d",&n); int up=0; i原创 2016-11-17 22:41:14 · 497 阅读 · 0 评论 -
Lightoj1093 【线段树】
题意:给出n个数,然后对于D区间的数求一个最大差值思路:区间最大最小。。。我居然没想到线段树。。。#include using namespace std;typedef long long LL;const int N=1e5+10;struct SegT{ int left; int right; int mid; int tmin,t原创 2016-11-17 21:19:47 · 391 阅读 · 0 评论 -
LightOJ 1022 【读题】
求阴影面积;犯了两个错误,漏看了两个条件。第一个wa:题面中PI说要取pi = 2 * acos (0.0) 第二个wa: For example, add 10-9 to your result.这些在比赛中都是输不起的;题面一旦大致懂了,要注重细节了,细节也会决定成败#include#include#include#include#include#in原创 2016-10-20 12:06:52 · 120 阅读 · 0 评论 -
Lightoj1015【基础题】
题意:计算输入数>0的所有和;思路:直接干。。。#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const LL mod=1e9+7;const int N=1e3+原创 2016-10-17 22:30:09 · 408 阅读 · 0 评论 -
Lightoj1014【基础题】
题意:有C个人,安排了P个吃的,每个人会吃Q个吃的,最后留下L个吃的;求所有可能的Q,从小到大输出,要保证Q>L;思路:其实就是求出P-L的所有数的约数,然后这个约数>L的话就满足;#include#include#include#include#include#include#include#includeusing namespace std;typedef原创 2016-10-17 22:28:19 · 390 阅读 · 0 评论 -
Lightoj1011【KM算法】
题意:问男孩女孩最大的可能值?其实就是一个二分图的最大权值匹配问题;模板题吧。。#include#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const LL mod=1e原创 2016-10-17 22:24:07 · 493 阅读 · 0 评论