poj训练计划
WePlayDirty
emmmmmmm
展开
-
poj1942线性复杂度求组合数
补发博客就是求C(m+n,m);读代码吧少年!#include#include#include#include#include#include#include#include#include#include#include#define ll long long#define mem(a) memset(a,0,sizeof(a))#define uLL原创 2016-05-04 16:34:54 · 2439 阅读 · 0 评论 -
poj2186 Popular Cows(强连通分量tarjan)
题中给出一张有向图,不保证图连通,如果对于某个点,其他点都有至少一条路径能到达该点,该点就是符合要求的( Popular Cows),问图中有多少这样的点。解法:求强连通分量,对强连通分量缩点,缩点后是一棵树,如果出度为0的缩点个数大于1,则符合要求的点为0个,否则出度为0的缩点(强连通分量)包含的点的个数就是答案。求强连通分量时和双连通分量时,tarjan算法还是不同的!无向图中原创 2016-07-29 09:21:36 · 2262 阅读 · 0 评论 -
poj3267 The Cow Lexicon(DP)
DP[i]代表到从第一个位置到第i个位置最少删除的个数,需要到DP[i]时,用长度小于等于i的单词优化结果。#include#include#include#include#include#include#include#include#include#include#include#define LL long long#define maxn 810using n原创 2016-07-19 17:21:46 · 2246 阅读 · 0 评论 -
poj1201 intervals
给出数轴上的n个区间[ai,bi],现在要在数轴上选取元素,构成一个元素集合V,要求区间[ai,bi]和集合V的交集至少有ci不同的元素,求集合V最少要有的元素个数。约束关系分析:明显有条件dis[bi]-dis[ai]>=ci(dis[bi]>=dis[ai]+ci,类比dis[v]>=dis[u]+w,所以bi为该边终点,ai为该边起点),要求问题的结果可用dis表示为dis[max]原创 2016-07-27 14:46:54 · 2224 阅读 · 0 评论 -
POJ1789 Truck History
就是最小生成树,就记得第一次做的时候题意坑,但还是忘了到底是啥,这次还是没理解题意。// #include#include#include#include#include#include#include#include#define LL long long#define maxn 2100using namespace std;char str[maxn][10];原创 2016-07-23 09:34:17 · 2069 阅读 · 0 评论 -
poj3292 Semi-prime H-numbers
离线打表啊,曾经1A的题,竟然到底没做出来。。。prime[i]*prime[j]可能会有重复结果,简单统计小于n的肯定不行#include #include #include #include #include #include #include #include #define maxn 1100000#define LL long longusing namesp原创 2016-07-19 19:43:18 · 2306 阅读 · 0 评论 -
poj2492 A Bug's Life(并查集)
和poj1703几乎一样,增加一个记录对立性别的属性opp,对于每一个给出的性别对立关系(u,v),每次合并(u,opp【v】),(v,opp【u】);合并后检查是否出现了u和opp【u】属于同一集合的情况。Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time原创 2016-08-03 14:15:47 · 2154 阅读 · 0 评论 -
poj1364 King(差分约束)
题目给的那两个数列真是恶心,谁猜的到哪个是下标哪个是数。题意:n,m表示有一个数列{A1,A2,......,An},下面有m个不等式;下面m行s,n,op,k ;op为gt表示As+As+1+As+2+ .......+As+n>k,op为gt表示 As+As+1+As+2+ .......+As+n上面两个关系可以转化为As+As+1+As+2+ .......+A原创 2016-08-01 16:56:45 · 2150 阅读 · 0 评论 -
poj2049 Finding Nemo(优先队列BFS)
(1)这题细节比较多,nemo的位置可能会很大(例如(100000,1000000));(2)一开始优先队列用错了,习惯性的写成了先出经过门最多的点,一直wa。。(3)意外发现了一组神数据,如果bfs时标记了的话,这组数据可能不对,卡位卡的好啊,总结就是使用优先队列bfs应该在出队的标记,而不是在进队的时候标记;这组数据就是 :4 13 2 1 11 3 0 21 1 0 2原创 2016-07-20 09:44:01 · 2634 阅读 · 0 评论 -
poj1703 Find them, Catch them(并查集)
每次给的关系表示两个物品不属于同一集合,题目关键在于一共只有两个集合,那就设一个对立关键字好了,表示两个物品对立,每次给一个对立关系u,v,就把(u和v的对立)与(v和u的对立)并起来,最后査就好了。#include#include#include#include#include#include#include#include#include#include#de原创 2016-08-03 10:54:46 · 2127 阅读 · 0 评论 -
多重背包的两种解决方法(poj1276)
多重背包是指装入背包的若干见物品种,可以拿的数量有上限。第一种就是二进制优化,转换成01背包,例如一件物品可以拿26件,每一件的权值是w,26可以写成(1+2+4+8)+11,所以就把这种物品分解成权重为w,2w,4w,8w,11w的五种物品,这五种物品组合,一定能组成小于等于26的任意一个数,这样就把有26件的一种物品换成了五种各有一件的物品,用01背包就能解决了。poj原创 2016-08-09 19:51:18 · 2628 阅读 · 0 评论 -
poj2352 Stars(树状数组)
问题要求统计左下角(x,y均小于当前star的star)有0颗星星、1颗星星.……n-1颗星星的星星个数,顺序输出。题目中给的数据是按y从小到大,所以对于star i(xi,yi),可能在它左下角的star(y#include #include #include #include #include #include #include #include #include #in原创 2016-08-11 08:50:18 · 2707 阅读 · 0 评论 -
poj3026 Borg Maze
涉及点:bfs 离散化 最小生成树把S和A同等处理,为每个S,A编号,bfs计算所有点对之间的距离,构成边集;用最小生成树算法连接点,结果就是所求。恶心的是这题的数据,用getchar()或%*c读不掉数字后面的回车,会WA,得用gets()或/n读掉。#include#include#include#include#include#include#include原创 2016-07-18 20:54:45 · 2401 阅读 · 0 评论 -
poj2983 Is the Information Reliable?
题中的条件可以整理为两种:A-B=X ,A>B; 即 A-B>=X ,A-B=B+1; 即为:BA-X , A>B+X , B>A-1 .类比与dis[v]>dis[u]+w,所以建立的边为edge(A,B,-X),edge(B,A,X),edge(A,B,-1);因为选择的松弛条件是dis[v]>dis[u]+w,所以如果图中有负权环,就代表关系循环矛盾,就是不可靠,原创 2016-07-27 14:39:52 · 2438 阅读 · 0 评论 -
poj3694 Network
给你一张连通无向图,向图中加Q次边,问你每次加边后,图中有几条割边。是可以有重边的,比如原图中边(1,2)是一条割边,再加一条边(1,2) ,就消除掉了一条割边。但是这个题有点别扭,加边的时候会有重边,一开始建图的时候也会有重边,但是建图时不考虑重边(去重)也能AC,比如3 41 22 31 22 321 22 3这组数据,结果感觉应该是0 0,但是用tarjan+lca原创 2016-07-26 09:38:46 · 2536 阅读 · 0 评论 -
poj1416
题意:要求碎纸机能够把纸条上的数字切成一些片段,这些片段的和最接近而不超过所给的值tar,第一个样例,tar的值是50,而纸条上的数字是12346,应该把数字切成四部分,分别是1、2、34、6。因为这样所得到的和43 (= 1 + 2 + 34 + 6) 是所有可能中最接近而不超过50的。三个要点:1、如果tar的值等于纸条上的值,则不切。2、如果没有办法把纸条上的数字切成小于原创 2016-05-05 12:51:40 · 2551 阅读 · 0 评论 -
poj1860 Currency Exchange(flody)
题目给出了有向图的邻接表,求哪个点到其他所有点的距离之和最小,以及该点到其他点的最短距离的最大值。才100个点,用flody跑出所有点对的最短距离,然后O(n)一遍一遍的找。#include#include#include#include#include#include#include#include#include#include#include#inclu原创 2016-07-23 19:09:00 · 2171 阅读 · 0 评论 -
poj3020 Antenna Placement(二分图)
每个*作为二分图点集中的一个点,每个天线可以覆盖两个*,天线就看到成是连接不同集合的点的边,因为不知道这些*属于那个集合,所以就建双向的,最后结果除2。问最少多少天线覆盖所有的点,就是问二分图的最小边覆盖,最小边覆盖=点数-最大匹配数。#include#include#include#include#include#include#include#include#inclu原创 2016-07-23 19:29:23 · 2181 阅读 · 0 评论 -
poj3259 Wormholes(spfa判环)
给你一些路径,path:从s到e花费时间twormhole:从s到e花费时间-t问能不能从某点出发,回到以前的时间点,就是判断有没有可达的负环,而题目应该默认整个图是连通的。随便找个起点,直接判断有没有负换就行了。// #include#pragma GCC diagnostic error "-std=c++11"#include#include#include#inc原创 2016-07-23 20:20:23 · 2249 阅读 · 0 评论 -
poj3321 Apple Tree
dfs搜索记录每个节点的dfs序l,以及其子节点最大的dfs序r,dfs序在区间[l,r]之间的就是dfs序为l的节点的子孙节点。查询节点P的果实个数,即使查询P对应的dfs序区间的和。要把用树状数组维护的区间上的某一点改为num,可以先记录每个位置的值,计算出增量,再update。有点坑的是卡vector,TLE#include#include#include#includ原创 2016-07-25 09:11:32 · 2291 阅读 · 0 评论 -
poj3070 Fibonacci(矩阵快速幂)
矩阵已经给出来了,直接算就行了。和普通的快速幂差不多,只不过多了一个矩阵乘法。#include#include#include#include#include#include#include#include#define LL long long#define maxn 110000#define maxm 110000#define MOD 10000using原创 2016-07-25 10:10:54 · 2242 阅读 · 0 评论 -
poj3150 Cellular Automaton(矩阵快速幂)
对于样例:5311 12212使得a = {1 2 2 1 2}; b = {1 1 0 0 11 1 1 0 00 1 1 1 00 0 1 1 11 0 0 1 1}变换一次,矩阵相乘 a * b = 5 5 5 5 4;各项对取余就是结果;如果变换k次,结果就是a×(b^n);所以用矩阵快速幂计算b^n;但是n×n的矩阵会超时啊原创 2016-07-25 18:38:01 · 2336 阅读 · 0 评论 -
poj2750 Potted Flower(线段树单点更新)
线段树还可以维护最大连续子序列和啊。。没想到对于这种首尾相接的数列,所求为其中一部分连续子序列的,可以分两种结果讨论(以序列a1,a2,a3,a4,a5为例):要么在序列中间,要么在序列两头1)所求结果子序列没有被分成两段(例如结果为a2,a3,a4);2)所求结果子序列分布在两端(例如a4,a5,a1,a2);对于本题,如果是第一种情况,结果就是(整个序列的最大连原创 2016-07-18 10:57:48 · 2689 阅读 · 0 评论 -
poj2886 Who Gets the Most Candies?
题意:输入n,k表示n个人,第k个第一个离开圆环,之后n行,每行一个名字和一个数字m,表示从这个人开始顺时针(数字大于0)或逆时针(数字小于0)第m个人离开圆环。 每个人离开时会有一个得分,得分=F(离开次序i); F(i)=能整除i的数的个数;求这个人的名字和得分。思路:首先打表枚举[1,500000]的F(i); 然后模拟求这个人的名字,对于[1,n]中原创 2016-07-17 20:48:55 · 2239 阅读 · 0 评论 -
poj2299树状数组解法(转发备忘)
转载:树状数组,具体的说是 离散化+树状数组。这也是学习树状数组的第一题.算法的大体流程就是:1.先对输入的数组离散化,使得各个元素比较接近,而不是离散的,2.接着,运用树状数组的标准操作来累计数组的逆序数。算法详细解释:1.解释为什么要有离散的这么一个过程? 刚开始以为999.999.999这么一个数字,对于int存储类型来说是足够了转载 2015-08-07 15:44:05 · 2074 阅读 · 0 评论 -
线段树详细讲解
原帖出处线段树(segment tree)线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中。下图就为一个线段树:(PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行。)1.线段树基本性质和操作线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L转载 2015-01-30 10:55:36 · 2817 阅读 · 0 评论 -
poj2528 离散化+线段树区间更新
就是看区间内有多少张不同的海报,唯一的问题是墙太长,需要离散化一下海报的宽度;最好的理解方式就是阅读代码:#include#include#include#include#include#define maxn 500010using namespace std;int _set[maxn*2];bool vis[11000];int fin_ans;void原创 2016-04-28 17:58:21 · 2183 阅读 · 0 评论