摘要:
题意:判断一个图是否为仙人掌图分析:直观的说,仙人掌图就是一个一个的圈直接“粘”在一起的图,圈 之间没有公共边。仙人掌图有这样三个性质:性质1 仙人掌图的DFS树没有横向边。----------------------------------性质2 Low(v)<=DFN(u) (v是u的儿子) (即没有桥)性质3 设某个点v有a(u)个儿子的Low值小于DFS(u),同时u自己有b(u)条逆向边。那么a(u)+b(u)<2。View Code #include<iostream>#include<algorithm>#include<stack> 阅读全文
摘要:
题意:一个棋盘,摆了四种颜色的棋子,每次选择一个棋子消掉,同时跟它相连的也会被消掉,之后1)下方有空的棋子会往下掉,填补空的格子2)如果有整列被消的掉的,该列右边的棋子全部往左移,当然,左移的界限就是到被消掉的一整列,这个看Sample就知道了分析:棋盘不大,6*6而已。一开始的感觉就是迭代加深搜索了,再搜的过程中,优先选择相连颜色中数量最多消掉,31ms,不过爆搜也可以过,600+msView Code #include<iostream>#include<algorithm>#include<queue>using namespace std;const 阅读全文
摘要:
题意:对一棵树上的点进行实时的增减权值和询问子树的权值和首先:单点修改以及子树查询。对整棵树dfs一遍,记录下欧拉序列。这样有一个好处,就是每一棵子树在这个序列中都是连续的,同时记录下每一棵子树的起始序列号,这样,对子树的查询就变成了一个连续区间的查询了,运用树状数组就可以解决了。那最大生成树呢?“Sailormoon girls want to cut extra branches by using minimum cost, after that..."额,这里要将多余的边减掉,用最小cost,也就是减掉之后,变成了一棵最大生成树。郁闷呀,一开始以为题目所给的cost是没用……… 阅读全文
摘要:
题意:纯模拟题,用N个优先队列表示ID为0~N-1的Resource再重载一下操作符即可,剩下的就是模拟了ID好的范围是10000,询问的次数也是10000,里面的hash操作是多余了,自己没有考虑清楚………………View Code #include<iostream>#include<algorithm>#include<queue>#define MAXN 10010using namespace std;struct node{ int pri,num; bool friend operator<(const node a,const node 阅读全文
摘要:
题意:求最长回文串用Manacher 可以在O(n)时间内解决#include<iostream>#include<algorithm>#include<string.h>#define MAXN 200010using namespace std;char str1[MAXN],str[MAXN*2];int rad[MAXN*2],nn,n;void Manacher(int *rad,char *str,int n){ int i; int mx = 0; int id; for(i=1; i<n; i++) { if( mx > i ) 阅读全文
摘要:
题意:给出一些点,有值,给出一些边,然后求去掉一条边后将分成连通的两部分,且两部分的差值最小分析:首先,求出所有的双连通分量,缩点,重新构图,再dfs (类似树形DP的过程)一遍就可以找出最小差值。但是,因为tarjan 算法的本质就是一个dfs,所有可以在求双连通分量的同时求出最小差值。注意:有重边的情况,因为人为的加了一条双向边,那个是无效的,但是原图的重边是有效的, 在这里WA 了N次View Code #include<iostream>#include<algorithm>#include<vector>#include<stack># 阅读全文
摘要:
hdu1827#include<iostream>#include<algorithm>#include<stack>#include<vector>#define MAXN 1010 using namespace std; vector<int> g[MAXN],g2[MAXN]; stack<int> st; int n,w[MAXN],dfn[MAXN],low[MAXN],f[MAXN],index; int in[MAXN],num,sccw[MAXN]; bool vis[MAXN],instack[MAXN 阅读全文
摘要:
题意:在T-1时间内逃出城堡,途中可能会遇到10种门或钥匙,每种门对应一种钥匙。简单的BFS,但是判断一个点能否通过不是简单的判断是否走过,而是判断通过该点时拥有的钥匙的状态是否一致。所以,判重的hash数组要多开一维,表示钥匙的状态。可以用位运算,二进制的10个位分别表示每一种钥匙的状态View Code #include<iostream>#include<algorithm>#include<queue>#define M 21using namespace std;struct node{ int x, y, t, state; node() {} 阅读全文
摘要:
题意:有 n 个数,你不知道它们的值, 然后又有 m 行数,每行 a ,b ,c,表示 a 到 b 之间所有数的和为c(包含了第a个和第b个数)。但是这m行数里面有些是错的,就是与前面给的条件相冲突的,要求你最后输出错了几行。分析:用并查集,同样,还是需要一个辅助数组r[]记录每一个点跟根节点的关系。首先我们可以把问题稍微转化一下,就是如果已知[3,6],[7,10]俩个区间内各自所有数的和,那么就可以[3,10]内所有数的和,可是,这俩个区间根本就不衔接,所有要稍微处理一下,将左区间值减1,就变成了[2,6],[6,10],这样就方便处理了。既然这样的话,[2,6]区间内所有数的和就完全可以 阅读全文
摘要:
大致题意是说:有n个电站,每个电站都有一定的电量,电站之间有一定距离,我们要从0点出发去占领一些电站,使得占领的电站电量之和超过总电量的一半,求达到条件所要走的最短距离。如果可能的话,输出距离,否则输出不可能。我们知道电站都是连通的,只要0点与任何一个电站连通,我们就可以占领所有电站,如果0点不与任何一个电站相连,就是不可能实现,也就是说0点到任何一个电站的距离都是无穷。 我们从0点开始派出一些坦克去占领一些电站,坦克到每个电站都有一定距离,而占领每个电站之后可以得到一定电量,距离就相当于体积,电量就相当于价值,这不是就01背包吗?01背包通常的问法是给定体积,求获得最大的价值,这里的问法是给 阅读全文