ACM HDUOJ&POJ
该专栏分享了自己在本科期间进行ACM训练,在HDU、POJ上部分AC的题目讲解。
pfeiKing
安安静静地先稳住
展开
-
LeetCode小记
1.约瑟夫环问题描述:1.2.3...n做成一环,从第一个开始,报数报到k的人直接去死,问到最后剩下人的编号。解法:f[n] = (f[n-1]+k)%n2.原创 2022-05-05 09:43:34 · 287 阅读 · 3 评论 -
洗牌算法Knuth
洗牌算法共有 n个不同的数,根据每个位置能够选择什么数,共有 n! 种组合。题目要求每次调用 shuffle 时等概率返回某个方案,或者说每个元素都够等概率出现在每个位置中。我们可以使用 KnuthKnuth 洗牌算法,在 O(n)O(n) 复杂度内等概率返回某个方案。具体的,我们从前往后尝试填充 [0, n - 1][0,n−1] 该填入什么数时,通过随机当前下标与(剩余的)哪个下标进行值交换来实现。对于下标 xx 而言,我们从 [x, n - 1][x,n−1] 中随机出一个位原创 2021-11-22 21:44:21 · 492 阅读 · 0 评论 -
HDU 6118 度度熊的交易计划 最大费用最大流
题意:度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题:喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区。由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个。同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品。由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益。据测算,每一个商品...原创 2019-12-01 12:32:00 · 193 阅读 · 0 评论 -
HDU 1251 统计难题
题意:Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).思想:建立字典树,然后记录通过每一个节点的次数即可。#include#include#include#includeusing namespace std;struct node{ st原创 2017-02-21 19:45:39 · 303 阅读 · 0 评论 -
HDU 1053 Entropy
题意:huffman编码,求WPL。想法:不需要模拟每一个ascii的huffman code,只要计算WPL即可,很简单。使用优先队列。#include#include#include#include#includeusing namespace std;int ascii[260];int cnt;priority_queue, greater >原创 2017-02-20 20:41:32 · 265 阅读 · 0 评论 -
HDU 1710 Binary Tree Traversals
题意:给二叉树的前序遍历和中序遍历,写出后序遍历。想法:首先还原二叉树,然后再后序遍历一边即可;前序遍历,是买一个node放入二叉树的顺序,中序遍历,完美展现了各个node在二叉树中的相对位置。记为x:1 2 4 7 3 5 8 9 6记为Y:4 7 2 1 8 5 9 3 6放1:找到1在y中的位置,1为根;放2:在x中找到2的位置,发现在1的左边,则表示2原创 2017-02-20 16:49:13 · 238 阅读 · 0 评论 -
HDU 3999 The order of a Tree
/*二叉树的插入,前序遍历。 */#include#include#include#includeusing namespace std;int n;struct node{ int key; node *rson; node *lson;}*root;int ok;void InsertTree(node **rt,int key){ if(*rt=原创 2017-02-20 15:25:55 · 354 阅读 · 0 评论 -
HDU 1043 Eight
题意:游戏都玩过。/*8位,全排列,8!,三十多万,最后x要到达右下角。逆向思维,从右下角开始搜索,每当搜索一步,保存九宫格的这个状态,这里用到康托展开式hash,搜过过程中记录路径,最后反向输出即可。 */#include#include#include#includeusing namespace std;int fac[10]={1,1,2,6,24,12原创 2017-02-19 19:21:35 · 369 阅读 · 0 评论 -
Codeforces Round #398 (Div. 2) A Snacktower
/*决定因素是物品大小,最大的先放比他小的但是在他前面出现的要等待,大的放了,然后放在此之前出现的小的。# */#include#include#include#includeusing namespace std;const int N= 100000;int n;struct node{ int day; int w;}info[N];bool cmp(no原创 2017-02-19 13:54:22 · 361 阅读 · 0 评论 -
POJ 2352 Stars 树状数组
题意:在坐标轴的第一象限,有N个点,每一个点的等级等于横纵左边都小于这个点的横纵坐标的其它点的个数(不包括自己),求0~N-1等级的点分别有多少个?想法:此题和poj cows那一题差不多,先把x,y轴排序,达到效果:当前点的等级只和排序后序号小的点有关系。控制y,维护x即可。#include#include#include#includeusing nam原创 2016-11-20 17:22:07 · 354 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers 树状数组(区间更新,区间查询)
题意:有一个数组,需要进行区间查询和区间更新的操作,N个数,Q次询问,询问时输出结果。想法:可以用线段树,但这里是用树状数组的区间更新和区间查询操作,我们都知道树状数组可以进行区间更新点查询或者点更新区间查询,首先来看点更新,这是很容易理解的,当我把pos点更新之后,那么我也要更新受它影响的其他的点通过pos+=LowBit(pos),那么下面来看一下区间更新,表示在区间[a,b]内受原创 2016-11-19 15:32:19 · 418 阅读 · 0 评论 -
POJ 3461 Oulipo KMP
题意:T串在O串中有多少个?想法:KMP#include#include#includeusing namespace std;char O[1000000+50],T[10000+50];int next[10000+50],cnt;void GetNext(int len){ int j=0; next[0]=next[1]=0; for(int i=1;i<l原创 2016-09-01 18:57:09 · 274 阅读 · 0 评论 -
POJ 2488 A Knight's Journey DFS深搜
题意:一个骑士在n*m的棋盘上面走“日”,在(1,1)处开始,问怎么可以把棋盘走完,输出字典序最小的路径。想法:设定八个方向,先搜索字典序小的方向。#include#include#define judge(x,y) x>=1&&x=1&&y<=m&&!vis[x][y]using namespace std;int n,m,cnt;char path[10100原创 2016-08-31 20:23:02 · 511 阅读 · 0 评论 -
HDU 2510 符号三角形 深搜打表
题意:符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:+ + - + - + + + - - - - + - + + + - - + + - - + - - - +想法原创 2016-06-20 10:05:08 · 1014 阅读 · 0 评论 -
HDU 2677 Dota all stars 深搜
题意:有商店,商店里面有装备的名字和价格,一个人要买装备,他本身自己也有一些装备,给出已有装备名和个数,然后告诉你合成公式,最后要求合成若干个数的装备总共花多少钱。所有装备一定可以合成出来。想法:用字符串处理为每一个装备编号,然后设定结构体,设置相应的names,price,number变量。然后建图反向见图,从大装备往小装备搜索。#include#include#in原创 2016-06-20 09:59:00 · 751 阅读 · 0 评论 -
HDU 2952 Counting Sheep 深搜
题意:给一个h*w的图,求有多少个#块,如果上下左右任意一个连着就被视为一块,有传递性。想法:标记,深搜。#include#includeusing namespace std;int h,w;char map[120][120];bool mark[120][120];int dir[4][2]={1,0,0,1,-1,0,0,-1};void dfs(in原创 2016-06-15 20:45:06 · 398 阅读 · 0 评论 -
HDU 1813 Escape from Tetris IDA*
题意:由于整日整夜地对着这个棋盘,Lele终于走火入魔。每天一睡觉,他就会梦到自己会被人被扔进一个棋盘中,一直找不到出路,然后从梦中惊醒。久而久之,Lele被搞得精神衰弱。梦境是否会成为现实,谁也说不准,不过不怕一万只怕万一。现在Lele每次看到一个棋盘,都会想象一下自己被关进去以后要如何逃生。Lele碰到的棋盘都是正方形的,其中有些格子是坏的,不可以走,剩下的都是可以走的。只要一走到原创 2016-06-14 20:16:32 · 468 阅读 · 0 评论 -
HDU 1560 DNA sequence IDA*
题意:有四个元素ACGT,DNA的序列就是由这四个元素组成的,现在有n个DNA串,现在寻找这样一个串,即最短的序列并且n个DNA串是其子串。想法:首先,我们设要求的串是str,那么可以知道str的长度至少大于等于n个DNA串里面最长的那个。所以可以从此长度为基础进行搜索,我们可以整体进行搜索,即按照ACGT的顺序,来枚举str第一个要放置的字母,如果n个DNA串里面有,就把他们的位置枚原创 2016-06-12 09:36:07 · 428 阅读 · 0 评论 -
HDU 1814 Peaceful Commission 2-sat 爆搜
题意:一个党派2个人,两人中有且只有一个人可以加入和平委员会,如果有两个人不喜欢对方,那么他们不可以同时属于和平委员会。输出一中可行方案,字典序最小。想法:典型2-sat,他们的选择关系是,“不能都选是”,即x-~y,y-~x。上面是建图,下面详细讲一下求解最小字典序的结果。采用爆搜的方法,即,当选择一个人,把他安放在和平委员会时,继续按照他可选的人选下去,并且把这些人也放到和原创 2016-06-06 20:18:12 · 340 阅读 · 0 评论 -
HDU 4940 Destroy Transportation system 无源汇有上下界的网络流
题意:有n个点和m条又向边,给你的原图是强连通,每一条边有两个边权B,D,其中D代表删除一条边的代价,B代表在u,v之间把有向边转化成无向边的代价。现在将n个点分成两个点集S,T,其中S和T互补(点k要么属于S,要么属于T),现在定义一个,表示所有横跨两集合(S->T)的边的D权值和。,表示(T->S)的边的D+B权值和。现在问是否对于任意的集合S,T总有Y>=X,如果有输出happy,否则输出u原创 2016-05-24 22:29:12 · 642 阅读 · 0 评论 -
HDU 5391 Zball in Tina Town 威尔逊定理
题意:求Y=(n-1)!%n的值。想法:威尔逊定理:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p )显然当n为素数时,Y=-1%n=n-1。当n不为素数时,Y:当n=4时,Y=2;当n!=4时,Y=0;#include#includebool noprime(int k){ for(int i=2;i*i<=k;i++) {原创 2016-05-17 10:02:37 · 422 阅读 · 0 评论 -
HDU 3078 Network 在线LCA
题意:给n个点n-1条边,q次询问,其中0 a b则把点a的权值改为b,k a b则是输出a到b的最短路径中点权第k大的点的权值。想法:改权值简单,输出第k大权值,首先找到a,b两点的lca,然后由a,b两点向上找点并保存,当遇到lca是停止,那么a到b最短路径上的点就找到了。#include#include#include#include#include#def原创 2016-05-17 09:44:50 · 386 阅读 · 0 评论 -
HDU 2874 Connections between cities 离线LCA
题意:有n个点m条无向边,每一条边都有权值,有q次询问,每次问两点之间的距离。想法:因为有的城市可能没有连接,所以整个图可能会分成几个块,所以如果是两个不同块的那么肯定是无法互联的,然后其他的点的距离用离线LCA即可。#include#include#includeusing namespace std;const int N=10000+2;const int原创 2016-05-17 09:18:02 · 275 阅读 · 0 评论 -
HDU 2586 How far away ? 离线LCA
题意:有n个点,m条无向边,有q次询问,问点a到点b的距离。想法:点的个数有4000个,询问 200个,用floyd超时, spfa暴力没试过,这里用离线LCA算法。离线LCA就是,先保存查询的边(双向),然后dfs每一个点,回溯的时候合并点,然后在询问里面找当前点u的下一个点v有没有被访问过,如果被访问过,就记录记过dis[u]+dis[v]-2*dis[zuxian[v]]原创 2016-05-16 21:35:06 · 356 阅读 · 0 评论 -
HDU 3849 By Recognizing These Guys, We Find Social Networks Useful 边双连通
题意:有n个人,它们之间有m个关系,关系是相互的,也就是边是无向边,现在问这个无向图有多少个桥,然后把这个桥的两个端点输出出来。想法:tarjan边双连通,col为总的桥数因为col=0也是一个块,输出桥的端点名字即可。#include#include#include#include#includeusing namespace std;const int N=原创 2016-05-12 20:47:40 · 431 阅读 · 0 评论 -
HDU 2460 Network 边双联通+LCA
题意:有n个点和m个有向边,如果删除一条边那么有些点之间就无法连通,那么这条边就是桥,现在又q次加边,问每次加边,桥的个数是多少? 想法:边双连通缩点,然后建图通过bfs为每个点标上深度,然后标记加的a,b两点所在的双联通块之间的所有点,这样它们之间的边就不再是桥(LCA),并且下次加边如果出现之前加过的点,就没必要再算边了。#pragma comment(linker,"/S原创 2016-05-12 19:10:28 · 497 阅读 · 1 评论 -
HDU 3639 Hawk-and-Chicken tarjan缩点+dfs
题意:投票,投票可以传递,当一个人投票时,要把此人的得票数全给被投的那个人,问最后按升序输出得票数最高的人。想法:显然在一个连通块内的所有点的得票数都是一样的,即:块内点数-1,(1:是他自己本身)。所以先要tarjan缩点,然后求出每一个块可以由几个块到达(这里可以反向建边dfs)。最后输出最大得票数的人即可。#include#include#include#inc原创 2016-05-06 20:32:12 · 528 阅读 · 0 评论 -
HDU 3861 The King’s Problem 连通分量+二分匹配
题意:n个城市,m条有向边, 现在要把这个图分成块,对于块的定义:1,所有能够互通的点一定在一个块内。2,一个点可以到达另一个点,所经过的点只能是这个块内的。问做少要分多少个块?想法:显然tarjan先缩点,然后可以想到,要想百分之一百满足第2个条件,那么每一个块最多只能有所点后的两个点,所以对所得的缩点进行二分匹配,然后求得最大独立集=col-(最大匹配数)#includ原创 2016-05-06 19:00:48 · 776 阅读 · 0 评论 -
HDU 3072 Intelligence System 传递的最小费用
题意:人和人之间传递消息,然后一些人到人的传递需要代价,如果一个人可以和另一个人直接或者间接的相互传递,那么他们之间的传递代价忽略不计,问说有人都知道消息的最小代价?想法:显然tarjan缩点,然后用最小树形图求解,或者小贪心一下,因为最小树形图只跑了一层,显然每一个团体都是从另一个团体得到消息,又因为只有一个入度为0缩点(Believe kzc_tc’s working! There原创 2016-05-05 21:23:10 · 408 阅读 · 0 评论 -
HDU 1827 Summer Holiday 求每一个连通块内点的权值最小
题意:听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话费了。他知道其他人也有一些别人的联系方式,这样他可以通知其他人,再让其他人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到吗?想法:只要在提取一个连通块每一个点的原创 2016-05-05 20:42:59 · 478 阅读 · 0 评论 -
HDU 3836 Equivalent Sets
同:点击打开链接HDU2767#include#include#includeusing namespace std;const int N=20000+5;const int M=50000+5;stacks;struct node{ int to,next;}G[M];int head[N],cnt;int indegree[N],outdegree[原创 2016-05-05 20:32:10 · 390 阅读 · 0 评论 -
HDU 2767 Proving Equivalences 增加最小边使图为强连通
题意:数学的稳定证明,也就是一个定义x可以通过若干次的等价变换再次转换到x则表示定义x与在变换过程中用到的定义为稳定的,问至少还要添加多少条等价变换可以使给出的所有定义稳定?想法:tarjan缩点,Max(入度=0点的个数,出度=0点的个数)#include#include#include#include#include#define mm(x) memset(x原创 2016-05-05 20:25:24 · 560 阅读 · 0 评论 -
HDU 1269 迷宫城堡 简单求连通块
题意:为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N想法:tarjan求连通分量。#include#include#include#include #define mm(x) memset(x,0,sizeof(x))using namespace std;const int N=10000+5;const int M=100000+5原创 2016-05-05 19:52:55 · 414 阅读 · 0 评论 -
HDU 1914 The Stable Marriage Problem 稳定婚姻关系
题意:有男孩n个,女孩n个,没人有自己的名字,告诉你在每一个人心中所有异性的排名。问你如果搭配他们,为最稳定合理的搭配。想法:简单的稳定婚姻问题,如果不理解这个是什么,请看点击打开链接。#include#include#include#include#include#includeusing namespace std;const int N=30;int原创 2016-04-27 11:39:45 · 766 阅读 · 0 评论 -
POJ 2375 Cow Ski Area 增加最小边使图强连通
题意:一个矩阵图,每一个格子有一个权值,相邻格子之间可以通,条件是一个格子可以走到相邻格子的条件是相邻格子的全是不大于当前格子,问增加多少条边使得每一个格子都可以到达任意格子想法:tarjan缩点,之后,结果为Max(出度为0点个数,入度为0点个数)因为这个图,没有孤立点。#include#include#include#include#includeusing name原创 2016-05-05 19:48:12 · 512 阅读 · 0 评论 -
HDU 1530 Maximum Clique 简单的最大团模板题
题意:给你一个无向图,求他的最大团。想法:很简单的模板题。#include#include#includeusing namespace std;int n;int map[55][55],cn,maxt,mark[500];void dfs(int x){ if(x>n) { maxt=cn; return;原创 2016-04-21 09:27:44 · 848 阅读 · 0 评论 -
HDU 3585 maximum shortest distance 最大团+简单的二分思想
题意:给你n个点,然后你可以从里面找出k个点,然后使得k个点中的最短距离最大。想法:直接二分枚举最大距离,然后把满足的边找出来,然后就看看这些点的最大独立点集,如果个数>=k,那么显然长度可能可以更长一些,所以继续枚举,如果#include#include#include#include#includeusing namespace std;const int原创 2016-04-21 09:35:58 · 591 阅读 · 0 评论 -
HDU 1435 简单稳定婚姻问题
题意:Problem DescriptionNetwork 公司的BOSS 说现在他们公司建立的信号发射站和接收站经常出现信号发送接收不稳定的问题,信号的稳定度被定义为发射点到接收点的距离,距离越大,越不稳定,所以发射点跟接收点在可能的情况下应越近越好.BOSS给8600的任务就是::建立一个匹配表,使得一个发射点对应一个接收点,对于某一个发射点来说,它的接收点离它越近那么就会更稳定,原创 2016-04-27 11:35:26 · 1268 阅读 · 0 评论 -
HDU 1255 线段树扫描线面积交
题意:很多矩形会有重叠至少两次的地方,现在问重叠至少两次的面积。想法:线段树扫描线,对于一个区间[x,y],用cover表示这个区间整体被覆盖的次数,用one表示这个区间只被覆盖一次的长度,more表示这个区间被覆盖至少两次的长度。用seglen表示这个区间的长度,那么one+more=seglen,下面我们来讨论他们的关系。1.cover>=2:表示这个区间已经被至少覆盖了两次,原创 2016-04-19 09:26:06 · 427 阅读 · 0 评论 -
HDU 5666 快速就乘
题意:给以一条x+y=q的直线问,在其与xy轴构成的三角形中,有多少个整数点在里面。想法:简单数学题,根据等差数列,可以得到公式:1+(q-3)*q/2,这就是答案,主要是q太大了,所以用快速乘,其实就和快速幂差不多。#include#define ll long longusing namespace std;ll q,P;ll cheng(ll x,ll y)原创 2016-04-19 09:06:29 · 672 阅读 · 0 评论