
题解
整题解的
zero_orez6
这个作者很懒,什么都没留下…
展开
-
[状压dp] 动物园题解
动物园P2911 动物园 题解题意有N个成环形的房间,C个小朋友,对于每个小朋友他们能看到E - E+4共五个房间,每个小朋友有F个喜欢的房间和L个讨厌的房间,当满足以下两个条件其中之一时,小朋友就会开心:至少有一个他害怕的房间被移走;至少有一个他喜欢的房间没被移走。可以移走若干个房间,问最多能令多少个小朋友开心。分析dp式对于任一个小朋友能够看到的五个房间,我们用0和1来表示这个房间是否撤走,而每个小朋友能看到的5个房间恰好能够作为状压dp的变量,用一个五位的二进制数s来表示原创 2021-09-09 19:15:50 · 280 阅读 · 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 · 174 阅读 · 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 · 143 阅读 · 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 · 150 阅读 · 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 · 176 阅读 · 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 · 140 阅读 · 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]内,连续累加和最大的。 对于每个询问,输出一个整数表示答案。//input5 31 2 -3 4 51原创 2021-05-28 16:00:04 · 157 阅读 · 0 评论 -
[线段树]校OJ-序列操作1
题目简述给定一个包含n个数的序列,初值全为0,现对这个序列有两种操作:操作1:把 给定 第k1 个数改为k2;操作2:查询 从第k1个数到第k2个数的最大值。(k1<=k2<=n)样例//input3 1 2 21 3 32 2 3//output3数据范围a,b<=105a,b<=10^5a,b<=105,n<=105n<=10^5n<=105思路模板题,在一棵线段树中进行mmm次区间查询(注意本题中m=n)(注意本题中m=原创 2021-05-28 15:56:30 · 230 阅读 · 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 · 201 阅读 · 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 · 147 阅读 · 0 评论 -
《算法竞赛指南》0x6B 升降梯上
升降梯上大意n层塔,m个按钮,每次拉拉杆上下电梯,拉拉杆需1s,上下一层需2s,求最小的上升到顶层的时间思路虽然看起来不像,但我们可以用最短路中的分层图来思考,遍历每个点以及每个拉杆所上下的楼层,将当前楼层与拉过拉杆所在的楼层相连接,权值为拉杆的位置,连完边之后,跑一遍dijkstra求出最短路即可。#include<bits/stdc++.h>#define LL long longusing namespace std;const int N=108600;struct n原创 2021-05-26 13:27:55 · 193 阅读 · 0 评论