ACM刷题
子夜ザ
这个作者很懒,什么都没留下…
展开
-
Parity game(poj-1733)(带权并查集+离散化)
题目前置芝士带权并查集离散化思路先求一遍前缀和 设每次询问为 l,r,ans 由前缀和的性质我们知道 ,如果 sum[l~r]=‘odd’ 说明 sum[r]和sum[l-1] 的奇偶性不同,一奇一偶,否则说明两者奇偶性相同,同为奇数或者同为偶数。这题我们考虑带权并查集设边权d[x]为0,表示x和fa[x]的奇偶性相同,如果d[x]为1,表示x和fa[x]的奇偶性不同 在进行路径压缩时,对x到树根的所有边权做异或运算,可以得到x和树根的关系对每个询问,设ans表示该问题的回答(0代表偶原创 2022-05-04 09:09:58 · 214 阅读 · 0 评论 -
Starts(POJ 2352)(前缀和+树状数组)
题目题意给出一些星星的横坐标和纵坐标,而且星星的纵坐标按非递减排列,如果纵坐标相等,则横坐标按递增排列,任意两颗星星不会重合。如果有n颗星星的横坐标比某颗星星小而且纵坐标不大于那颗星星(即有n颗星星位于那颗星星的左下角或者左边)则此星星的等级为n,最后输出等级为0至n-1的星星的数量。思路因为输入是按照按照y递增,如果y相同则x递增的顺序给出的, 所以,对于第 i 颗星星,它的ans就是之前出现过的星星中,横坐标 x 小于等于 i 星横坐标的那些星星的总数量(前面的y一定比后面的y小)。该问题本质原创 2022-04-14 17:24:28 · 90 阅读 · 0 评论 -
Frequent values(POJ 3368)(ST RMQ)
题目题意一个非降序序列,有若干查询,每次查询一个区间中重复次数最多的数字的个数。思路:因为是非降序的,所以可以从头遍历把每个相同的数字划为一个集合,用p[i]表示ai划分到了哪个块里面,同时还可以记录每个集合的左右边界,同时还可以获得每个集合中数字的个数。可以把这些个数处理成ST表。对于查询的区间,有三种可能(1)该区间只有一个集合那就直接右边界-左边界+1(2)该区间有两个集合找出左边界所在集合,在该区间的个数,以及右边界所在集合,在个区间的个数,比较二者大小(3)该区间有两个以上的集原创 2022-04-11 20:11:05 · 405 阅读 · 0 评论 -
Cheapest Palindrome(poj 3280)(区间dp)
题目题意给你长度为m的字符串,其中有n种字符,每种字符都有两个值,分别是插入这个字符的代价,删除这个字符的代价,让你求将原先给出的那串字符变成一个回文串的最小代价。思路dp[i][j]表示字符串的子区间[i,j]转化为回文的最小成本对于字符串的子区间[i,j]两端的字符s[i],s[j],分为以下两种情况(1)若s[i]==s[j],则两端的字符不需要花费成本,问题转化为求解子区间[i+1,j-1]则直接dp[i][j]=dp[i+1][j-1](2)若s[i]!=s[j],则需要比较两端的原创 2022-04-06 10:48:33 · 264 阅读 · 0 评论 -
Ranking the Cows(POJ 3275)(传递闭包+floyd优化)
题目题意FJ想按照奶牛产奶的能力给她们排序。现在已知有N头奶牛(1 ≤ N ≤ 1,000)。FJ通过比较,已经知道了M(1 ≤ M ≤ 10,000)对相对关系。每一对关系表示为“X Y”,意指X的产奶能力强于Y。现在FJ想要知道,他至少还要调查多少对关系才能完成整个排序。思路如果排序可以确定了,潜台词就是任意两头牛之间的关系都可以确定了。N头奶牛一共有C(N, 2) = N * (N - 1) / 2对关系。由现在已知的关系如能确认K对关系,则要调查的次数就是C(N, 2) - K。这很容易理解原创 2022-03-30 11:26:09 · 108 阅读 · 0 评论 -
Counting Cliques(暴搜dfs)
题目题意给定一个n个点,m条边的无向图,找出其中大小为s的完全图个数(n≤100,m≤1000,s≤10)思路暴搜。搜索的时候判断要加进来的点是否与当前集合中的每个点之间都有边。搜到集合大小为s就答案+1.注意:如果不做处理的话,每个完全图都会被搜到2^s次,其中只有一次是必要的。因此,一个很显然的常用的考虑是:搜索的时候下一个节点比当前的节点编号大,这样就肯定不会搜重复了。再稍微转化一下,在建图的时候就可以只建小点指向大点的边。代码#include <bits/stdc++.h&原创 2022-03-12 14:43:07 · 294 阅读 · 0 评论 -
POJ-1270(Following Orders)
题目题意给出一些变量和它们之间的先后顺序关系,求出这些变量可能的顺序,按字典序输出所有结果。思路因为要按照字典序输出,所以要对这些字母排序(我的方法是将这些字母转化为数字),因为要输出所有结果,表示答案不只有一个,就需要dfs回溯,总体来说就是拓扑排序+dfs回溯代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespac原创 2022-03-01 16:27:45 · 373 阅读 · 0 评论 -
Sticks(UVA307)
题目题意将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短。思路DFS没什么好说的了,说一下几个剪枝的地方。<1>首先,拼成木条的长度必须是所有木棒长度总和的约数,并且大于等于木条中的最大值。<2>将木棒从打到小排列,可以减少递归的层数。<3>当第i个木棒未选取时,如果i+ 1木棒与i木棒相同长度。跳过, 没有必要重复考虑。<4>当遍历到i个木棒时,找不到小木棒和它组成木条时, 可以终止当前判断的木条长度。代码#include<原创 2022-02-28 20:22:49 · 71 阅读 · 0 评论 -
Purifying Machine(UVA-1663)
题目题意给定m mm个长度为n nn的0/1串,其中每个串至多有一位被挖掉,替换成了∗ ,表示这个位置可能是0/1。问最坏情况下最少要用多少个0/1串(也可以至多有一位为∗ )能表示这m个串思路一个模板可能匹配一个串或两个串,要让能匹配两个串的模板尽可能的多,建立二分图,能用一个模板匹配的串连边。答案即为实际的串数减去最大匹配数的一半(由于我们未划分二分图,所以每一组匹配会被计算两次,需要除以二)tips:位运算小技巧:x第y位置0: x|=(1<<y);x第y位置1:x&=~原创 2021-11-10 20:36:45 · 236 阅读 · 0 评论 -
Say Cheese(UVA 1001)
题目题意无限大的奶酪里有n(0<=n<=100)个球形的洞。你的任务是帮助小老鼠A用最短的时间到达小老鼠O所在位置。奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动。洞和洞可以相交。输入n个球的位置和半径,以及A和O的坐标,求最短时间。思路把起点A和终点O都看成是半径为0的球,共有n+2个球,每个球的球心看成结点。两个结点的距离就是球心的距离减去两个球的半径。如果距离为负,说明两个球是相通的,此时距离为0。用floyd算法,最后注意单位转化就行。代码#include<b原创 2021-11-04 20:23:14 · 148 阅读 · 2 评论 -
Police Station
题目题意给出一个无向图,边权都为1,居民们需要从顶点1走到顶点n,而且只走最短路;然后让你在1~n中选一个顶点放置警察局,如果一个顶点放置了警察局,那么和这个顶点相连的道路都是安全的;求让你选择一个顶点放置警察局,使所有最短路中含有安全道路的平均值最大;其实就是(每一条最短路中含有安全边的数量)之和/ 最短路数 最大;不同最短路的意思是如果两条路径至少含有1条不同的边就是不相同思路如果在1,或者n放置警察局,那每条最短路只能经过一个安全边,所以平均就是1。如果放在2~n-1之间(假设在i点),则会原创 2021-11-02 18:53:25 · 185 阅读 · 0 评论 -
Driver Disagreement(Gym - 102007D)
题目题意给出n个点的图,每个点都有两条边,并且每个点有一个标记1或者0现在两个人在同一点,但是他们不知道自己在哪一点,一个人觉得他们在A,另一个人觉得他们在B。然后他们所在的位置是A或者B现在需要设计一种路线,使得沿着路线走,如果从A出发走到一个点和从B出发走到一个点那个点的标记不一样,那么它们就知道谁对谁错了。现在问最少的路线长度。这个路线是每次选择往左走还是往右走,因为每个点有两条边思路开一个结构里,记录从a点出发到达的点,从b点出发到达的点,以及转弯的次数。用并查集,将a点经过的点和原创 2021-11-01 20:41:09 · 137 阅读 · 0 评论 -
Bargain(codeforce -1422c)(数论)
题目题意给出长度为n的字符串,删除其中任意长度的连续子串,将所有可能的情况的数字加起来取模比如1213121 12131211213121,每次可以移除其中连续的一段,比如移除1312 13121312,剩下的数为121 121121,现在要求的是对于每一种子串被移除的情况,最后剩下的数的和是多少?比如107 107107这个数,我们可以移除1 11,0 00,7 77,10 1010,07 0707,107 107107等子串,然后得到07 0707,17 1717,10 1010,7 77,1原创 2021-11-01 19:44:45 · 121 阅读 · 0 评论 -
Name(CodeForces - 180D)(dfs+思维)
题目题意给定俩串a,b问能否通过对a的排列,找到a>b的字典序最小的一种排列,如果能找到,输出这个串,找不到输出-1思路一个比较考验思维的题,先用一个数组num将串a出现的字母存在来(转化为数字),再用一个数组将串b转化成一列数字。然后从0开始dfs,对每个位置,看能否在num数组中,找到大于或者等于串b数字的数字。代码如下:#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const in原创 2021-10-09 10:26:10 · 81 阅读 · 0 评论 -
Ideal Path(UVA-1599)
题目推荐题意给定一个n个顶点,m条边的无向图,每条边有颜色值(长度均为1),求出起点到终点的最短路径(颜色值表示),若存在多解,则输出路径中颜色值字典序最小者。(注意重边,自环)思路逆向BFS求最短路径,正向BFS求字典序最小代码如下#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;vector<i原创 2021-10-07 16:09:51 · 168 阅读 · 0 评论 -
Self-Assembly(UVA - 1572)(例题6-19)
题目思路细看要求,要求判定是否存在无限延展的图像,若是存在的话,计算机是没法直接构造出无限的图像的,那么它在暗示我们肯定可以找到一个判定无限的等价条件。将每条边的标号看成点,正方形看成边,若能构建一个有向图且存在环,则说明可以构造一个无限大的图形至此,思路基本明了,将复杂问题转换为有向图的有向环判断问题,有两种思路处理有向环,可以说图的算法核心就两种:bfs和dfs。这里也一样拓扑排序(bfs):拓扑排序过程中计算出队的顶点个数,若不为52,说明存在有向环dfs标记法:关键在于访问状态设计,用0原创 2021-10-05 20:00:04 · 115 阅读 · 0 评论 -
Chat Group(Gym - 101775A)(费马定理+快速幂+逆元)
题目题意求出n个人,选出至少m个人的方案数。思路就是∑C(i,n) m ≤ i ≤ n。转变成2^n - ∑C(j,n) 0 ≤ j ≤ n。当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法。求逆元的方法逆元(Inverse element)就是在mod意义下,不能直接除以一个数,而要乘以它的逆元。比如a∗b≡1(mod p),那么a,b互为模p意义下的逆元,比如你要算x/a,就可以改成x*b%p(也就是x * a^(p-2)%p)费马小定理:若p为原创 2021-10-04 19:49:40 · 151 阅读 · 0 评论 -
Porcelain(CodeForces - 148E)(组合背包)
题目思路对每一行挨个进行dp,如果一行能拿j个,则可以设左边拿k个,则右边拿j-k个,对k进行枚举,k<=j代码如下#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;int sum[110][11000];int dp[110][11000];int ma[110][11000];int main(原创 2021-10-02 19:35:25 · 118 阅读 · 0 评论 -
It‘s not a Bug, it‘s a Feature!(UVA 658)
题目题意首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug,所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下的bug,第二个字符串表示使用完这个补丁后原来的bug会变成怎么样。思路在任意时刻,每个bug可能存在也可能不存在,所以可以用一个n位二进制串表示当前软件的“状态”。打完补丁之后,bug状态会发生改变,对原创 2021-09-28 17:35:41 · 232 阅读 · 0 评论 -
Fence Repair(POJ - 3253)
题目一个霍夫曼编码类型的题最优解是优先队列(真的是有手就行 )代码如下#include<iostream>#include<queue>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;priority_queue<int,vector<int>,greater<int> >q;int main(){原创 2021-09-23 10:41:16 · 92 阅读 · 0 评论 -
Play on Words(UVA 10129)(欧拉回路)
题目一、无向图每个顶点的度数都是偶数,则存在欧拉回路。二、有向图(所有边都是单向的)每个节顶点的入度都等于出度,则存在欧拉回路。三.混合图欧拉回路 混合图欧拉回路用的是网络流。 把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路。什么时候可以不重复的走完所有边?(1)对于无向图来说,就是所有点的度为偶数,或者有且只有两个点的度为奇数其他点为均为偶数(且原创 2021-09-14 18:12:56 · 220 阅读 · 0 评论 -
Brexit Negotiations
题目题意需要开n个会议,一些特定会议开始之前需要先完成别的特定会议,并且在开始之前需要花k分钟总结先前完成的k场会议(跟先前会议是否关联无关,只要之前有会议完成,那k就+1),每场会议都有原本需要的时长ei。求单场耗时最长的会议的最小值。思路我理解的最大的最小问题是,给定的n个结点,有不同的顺序组合,我们要求的是在每个不同顺序组合中的最大值里面,找出最小的那个最大值。对于完成某件事情的前提是完成另一件事,肯定是用到拓扑排序的。不妨设p = ei + k, 想要让 p 尽可能的小, 就要让k尽可能原创 2021-09-12 19:16:01 · 89 阅读 · 0 评论 -
Ordering Tasks(拓扑排序)
题目在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。(1)每个顶点出现且只出现一次;(2)若A在序列中排在B的前面,则在图中不存在从B到A的路径。也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。基本思想:先把入度为0 的节点找到并打印删掉入度为0的节点,继续循环1的步骤,直至图为null。简而言之,就是将有确定的原创 2021-09-09 17:03:58 · 174 阅读 · 0 评论 -
Sequence Transformation(CodeForces - 1454C)
题目题意给定一个长度为n的序列,选择一个其中的元素 x,你可以删除不含有元素 x 的连续序列,要求最终序列中指剩下元素 x。思路消除连续的子序列,例如[1,2,2,3,3,4]为[1,2,3,4],然后统计每个元素出现的次数,第一个出现的元素前面没有元素,最后一个出现的元素后面没有元素,所以都要减一,最后求得最小的出现次数即为答案。代码#include<bits/stdc++.h>using namespace std;const int maxn=2e5+5;const in原创 2021-09-02 17:53:40 · 145 阅读 · 0 评论 -
Add One(数位dp)
题目题意一次操作是将这个数的每一位都加一。求将 n 进行 m 次操作后有几位。思路每一次操作只对当前位数有影响,所以可以一位一位考虑。可以发现,每一位本来是一位数,如果变成两位数,那么一定是9+1=10,变成了1和0两位。这样就可以只考虑对1和0进行操作了。dp[i][j]表示当前位置的数字是i,进行j次操作之后获得的位数如果i+j<10,那么操作之后还是一位。如果i+j>=10,那么操作之后就变成两位,一位是1,一位是0。而从i到10需要10-i步,还剩j-(10-j)=i+原创 2021-08-31 17:38:15 · 913 阅读 · 0 评论 -
Switches (Gym - 101908I)
题目一道模拟题。嗯,不用特地再考虑无法全部关灯的特殊状态,直接暴力循环5e4遍就行#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;vector<int>v[maxn];int a[maxn];int main(){ ios::sync_with_stdio(false); c原创 2021-08-25 10:44:18 · 143 阅读 · 0 评论 -
Adjustment Office
题目一道模拟水题代码如下:#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;bool visr[maxn],visc[maxn];ll sum1=0,sum2=0,size1=0,size2=0;int main(){ freopen("adjustment.in","r",stdin);原创 2021-08-25 09:42:16 · 207 阅读 · 0 评论 -
King of the Waves(dfs)
题目题意:给你n,代表有0 n-1个人,给你n行,每行n个字符,字符是X,i=j就是这个人在这个位置1 代表,i人能赢j人当king0代表输;游戏规则是b 是king a能赢b a当king问裁判按什么安排顺序0能当king思路:注意,0能打打败多个可以将问题简化为如果0能胜利,则剩余的n-1个人要么被0打败,要么被0所打败的人打败这几种情况#include<bits/stdc++.h>using namespace std;const int maxn=1e3+5;c原创 2021-08-20 20:14:41 · 170 阅读 · 0 评论 -
Koala and Lights(思维题)
题目思路灯每 t 秒变一次,那么周期为 2*t,t<=5,那么周期为 2,4,6,8,10,最小公倍数为 120,最晚从5 开始,所以枚举 125 次便枚举出了所有的状态。然后开一个数组表示时间,依次枚举每一个灯,在1-125s间的每一秒是亮着的还是不亮的#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;struct light{ int a; int b;}l[150];in原创 2021-08-18 20:26:49 · 90 阅读 · 0 评论 -
Coloring Contention(BFS)
题目思路:这题我看dalao都用的是dijkstra或者spa一开始我看到这个题想用搜索,但不知道是用dfs还是bfs,用了dfs TLE了之后就忘了用bfs再试试,结果打完比赛用bfs过了。。我爬了代码如下#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;const int maxn=1e6+5;typedef long long ll;int d[maxn];vector<int原创 2021-08-18 19:32:24 · 99 阅读 · 0 评论 -
Equidistant(多源bfs)
题目思路首先能想到的是,既然他们到某个节点的距离相等,那么这m个节点一定存在于以该点为根的树的同一层次上,但是就是要如何找这个点,如果正向跑就是从每个点进行bfs,看能不能同时到达m个点,然后t了。。事实上应该从m个点倒着跑,多源bfs,看某个点是否存在于m个点bfs的同一层次上#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long l原创 2021-08-17 20:28:22 · 119 阅读 · 0 评论 -
MP3
题目思路:用map来存每个数字的个数,再用一个数组将这些个数都存起来然后遍历#include<bits/stdc++.h>using namespace std;typedef long long LL;const int inf = 0x3f3f3f3f;const LL maxn = 1e6+5;int cnt[maxn];map<int, int> m;int main(){ int n,I,x; cin >> n >&原创 2021-08-16 14:06:54 · 105 阅读 · 0 评论 -
Remove One Element
题目思路:dp[i][0/1]表示到第 i 位时前面没删过元素/删过元素的最大长度。1.当第 i-1 位的值小于第 i 位时可以转移,两种情况均直接转移+1。2.当第 i-2 位小于第 i 位时,可以考虑删掉第 i-1 位,由第 i-2 位向第 i 位转移#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;int原创 2021-08-14 20:18:52 · 126 阅读 · 0 评论 -
Choosing flowers(贪心+数组前缀和)
题目花的种类不止一种,但每一种都是无限个。我们可以证明,我们最后选出的花中只有一种花是选取的多朵,而其他种类最多拿一种。证明:我们假设两种花 x 和 y,bx≥by,我们各拿两束。现在我们移除一朵y,加入一朵 x,此时总幸福值变化(bx-by)>0,所以幸福值未减少。我们重复这一操作,我们可以让 y 类花只留下一朵,但总幸福值未减少。所以,我们可以证明答案中只有一种花是有多朵的。由此,我们可以循环遍历每一种花。对于一种花 x,假设有多个 x 类花,如果 y 类花,ay>bx,那么原创 2021-08-11 20:12:53 · 169 阅读 · 0 评论 -
Retribution!(贪心)
题目硬贪就完事了代码如下#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;struct node{ double x,y;}j[maxn],t[maxn],f[maxn];struct Point{ double dist; int v1,v2;}d1[maxn],d2[max原创 2021-08-11 20:08:00 · 119 阅读 · 0 评论 -
Out of Sorts(二分水题)
题目Out of Sorts一个二分水题挺简单的,就当复习二分了233代码如下#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;int x[maxn];int main(){ int ans=0; unsigned long long m,a,c; int n; int s; cin>>n>原创 2021-08-11 20:04:04 · 60 阅读 · 0 评论 -
Musical Chairs
题目Musical Chairs一个约瑟夫环变种问题。用队列约瑟夫环问题我一直都用队列求解的,但菜鸡的我今天上午并没有很好的利用队列的特点导致TLE代码如下#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f3f3f3f;typedef long long ll;queue<int>q;int a[maxn];int main(){ in原创 2021-08-11 19:59:30 · 131 阅读 · 0 评论 -
HDU-1114 Piggy-Bank
中文大意在 ACM 能够开展之前,必须准备预算,并获得必要的财力支持。该活动的主要收入来自于 Irreversibly Bound Money (IBM)。思路很简单。任何时候,某位 ACM 会员有少量的钱时,他将所有的硬币投入到小猪储钱罐中。这个过程不可逆,因为只有把小猪储钱罐打碎才能取出硬币。在足够长的时间之后,小猪储钱罐中有了足够的现金,用于支付 ACM 活动所需的花费。但是,小猪储钱罐存在一个大的问题,即无法确定其中有多少钱。因此,我们可能在打碎小猪储钱罐之后,发现里面的钱不够。显然,我们希望避原创 2021-08-04 20:11:59 · 180 阅读 · 0 评论