题解
整题解的
zero_orez6
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[状压dp] 动物园题解
动物园 P2911 动物园 题解 题意 有N个成环形的房间,C个小朋友,对于每个小朋友他们能看到E - E+4共五个房间,每个小朋友有F个喜欢的房间和L个讨厌的房间,当满足以下两个条件其中之一时,小朋友就会开心: 至少有一个他害怕的房间被移走; 至少有一个他喜欢的房间没被移走。 可以移走若干个房间,问最多能令多少个小朋友开心。 分析 dp式 对于任一个小朋友能够看到的五个房间,我们用0和1来表示这个房间是否撤走,而每个小朋友能看到的5个房间恰好能够作为状压dp的变量,用一个五位的二进制数s来表示原创 2021-09-09 19:15:50 · 333 阅读 · 2 评论 -
[并查集]校OJ-银河英雄传说
银河英雄传说 大意 有n列的星际战场,每一列上有一艘战舰,m条指令 M i j 表示表示将第i号战舰所在的列的全部战舰全部转移到第j号 C i j 表示第i,j号战舰是否在同一列,若在同一列,那么相差多少位 思路 将每一列的战舰看作是一个集合,用并查集来维护,,我们按照边带权的思想,在最初,让每条边的边权值为一,考虑路径压缩是如何传递权值的,在路径压缩把节点x指向根节点时,我们把dis[x]更新为从节点x到树根的之间的路径的所有权值之和 int find(int x) { if(x==fa[x]) r原创 2021-06-02 15:06:05 · 204 阅读 · 2 评论 -
[并查集]校OJ-亲戚
亲戚 大意 n个人,m个关系,k个关系(x,y),判断(x,y)是否有关系 思路 并查集模板题,判断find(x)是否等于find(y)即可 code #include <bits/stdc++.h> using namespace std; const int N=10860; int fa[N]; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } int main() { freopen("rela原创 2021-06-02 14:04:41 · 174 阅读 · 0 评论 -
[并查集]校OJ-犯罪团伙
犯罪团伙 大意 n个人,m个关系,求集合的个数。 思路 每次给定关系(x,y),则x元素属于y元素,也就是将x的祖先认为是y的祖先(大型认亲现场),在最后只需要记录有几个节点的祖先是它本身即可。 code #include <bits/stdc++.h> using namespace std; const int N=50860; int fa[N]; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); }原创 2021-06-02 13:55:49 · 172 阅读 · 0 评论 -
[线段树]校OJ-JSOI2008最大数
JSOI2008最大数 大意 给定n个数,每个数保证小于p,下面执行两个操作 添加:再当前序列末尾加上一个数 询问:输出序列后L位中的最大值 思路 因为每次询问是某一段范围的最大值,用动态开点的线段树写起来更优 code #include<bits/stdc++.h> using namespace std; const int M=4e5; int m,p,ans=0,num=0,root=0; char c; int a; struct tree { int l,r,zhi;原创 2021-06-01 15:11:36 · 209 阅读 · 0 评论 -
[线段树]校OJ-Interval GCD
Interval GCD 题目大意 一个有n个数的序列,m次操作 每次操作包括: 1.Q l rQ\ l\ rQ l r 查询从lll到rrr中a[l],a[l+1]...a[r]a[l],a[l+1]...a[r]a[l],a[l+1]...a[r]的最大公约数。 2.C l r dC\ l \ r \ dC l r d表示从l到r每个数都加上d 思路 参考之前的更相减损法gcd(a,b)=gcd(x,b−原创 2021-05-28 16:46:10 · 176 阅读 · 0 评论 -
[线段树]校OJ-Can you answer on these queries III
Can you answer on these queries III 题目简述 给定长度为N的数列A,以及M条指令 (N≤500000,M≤100000)(N≤500000, M≤100000)(N≤500000,M≤100000),每条指令可能是以下两种之一: “2 x y”,把 A[x] 改成 y。 “1 x y”,查询区间 [x,y] 中的最大连续子段和,即区间[l,r][l,r][l,r]内,连续累加和最大的。 对于每个询问,输出一个整数表示答案。 //input 5 3 1 2 -3 4 5 1原创 2021-05-28 16:00:04 · 184 阅读 · 0 评论 -
[线段树]校OJ-序列操作1
题目简述 给定一个包含n个数的序列,初值全为0,现对这个序列有两种操作: 操作1:把 给定 第k1 个数改为k2; 操作2:查询 从第k1个数到第k2个数的最大值。(k1<=k2<=n) 样例 //input 3 1 2 2 1 3 3 2 2 3 //output 3 数据范围 a,b<=105a,b<=10^5a,b<=105,n<=105n<=10^5n<=105 思路 模板题,在一棵线段树中进行mmm次区间查询(注意本题中m=n)(注意本题中m=原创 2021-05-28 15:56:30 · 309 阅读 · 0 评论 -
《算法竞赛指南》0x60通信线路(Telephone lines)
通信线路 大意 n个点,m条双向边,求从1~n的最小费用,你可以其中免费k条线路。 思路 将dis数组改为二位,用多出来的一维表示当前的线路免费了多少次,在正常跑完spfa 后判断每条边免费或不免费的费用,最后费用ans=min0≤i<k dp[n][i]ans=\min _{0\leq i< k}\ {dp[n][i]}ans=min0≤i<k dp[n][i] code #include<bits/stdc++.h> using namespace原创 2021-05-27 21:51:28 · 235 阅读 · 0 评论 -
《算法竞赛指南》GF与猫咪的关系
GF与猫咪的关系 大意 给定n个点,m个边,求两个边数最多的点之间的边数,注意当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧。 思路 跑一遍flord,遍历数组找到其中的最大值。 #include<bits/stdc++.h> using namespace std; int a[1086][1086]; int ans=-1; int n,m; int main() { memset(a,0x3f,sizeof(a)); scanf("%d%d",&n,&原创 2021-05-25 20:39:47 · 183 阅读 · 0 评论 -
《算法竞赛指南》0x6B 升降梯上
升降梯上 大意 n层塔,m个按钮,每次拉拉杆上下电梯,拉拉杆需1s,上下一层需2s,求最小的上升到顶层的时间 思路 虽然看起来不像,但我们可以用最短路中的分层图来思考,遍历每个点以及每个拉杆所上下的楼层,将当前楼层与拉过拉杆所在的楼层相连接,权值为拉杆的位置,连完边之后,跑一遍dijkstra求出最短路即可。 #include<bits/stdc++.h> #define LL long long using namespace std; const int N=108600; struct n原创 2021-05-26 13:27:55 · 219 阅读 · 0 评论
分享