ACM水题刷耍
梦里江山
这个作者很懒,什么都没留下…
展开
-
最大流算法_一般曾广路算法Ford
/*最大流增广路算法*/#include<iostream>#include<queue>#include<cstdio>#include<cstring>#include<cmath>#define oo 0x3f3f3f3fconst int maxn = 1010;using namespace std;struct point{ int c,f;};poi原创 2015-08-27 22:23:18 · 542 阅读 · 0 评论 -
HDU_1845
#include<iostream>#include<cstdio>#include<cstring>const int maxn = 5005;using namespace std;int n;int main(){ int t; int x,y,xi,yi; scanf("%d",&t); while(t--) { scan转载 2015-05-20 20:07:04 · 345 阅读 · 0 评论 -
二分匹配_HDU_1525
#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;using namespace std;int n,map[maxn][maxn];char adam[maxn][5],eve[maxn][5];int link[maxn],vis[maxn];int num(char a){原创 2015-05-20 19:22:48 · 269 阅读 · 0 评论 -
二分匹配_HDU_2389
二分匹配,建图,hk算法,然道匈牙利算法要退休了?#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define oo 0x3f3f3f3fconst int maxn = 3050;using namespace std;int t,n,m;struct node{ int x,y,spe原创 2015-05-16 11:32:31 · 459 阅读 · 0 评论 -
二分匹配_HDU_3081
男女搭配,女生还可以跟闺蜜的可搭配的男生搭配,而且闺蜜还具有传递关系,问最后有多少种搭配方式。 首先,求搭配方式就是一种搭配成功,就把这个搭配的边删除,在搭配 然后就是传递之间的搭配,我是比较土的dfs出闺蜜圈,然后在搭上可以配对的#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;using n原创 2015-05-11 19:18:54 · 246 阅读 · 0 评论 -
二分图_HDU_2236
心好累,wa成狗,推代码重写过了 选择行列,二分图的性质,选择匹配 要差值最大 二分答案,枚举最小值 为何区间不是成功向上移而是失败向上移呢?[ma,ma+ans]的区块,如果匹配不到,说明范围太小,加大ans,故上移,#include<iostream>#include<cstring>#include<cstdio>const int maxn = 105;using names原创 2015-05-09 23:59:06 · 251 阅读 · 0 评论 -
并查集_HDU_2235
藏的很深的并查集,先按每个点的高度排序,从最小并查起 每次访问点的四边,看是否有以当前高度为边的可以放水的 然后还要标记点在哪些情况下是是段木板,例如 4 4 4 4 4 4 4 0 1 4 4 2 3 4 4 4 4 4 按照高度排序之后,从小开始,我们先读到0的位置,那么0的四周没有比 0小的,不存在以它为边可以放水的,访问1时,存在0可以放水,放完水之后,0并到1,之后访问2原创 2015-05-09 14:57:58 · 364 阅读 · 0 评论 -
二分图_HDU_4185
#include<iostream>#include<cstdio>#include<cstring>const int maxn = 605;using namespace std;char map[maxn][maxn];int n;int vis[maxn][maxn],link[maxn*maxn],dp[maxn*maxn];int Hash[maxn][maxn];in原创 2015-05-06 00:43:01 · 318 阅读 · 0 评论 -
二分图_HDU_1045
/*二分图的构造拆行、拆列*/#include<iostream>#include<cstdio>#include<cstring>const int maxn = 10;using namespace std;char map[maxn][maxn];int n;int link[maxn*maxn],vis[maxn*maxn];int col[maxn], row[ma原创 2015-05-06 00:41:37 · 273 阅读 · 0 评论 -
二分图_HDU_1054
/*hdu1054_最小点覆盖 = 最大匹配*/#include<iostream>#include<cstdio>#include<cstring>const int maxn = 1505;using namespace std;struct node{ int u, v, next;};node e[maxn*1000];int head[maxn],tot;原创 2015-05-06 00:40:17 · 277 阅读 · 0 评论 -
DFS_HDU_5222
有双向边,有单向边,问是否存在一点出发,回到出发点,也就是成环 直接深搜一发,在记得回溯边跟点,内存4*maxn#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<cstdio>#include<cstring>const int maxn = 1000005;using name原创 2015-05-02 22:56:53 · 269 阅读 · 0 评论 -
二分匹配_HDU_1498
在n*n的矩阵里面有1到50这样标记的气球,每次你可以搓爆同行或列的同标记的气球,问k次机会不能戳爆的气球的编号 PS:这题跟上一题的划掉1一个道理,同种气球就是1,只不过现在是对每一个气球都单独当成01矩阵来最小点覆盖,最后统计不能在k内覆盖的#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;u原创 2015-04-24 20:17:03 · 210 阅读 · 0 评论 -
二分匹配_HDU_2119
一个矩阵,由01组成,任意删除行和列,最少删几次 最小点覆盖:可以引申为覆盖点,删掉边,边上两点就是行列#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;using namespace std;int n,m;struct node{ int v,next;};node e[ma原创 2015-04-24 00:03:54 · 264 阅读 · 0 评论 -
二分匹配_HDU_2063
这是哦入门的男女搭配啊,有点意思#include<iostream>#include<cstdio>#include<cstring>const int maxn = 1005;using namespace std;int n,m,k;struct node{ int v,next;};node e[maxn];int head[maxn], tot;int link原创 2015-04-23 22:11:13 · 183 阅读 · 0 评论 -
二分匹配_HDU_1281
姿势不对啊,先用行去选择列,最后扫一遍,每去一点,匹配一次,看是否为重要点 PS(建图方式是想到了,没想到用点遍历)最后还得一空,泪啊,在水一题压压惊!#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;using namespace std;int map[maxn][maxn],n,m,k;原创 2015-04-23 21:54:04 · 248 阅读 · 0 评论 -
二分匹配_HDU_2768
/*应该是二选一的问题,在宠物爱好上有冲突的,就必须二选1,就有一条边最后就是求最大独立点集合非二分图的最大匹配,link[u] = ,link[v] = ,不为*/#include<iostream>#include<cstdio>#include<cstring>const int maxn = 505;//人的个数using namespace std;int c,d,v;原创 2015-05-20 21:35:21 · 306 阅读 · 0 评论 -
数学_LightOJ_1008
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int main(){ int t; long long int s,si,xi,yi,di; scanf("%d",&t); for(int cas = 1; cas <= t; ca原创 2015-07-27 08:55:13 · 457 阅读 · 0 评论 -
HDU_3679
#include<iostream>#include<queue>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<map>#define Mod 1000000007 typedef __int64 ll;const int maxn = 1100;using namespac原创 2015-08-16 21:31:37 · 424 阅读 · 0 评论 -
DFS_HDU_3699
有一股wa点,就是除相等判定的时候,不能直接/,因为酱紫没有保证整除#include<iostream>#include<queue>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<map>#define Mod 100000000 typedef __int64 ll;usin原创 2015-08-16 20:22:15 · 497 阅读 · 0 评论 -
HDU_3600_八数码之类的问题是否有解
/*八数码的真谛逆序数:前面比当前位小的个数zuih据说线段数可以用来求逆序数*/#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<map>const int maxn = 1000000;using namespace std;int n;int tree[maxn<<2]原创 2015-08-16 10:54:43 · 602 阅读 · 0 评论 -
HDU_5010_广搜,状压
/*状态如何保存呢,不懂因为题目已经说了,最多的可以走的位置不会大于32,这是不是暗示着什么呢,有点意思在仔细看一下这个地图上面的东西,会有“.(0)”、“S(1)”、“M(2)”、“P(3)”那么就是四个状态,也就是4进制,32位来表示一个四进制的3210表示十进制为3*4^3+2*4^2+1*4^1+0*4^0=228那就是4^3 = 2^6,我们记录了相对位置之后,就可以在对应位置原创 2015-08-14 00:01:22 · 375 阅读 · 0 评论 -
数学_Lightoj_1214大数整出
/*大数除法*/#include<iostream>#include<cstdio>#include<cstring>#include<vector>typedef long long ll;const int maxn = 222;using namespace std;char a[maxn];int b;vector<ll> ve;int Divisible(){原创 2015-08-07 11:15:02 · 416 阅读 · 0 评论 -
水_CF_257B
这题就是告诉你一个房间进进出出的情况,问房间最少容量为多少 标记进入的人,进就++, 出来则要考虑,标记过的,则不用处理,没标记过的,说明人就在里面,总人数就要++#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#define Max(a,b) (a)>(b)?(a)原创 2015-08-06 10:34:39 · 491 阅读 · 0 评论 -
最短路_POJ_1062
/*很明显这个可以跑一个最短路,1出发到n个点的价值距离,取最小即为答案,但是,有一个问题,就是等级限制m如果起点等级为L1,那么他接下来能访问的是[L1-m, L1+m],假设他接下来访问了L2, L2下面可以访问[l2-m,l2+m]显然,这应该是两个区间取交集[Max(L1,L2)-m, Min(L1,L2)+m]为接下来可以访问的但是酱紫处理不了一种情况,就是1-3-4是最短,但是1原创 2015-08-06 10:26:38 · 260 阅读 · 0 评论 -
最短路_HDU_4370
/*我溜啊,太神了,给定的关系居然能转换成酱紫的一副图的问题,完全没有这方面的觉悟啊X12+X13+……+X1n=1可以翻译为1的初度是1X1n+X2n+……+Xn-1n=1则翻译为n的入度是1Xki(1<=k<=n) = Xij(1<=j<=n)表示为其他点的入度等于出度所以说1到n跑一遍最短路就妥妥的了,这刚好满满足条件但是,题给又没有说1的入度和n的出度情况,所以,可能在1跟n存在原创 2015-08-05 23:29:57 · 404 阅读 · 0 评论 -
线段树_FZU_1921
#include<iostream>#include<cstdio>#include<cstring>const int maxn = 10010;using namespace std;struct node{ int num, score;};node tree[maxn<<2];void work(int rt){ tree[rt] = tree[rt<<1原创 2015-07-28 20:13:42 · 334 阅读 · 0 评论 -
线段树_HDU_2795
/*h*w的广告牌,每次尽可能选上面贴,尽可能靠左贴,问给定的广告长度中,应该在第几行我应该可以令根节点等于宽度,区间值为区间内能放的最大宽度,尽可能高度10^9,然而广告条数只有n=200000,因此高度只要在n之内就好了*/#include<iostream>#include<cstdio>#include<cstring>const int maxn = 200020;usi原创 2015-07-28 09:32:36 · 247 阅读 · 0 评论 -
线段数_HDU_3074
区间求积,暴int#include<iostream>#include<cstdio>#define Mod 1000000007const int maxn = 50050;using namespace std;__int64 tree[maxn<<2];void work(int rt){ tree[rt] =(( tree[rt<<1]%Mod) *(tree[rt<<原创 2015-07-27 19:26:28 · 367 阅读 · 0 评论 -
线段树_POJ_3264
这次算的是区间内,两值只差最大是多少,那就分别存入最大,最小值,两者之差不就是答案了。//区间之内,[a,b]间两数之差最大的//存最大最小值//一个是先算最小,在算最大,跑两边//一个是最大最小一起跑//然而时间复杂度差不多#include<iostream>#include<cstdio>#include<cstring>#define oo 1000010const int原创 2015-07-27 15:42:00 · 720 阅读 · 0 评论 -
线段树_HDU_1754
前面是区间求和,这里是区间求最大值,写着写着,上一个疑惑就解决了#include<iostream>#include<cstring>#include<cstdio>#define oo 0x3f3f3f3fconst int maxn = 2000010;using namespace std;int tree[maxn<<2];void Max(int t){ int l原创 2015-07-27 14:00:14 · 274 阅读 · 0 评论 -
线段数_HDU_1166
初级的单点更新,区间求和#include<iostream>const int maxn = 50050;using namespace std;struct node{ int l,r,d; int mid(){return (l+r)>>1;}};node tree[maxn<<2];void build(int l,int r,int rot){ tre原创 2015-07-27 10:47:12 · 265 阅读 · 0 评论 -
二分匹配_HDU
n个魔法师,m个魔法杖,每个魔法杖适用人数为k,求最大魔法师匹配魔法杖数#include<iostream>#include<cstdio>#include<cstring>const int maxn = 205;using namespace std;int link[maxn],vis[maxn];struct node{ int v,next;};node e[ma原创 2015-04-23 19:44:41 · 282 阅读 · 0 评论 -
二分匹配_HDU_1151
/*最小边覆盖 = 顶点数-最大匹配*/#include<iostream>#include<cstdio>#include<cstring>const int maxn = 125;using namespace std;int link[maxn],vis[maxn];struct node{ int v, next;};node e[maxn*1000];in原创 2015-04-23 19:20:35 · 269 阅读 · 0 评论 -
水2
贪心水题,给一串0-1的数,外加m个转换ij位置值的机会,求能得到的最小值#include<iostream>#include<cstdio>#include<cstring>using namespace std;char s[10000];int n;int main(){ int t; char a = 'a'; int k = 0; scanf(原创 2015-04-18 06:47:35 · 368 阅读 · 0 评论 -
水1
一道进制转换的水题#include<iostream>#include<cstdio>#include<cstring>using namespace std;int b[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int main(){ int t; scanf("%d",&t); char a1[1000],b原创 2015-04-18 06:43:50 · 334 阅读 · 0 评论 -
HDU_2824_欧拉函数
//欧拉函数//若p是质数e[p] = p-1;//若n是质数p的k次幂,e[p]=(p-1)p^(k-1)因为除了p的倍数都与n互质//if(n%a == 0 && n/a%a == 0)e[n] = e[n/a]*a//if(n%a == 0 && n/a%a != 0)e[n] = e[n/a]*(a-1)#include<iostream>#include<cstdio>#in原创 2015-04-15 18:31:58 · 387 阅读 · 0 评论 -
HDU_BFS_2822
//*问你要挖几个坑,直接优先队列维护*//因为没搞清楚界限是(1,1)不是(0,0)调试略久啊#include<iostream>#include<queue>#include<cstdio>#include<cstring>#define oo 0x3f3f3f3fconst int maxn = 1005;using namespace std;int n,m,sx,sy,d原创 2015-04-15 11:15:09 · 325 阅读 · 0 评论 -
HDU_DFS_2812
//这个游戏就是选这点推球撞堆木出格//原来不是撞一下反弹回去,而是我们在去推//因为没弄懂玩法,一直搞不懂,注释之后才看明白#include<iostream>#include<cstdio>#include<cstring>const int maxn = 30;using namespace std;char map[maxn][maxn];int dp[maxn][maxn原创 2015-04-14 22:48:55 · 392 阅读 · 0 评论 -
水_CF_567A
题意很简单就是x轴上一些点,然后叫你输出这个点与之最近和最远的距离长分别为什么#include<iostream>#include<cstdio>#include<algorithm>#define Max(a,b) (a)>(b)?(a):(b)#define Min(a,b) (a)<(b)?(a):(b)const int maxn = 200010;using namespace原创 2015-08-06 10:31:10 · 432 阅读 · 0 评论 -
最短路_HDU_4725
wa了无数发/*无向图,共n个点,点分层,x层-x+1层花费C(双向),此外还有m条额外的路,求1-n最短然后告诉你点的层数,那么如何建图(if(layer[u]+1==layer[v]))Dijkstra超时了Spfa也超,难道还要在搞稍微用了一下堆,还是超,似乎是建图问题如何建图比较巧妙,点是1-N,然后呢层数也是1-N,我们将层拆成点来连接,即第一层为N+1额,为何将层拆成点需原创 2015-08-05 16:24:33 · 332 阅读 · 0 评论