51nod
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
51Nod 1076【无向图 判断是否同一环】
模板题:#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef pair<LL,LL>PII;const int nMax = 2e5+10;int n,m;int first[nMax],nxt[nMax],to[nMax],e;void addadge(int u,int v){ to[原创 2017-07-13 10:05:36 · 358 阅读 · 0 评论 -
51nod 1051【基础】
思路:找题4级做做。。。然后找了题最水的。。= =感动。。。居然是一下子【记】得了做法。。。dp一下,枚举列的起点和终点,然后求和这一段,然后对这一大列就是求个最大字段和;#include using namespace std;typedef long long LL;const int N=5e2+10;LL a[N][N];LL sum[N][N];LL te原创 2016-11-08 21:35:10 · 376 阅读 · 0 评论 -
51nod1179【思维】
题意: 给你n个数,求两两之间的最大GCD; 思路: n太大,然后感觉是分解质因子,但是感觉分解质因子还是搞不出谁和谁的GCD; 但是可以发现,GCD给了一个范围1e6,所以能不能枚举GCD,然后看看满不满足,这里在枚举的时候可以利用素数筛那个,直接枚举i的约数,之前把输入的数标记一下就好了;有两个就行;const int N=1E6+10;int flag[N];int main(){原创 2016-10-01 19:03:13 · 609 阅读 · 0 评论 -
51nod1414【思维】
思路: 直接可以枚举1-n,如果枚举到是n的约数i,那么暴力枚举起点,其余点用i累加就一定是正多边形。复杂度是(n*n的公约数个数(最多80));const int N=2e4+10;int a[N];int main(){ int n; int ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) {原创 2016-10-01 18:54:24 · 429 阅读 · 0 评论 -
51nod 1031+斐波那契和杨辉三角的一些基础知识
直接斐波那契。。。#include#include#include#include#includeusing namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const LL mod=1e9+7;LL a[1010];int main(){ a[1]=1; a[2]=2; f原创 2016-10-15 22:15:02 · 726 阅读 · 0 评论 -
51nod 1297
思路:搞个栈模拟一下,也才5w;直接wa1了。。然后想到井口如果都进不去那就。。。一定GG了。所以维护一下从井口到井底是非递增的就好了;#include #include #include #include #include #include using namespace std;stackq;int n,m;int main(){ int u,原创 2016-10-15 21:49:49 · 426 阅读 · 0 评论 -
51nod 1456【强连通,缩点,并查集】
话说这道题的机遇是看到了http://blog.csdn.net/u010885899/article/details/50611895很有意思;然后就去补了这题 题意: 建最少的边使得给出的点相连。 思路: 直观感觉,如果a->b,b->c,那么a->c就不用建了。 然后还有一种情况就是回路a->b->c->a,这样的话要有n条。 所以其实思路就是这样,弱连通的时候n个点就是+n-1条原创 2016-09-29 00:18:07 · 540 阅读 · 0 评论 -
51nod1459【二级最短路】
标签说的是BFS。。。 太菜,不知道怎么BFS。。。是不是spfa写,就叫BFS。。。感觉不是。。。。 只是二级最短路的写法,直接搞就很容易了,简单题;#include <bits/stdc++.h>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int N=5e2+10;int val[N];原创 2016-09-27 23:45:10 · 395 阅读 · 0 评论 -
51nod1640 【最小生成树】
题意: 在一副图中,搞N-1条边,使得每个点都相连, 有多种可能的情况,所以求一种使得其中n-1条边的最大是所有可能的最小,然后并保证连接的n-1条边的权值总和最大 思路: 一开始没有看清题意,随便写了一发“最大生成树”连案例都跑不出,原来还有个条件是有n-1条边中的最大值是所有可能的最小。 然后窝就纳闷了。。。怎么搞法搞到一条最大的最小,随便搞了个最小生成树,写着写着发现其实最小生成树里原创 2016-09-27 23:42:46 · 608 阅读 · 0 评论 -
51nod 1068【简单博弈】
思路手动打表,N1 : A出1 A胜;2 : A出2 A胜;3 : A只能出2的整数幂&&这个数4 : A只能出2的整数幂&&这个数5 : A只能出2的整数幂&&这个数6 : B胜(解释略);...最后会发现A不管怎么取也不会达到3的倍数,所以A赢两次后的第三次中,不可能取完以后,留给B是对方能赢(即A能赢)的阵式;原创 2016-10-23 19:36:53 · 481 阅读 · 0 评论 -
51nod 1021【区间DP】
思路:dp[ i ] [ j ]代表取[ i ,j ]区间石子的最小值,然后dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);#include #include #include #include #include using namespace std;const int INF=0x3f3f3f3f;c原创 2016-10-12 23:07:20 · 390 阅读 · 0 评论 -
51nod 1278【贪心】
主要这道题没有包含的情况,所以直接搞个左端,然后对于每个二分求一下>right的最近的位置j,那么ans就会增加 j 以后的;#include #include #include #include #include using namespace std;const int N=5e4+10;struct asd{ int x,y;};asd q[N];int n原创 2016-10-12 23:04:18 · 446 阅读 · 0 评论 -
51nod1212【最小生成树kruskal算法】
思路:利用破圈法。#include using namespace std;typedef long long LL;const int N=1e3+10;struct asd{ int x,y; int w;};asd q[N*50];int tol;int pre[N];bool cmp(asd a,asd b){ return a.w原创 2016-10-12 22:55:30 · 517 阅读 · 0 评论 -
51nod1181【素数筛】
思路:直接就是筛出素数,然后我很撒比的从那个地方往后for找一个位置也是质数的输出;#include using namespace std;typedef long long LL;const int N=1e6+10;bool IsPrime[N];int prime[N];int num;void init(){ num=0; memset(Is原创 2016-10-12 22:58:22 · 492 阅读 · 0 评论 -
51nod 1376【线段树维护区间最大值】
引自:wonter巨巨的博客定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度然后用线段树维护 dp[i]:每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大上升长度的方案数,这里再详细说下这篇题解。。。也是弱弱自己的理解吧。。。以1-n的值为线段树所代表的区间;然后依次更新,题目就是要找上升序列,那么我们只要每次查询0~arr[原创 2016-10-28 12:47:44 · 533 阅读 · 0 评论 -
51nod 1067【简单博弈】
卧槽,第一次自己推推推做出来的。。。对于1,那么就是A取完就好 --A对于2,只能是A拿一个 --B对于3和4,都是A拿完 --A对于5,靠向2,A取3,B只能1 --A对于6,A取一个的话,B就是5的情况,B赢,取3个的话,B就是3的情况,B赢,取4个的话,B就是2的情况,A赢,所以A;对于7,A取一个的话,B就是6的情况,B赢,取3个的话,B就是4的情况,B赢,取4个的原创 2016-10-20 12:59:30 · 451 阅读 · 0 评论 -
51nod 1011 【完全背包】
完全背包的变形;这些数字可以取多次,dp[i]代表前 i 物品组成N时的方案数。#include#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int mod=1e9+7;int w[13]={1,2,5,10原创 2016-10-29 22:29:48 · 430 阅读 · 0 评论 -
51nod1287【线段树+折半搜索】
思路:其实就是每次折半找一下对吧,但是要维护出一个区间最(大)值,所以套一个线段树就可以轻松解决了。#includeusing namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int N=5e4+10;struct asd{ int Left,Right; int val;原创 2017-04-26 23:07:13 · 483 阅读 · 0 评论 -
51nod 1405【DFS】
思路:对于结点 u 的子节点 v, 如果已经一直到结点 u 的答案ans[u],那么转移到对于结点 v,num[v] 为 v为根的树的结点个数,那么对于结点v的答案相对于结点u的答案来说,ans[v]=-num[v]*edge[u,v]+(n-num[v])*edge[u,v];//#include#include#include#includeusing name原创 2017-03-26 22:39:40 · 420 阅读 · 0 评论 -
51nod 1354【DP】
(我一定是A了一题假DP)给定序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时,有多少子序列所有元素乘起来恰好等于K。K思路:感觉 k 的 约数是突破口,首先个数 少。直接维护一个 到 i 的时候 各个约数 的 个数。(约数 类似 背包)。#includeusing namespace std;typedef long long LL;con原创 2017-03-29 23:15:59 · 463 阅读 · 0 评论 -
51nod1419 【数学】
思路:n考虑n>3:我们可以轻松证明n,n-1这两个数互质:设gcd(n,n-1)=g,n=g*k1,n-1=g*k2;n-(n-1)=g(k1-k2)=1;所以 g=1.当n,n-2互质就更好了,n*(n-1)*(n-2)最大呀。设gcd(n,n-2)=g,n=g*k1,n-2=g*k2;n-(n-2)=g(k1-k2)=2; 得g很好发现,g要么是1原创 2017-03-18 22:20:34 · 432 阅读 · 0 评论 -
51nod1117【贪心】
yep.原创 2017-02-25 17:00:36 · 501 阅读 · 0 评论 -
51nod 1276 【离线处理】
思路1.: 离线处理; 具体就是把岛屿离线然后按照高度排序,把query按照从高到低排序,然后每次query只要从最高的岛屿开始找起,判断条件:如果他旁边都是没有被找过的(也就是默认是海),那么数量+1,如果两边都是岛屿,那么数量-1,我们不需要判断一边是岛屿,一边是海没意义 思路2.: 还有一个可以在线算答案 具体: 具体找出峰值谷值,用两个数组存一下,排序。然后每次二分找一下,就可以原创 2016-08-31 23:42:39 · 327 阅读 · 0 评论 -
51nod 1449 砝码称重【天平/进制】
题意:给你w,n,问你在w^0,w^1,w^2...各种一个,问你能不能用这些砝码和重量为m的东西放在天平上使得天平平衡;思路:这个很容易联想到进制:如果把m放在是一边的话,其实对于砝码就是纯粹的相加,能不能被表示成这样一个进制,每个位上就是是0或1那么如果两边都要放呢?所以就是说我要怎么利用m和已拥有的,构造一个仅有01的进制数为什么这么说呢?因为是左边右边等价啊;原创 2016-11-28 16:44:57 · 567 阅读 · 0 评论 -
51nod 1013【快速幂+逆元】
等比式子:Sn=(a1-an*q)/(1-q)n很大,搞一发快速幂,除法不适用于取膜,逆元一下(利用费马小定理) 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。刚好在本道题目一样适用,mod=1e9+7就是质数,那么gcd也就是=1,OK,那么b*k=1 这个逆元就等于 a^(mod-2);#include #include #include原创 2016-11-02 19:03:08 · 479 阅读 · 0 评论 -
51nod 1099【贪心】
思路:我们可以思考对于仅仅两个元素来说,A,B;先选A的话是会 A.b+B.a;先选B的话是会 B.b+A.a;所以哪个小哪个就放前面;#include #include #include #include #include #include #include using namespace std;typedef long long LL;const原创 2016-11-01 20:56:10 · 423 阅读 · 0 评论 -
51nod 1049【经典】
自己模拟,全靠体会~~~#include #include #include #include #include using namespace std;typedef long long LL;const int N=5e4+10;LL a[N];int main(){ int n; scanf("%d",&n); for(int i=1原创 2016-10-31 21:48:54 · 527 阅读 · 0 评论 -
51nod 1102 【单调栈】
思路:对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w;利用单调栈就行了;#include #include #include #include #include using namespace std;typedef long long LL;const int N=5e4+10;struct asd{ LL pre; LL原创 2016-10-31 20:35:59 · 398 阅读 · 0 评论 -
51nod 1416【DFS】
思路:暴力整个图,以这个为起点,然后看一下有没有找到一条路是会指向自己且元素个数>=4;#include using namespace std;typedef long long LL;const int mod=1e9+7;const int N=55;char ma[N][N];bool vis[N][N];int n,m;int s,t;int flag;i原创 2016-10-30 22:33:44 · 391 阅读 · 0 评论 -
51nod 1003【数学】
思路: 2和5能构成0,然后就是看2和5因子组成个数,然而我们知道,1-n中2的因子数肯定>5的,所以我们只要求一下1-n中5的因子个数就好了。。。#include <stdio.h>#include <string.h>#include <iostream>using namespace std;typedef long long LL;//求1-n有x因子的个数,给出一个n;int ma原创 2016-08-31 23:33:24 · 470 阅读 · 0 评论 -
51nod 1413
思路:直接在串里找个最大的值就好了;#include #include #include #include #include using namespace std;const int INF=0x7fffffff;const int N=211;char a[N];int main(){ int ans=0; scanf("%s",a);原创 2016-10-12 22:59:44 · 409 阅读 · 0 评论 -
51nod 1138 【数学-等差数列】
思路: 很显然每个连续的序列都是等差数列, 那么我们利用等差数列求和公式。 S=(a1+a1+k-1)k/2=(2·a1+k-1)*k/2;a1是首项,k是个数。 枚举k,首项最小为1,k最大,具体不说了,反正大致就是sqrt(2*n); 枚举量还是在平方以内 题外话: 这题就是没有去想等差数列,等差数列公式和求和要熟练,以及变量都是一方影响另一方的思想也要有;#include <bi原创 2016-09-08 19:58:19 · 431 阅读 · 0 评论 -
51nod1270 【dp】
思路: dp[i][0]代表第i个位置取1,dp[i][1]代表第i个位置取b[i]。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N=5e4+10;LL dp[N][2];LL a[N];int main(){ LL n; scanf("%lld", &n);原创 2016-09-08 16:24:18 · 358 阅读 · 0 评论 -
51nod 1050【DP】
思路: 就是先正常的dp一下求一个最大连续子串,然后特殊情况就是sum-最小连续子串。。 比一比谁大谁小就好了#include <stdio.h>#include <string.h>#include <iostream>using namespace std;typedef long long LL;const int N=5e4+10;const LL INF=5e13+10;LL原创 2016-08-31 23:40:11 · 304 阅读 · 0 评论 -
51nod 1433【数学】
思路: 不晓得阿,n%9==0即n数值各个位加起来要%9==0; 如果知道这个,那么%90==0就是末尾多个0就好了,那么后面就是随便搞吧;#include <stdio.h>#include <string.h>#include <iostream>using namespace std;typedef long long LL;const int N=1e3+10;int a[N];原创 2016-08-31 23:35:38 · 308 阅读 · 0 评论 -
51nod 1062【水题】
直接打表构造啊#include <stdio.h>#include <string.h>#include <iostream>using namespace std;typedef long long LL;const int N=1e5+10;int a[N];int d[N];void init(){ d[0]=a[0]=0; d[1]=a[1]=1; int原创 2016-08-31 23:30:37 · 325 阅读 · 0 评论 -
51nod 1092【区间dp】
思路: 简单的区间dp,从小区间到大区间,随便写。 还有一种是那啥,n-LCS。。。具体不说了,赶时间)))= =、#include <stdio.h>#include <string.h>#include <iostream>using namespace std;typedef long long LL;const int N=1e3+10;char s[N];int dp[N][原创 2016-08-31 23:29:33 · 341 阅读 · 0 评论 -
51nod 1094 【水题】
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;typedef long long LL;const int N=1e4+10;LL a[N];int n;int main(){ int s,t; LL sum=0,k; scanf("%d%lld",&n,&k)原创 2016-08-31 23:27:36 · 467 阅读 · 0 评论 -
51nod 1103【鸽巢原理】
思路: 这道题嘛有些弯还是要转的,比如你说让你搞n的倍数,你别老老实实照她的意思去啊,倍数可以除法,取膜 。 因为n个数我们可以求前缀和然后取膜,对n取膜的话有0-n-1种情况,所以方案一定是有的,说的好听一点就是因为鸽巢原理,如果取膜=0那直接输出,如果有两种相等的,减一下输出就好了,一定会存在,而且不用判没有情况的。)虽然我判了。。。#include <stdio.h>#include <原创 2016-08-31 23:24:21 · 444 阅读 · 0 评论 -
51nod 1272【二分+RMQ】
思路: 这题不能说是长见识,倒是第一次写这么富有套路的题,倒着来,二分区间嘛,这个很简单啊,二分的条件查询一个当前区间的最小值是不是比那个特定的值小,一步步缩小,这就是二分嘛,然后查询用线段树的RMQ写法搞,logn。 二分的模型是0000000111111111这个,窝还是照着自己的两篇小博客写的,一个是线段树,一个是二分。。。然后过的///希望熟能生巧吧#include <stdio.h>原创 2016-08-31 23:08:16 · 385 阅读 · 0 评论