09 2020 档案
摘要:优先队列裸题 const int N=310; char g[N][N]; int dist[N][N]; bool vis[N][N]; map<PII,PII> mp; PII st,ed; int n,m,q; inline bool check(int x,int y) { ret
阅读全文
摘要:二路 用二进制来表示地图的遍历状态 起到距离和判重两重作用,故数组也要加上二进制状态这一维 const int N=5; struct Node { int x1,y1; int x2,y2; int s; }; char g[N][N]; int dist[N][
阅读全文
摘要:解法一 第一步:确定状态——原问题?子问题? 前个数的最长不下降子序列——求不了啊~为什么求不了? 不知道这个序列的最后一个元素是哪个,没法转移 以第个数为结尾的最长不下降子序列 第二步:确定状态转移方程 \(f[i]=max\{f[j]+1\}(a[j]<
阅读全文
摘要:三维模板 const int N=110; struct Node { int x,y,z; }; char g[N][N][N]; int dist[N][N][N]; int n; inline bool check(int x,int y,int z) { return x>=0 &
阅读全文
摘要:裸题,加两个变量判断下一步是否能继续走就好了 const int N=1010; char g[N][N]; int dist[N][N]; struct Node { int x,y; bool F,M; }; PII ed; int n,m; inline bool che
阅读全文
摘要:裸题,注意读入 const int N=510; char g[N][N]; int dist[N][N]; PII st,ed; int n,m; inline bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<m; }
阅读全文
摘要:一眼二分。。。然后就没思路了。。。 二分当前路径上第大的边权,要求最小化第大的边权,故考虑二分。 二分的判定条件是当前路径上边权比大的边数应不超过条 于是现在核心问题是如何当前二分的值为的情况下,是否存在一条从到的路径,边权大于的边
阅读全文
摘要:枚举访问个亲戚顺序的全排列 有了全排列后,现在缺少每个亲戚到其他亲戚的最短距离 于是跑次算法 const int N=50010; vector<PII> g[N]; int dist[10][N]; bool vis[N]; int sta[10]; bool st
阅读全文
摘要:建图方式非常像P1194 买礼物,感觉点权都可以转化到虚拟源点到各个点的边权上。 若不考虑等级关系 等价于求虚拟源点到号点的最短路。 若考虑等级关系 考虑枚举。因为必定和酋长交易,那么整个交换过程可取的就是酋长的等级-m到酋长的等级+m。并且每次交易方案中,最小与最大的等级差不超过m。所以可以
阅读全文
摘要:这不是暑假做的建模题吗。。。 为不考虑换乘情况下的最短距离(依题意显然为0) 再跑判断换乘情况下号点到号点的最短距离 const int N=510; int g[N][N]; int dist[N]; bool vis[N]; int
阅读全文
摘要:毒瘤题。。。卡了好久 本题求乘积最大的路径,咋一看好像是最长路直接无脑跑,事实上的确能跑过。 但本题也可以用求解,原因是边权有特殊的性质: 这就导致了如果是到乘积最大的路径,那么$s->...-
阅读全文
摘要:枚举一下每个牧场作为目标点就行了,模型同1375. 奶牛回家 const int N=810; vector<PII> g[N]; int dist[N]; bool vis[N]; int pos[N]; int c,n,m; void dijkstra(int s) { memset(dist,
阅读全文
摘要:求一遍最大距离即为答案 const int N=110; vector<PII> g[N]; int dist[N]; bool vis[N]; int n,m; void dijkstra() { memset(dist,0x3f,sizeof dist); priority_queue<PII,
阅读全文
摘要:最短路裸题 const int N=2510; vector<PII> g[N]; int dist[N]; bool vis[N]; int n,m,s,e; void dijkstra() { memset(dist,0x3f,sizeof dist); priority_queue<PII,v
阅读全文
摘要:unsigned int n; string a; int main() { cin>>n; while(n) { a+='0'+n%2; n/=2; } while(a.size()<32) a+='0'; reverse(a.begin(),a.end()); string a1=a.subst
阅读全文
摘要:我们考虑异或的两个小小的性质: 任何数与 0 的异或值是它本身 k 个相同的数的异或和,当 k 为奇数时,结果是这个数本身,否则结果是 0 异或满足交换律和结合律 题目需要求 n 个数中出现奇数次的那个数,且保证这个数存在且只有一个。于是我们根据上面两个性质得出,答案就是这 n 个数的异或和。 in
阅读全文
摘要:这么一个憨批题居然还了几发? int n,m; string a,b; int main() { cin>>n; cin>>a; cin>>m; int res=0; for(int i=0;i<a.size();i++) { if(isdigit(a[i])) res=res*n+(a[i
阅读全文
摘要:水题 我们肯定向前传送 求长为k的最大连续子段和,然后总长减去就行了 const int N=1e6+10; LL a[N]; LL sum[N]; int n,k; int main() { cin>>n>>k; for(int i=1;i<=n-1;i++) cin>>a[i],sum[i]=s
阅读全文
摘要:const int N=510; int a[N][N]; int f[N][N]; int n; int main() { cin>>n; memset(f,-0x3f,sizeof f); f[0][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++
阅读全文
摘要:状态表示:表示从前个物品中选,总体积不超过的情况下的最大价值。 和01背包一样,完全背包问题的每种物品都有两种策略,但是也有不同点。 对第i件物品来说: 不放第i件物品,那么f[i][v]= f[i- 1][v], 这步跟01背包是一样的。 放第i件物品。这里的处理和01
阅读全文
摘要:状态表示:从前个物品中选,总体积不超过的情况下的最大价值 (蓝书上定义的是总体积为的最大价值,初始化时要作出相应的修改) 状态转移: 选第个物品: 不选第个物品:\(f(i,j)=f(i-1,j)\
阅读全文
摘要:我的思路(还是想了些许时间的): 按照题目的闭合圈的规定: 闭合圈由数字1构成 围圈时只走上下左右4个方向 方阵内只有一个闭合圈,圈内至少有一个0 可知从上到下, 从左到右遍历到第一个为1的格子的右下角必定为圈内的0,然后就是bfs填充连通块了 const int N=35; int g[N][N]
阅读全文
摘要:flood-fill const int N=110; char g[N][N]; int n,m; int res; inline bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<m; } void bfs(int x,int y
阅读全文
摘要:水题,组合型枚举 const int N=10; int path[N]; int n; void dfs(int u,int sum,int last) { if(sum > n) return; if(sum == n) { for(int i=0;i<u;i++) if(i) cout<<"+
阅读全文
摘要:无脑暴搜 const int N=110; char g[N][N]; bool vis[N][N]; int n; string str="yizhong"; bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<n; } void d
阅读全文
摘要:这题wa了有点久。。。对bfs理解更深刻了(bfs第一次扩展到即为最短距离)。 大体上和bfs模板差不多,只是增加了传送门,且题意规定一旦到达传送门立即传送。 只需要将当前扩展的结点变为传送到的结点即可,在判断dist数组是否为-1 dist数组即标记数组vis,第一次更新时即为最短。 const
阅读全文
摘要:bfs裸题,输出sb const int N=410; int dist[N][N]; PII st; int n,m; bool check(int x,int y) { return x>=1 && x<=n && y>=1 && y<=m; } void bfs(int x,int y) {
阅读全文
摘要:暴搜,回溯 const int N=10; bool g[N][N]; int ans; PII st,ed; int n,m,k; inline bool check(int x,int y) { return x>=1 && x<=n && y>0 && y<=m; } void dfs(int
阅读全文
摘要:数据范围10,巨小,直接dfs枚举。 指数型枚举,注意至少要选一个物品。 const int N=15; PII a[N]; int ans=INF; int n; void dfs(int u,int muls,int sumb) { if(u == n) { if(muls == 1 && su
阅读全文
摘要:组合型枚举,注意选满k个而不是n个即可回溯 const int N=25; int a[N]; int n,k; int ans; bool check(int x) { if(x < 2) return false; for(int i=2;i*i<=x;i++) if(x % i == 0) r
阅读全文
摘要:const int N=20; char g[N][N]; bool col[N],dg[N],udg[N]; int n; void dfs(int u) { if(u == n) { for(int i=0;i<n;i++) cout<<g[i]<<endl; cout<<endl; retur
阅读全文
摘要:初始化为INF表示没被炸毁 导弹连同周围四个区域一同炸毁 多次炸毁的区域炸毁时间取第一次炸毁的时间 const int N=50010; int g[310][310]; int dist[310][310]; int n; bool check(int x,int y) { re
阅读全文
摘要: const int N=210; int k[N]; int dist[N]; int n,a,b; inline bool check(int x) { return x>=1 && x<=n; } int bfs() { memset(dist,-1,sizeof dist);
阅读全文
摘要:桶排序 const int N=1010; int cnt[N]; int n,m; int main() { cin>>n>>m; for(int i=0;i<m;i++) { int x; scanf("%d",&x); cnt[x]++; } for(int i=0;i<1000;i++) f
阅读全文
摘要:一眼二分: 二分出最近的两个部落之间的最大距离,判断当前mid距离下能否划分成k个连通块 const int N=1010; PII a[N]; int p[N]; double dist[N][N]; int n,k; double dis(PII a,PII b) { return sqrt((
阅读全文
摘要:每增加一条边都会使连通块数减一 const int N=10010; struct Node { int a,b,c; bool operator<(const Node &W) const { return c<W.c; } }e[N]; int p[N]; int n,m,k;
阅读全文
摘要:图被划分成两块连通块,现用一条边将两块连通块连接起来,使得图的直径(最远的两个点的最短距离)最小 既然要求最短路径,观察数据范围,采用Floyd算法求得任意两点间最短路径 然后枚举所有不连通的两点,判断以当前两点间的距离为边将连通块连通得到的图的直径是否最小(在此之前要预处理出每个点在连通块内所能抵
阅读全文
摘要:最大的一次收费最小,不由联想到二分 二分最大的一次收费mid,则要求从1走到n的路径上经过的点所收取的费用均不能超过mid 为了判断当前取mid能否走到终点,采用贪心的思想,应该走从1到n的最短路径(路径上的权值表示伤害,初始血量为b),即伤害最小 判断在伤害最小的路径上能否走到终点 const i
阅读全文
摘要:最小瓶颈路单次询问模板题,s和t一旦连通输出对应的最大边即可 const int N=2e4+10; struct Node { int a,b,c; bool operator<(const Node &W) const { return c<W.c; } }e[N]; int p[N]; int
阅读全文
摘要:同样可用于求最大生成树,本题只需求出最大生成树的前条边即可 const int N=1e5+10; struct Node { int a,b,c; bool operator<(const Node &W) const { return c>W.c; } }e[N]; in
阅读全文
摘要:原题等价于求最后连通块数为k的情况下的最小生成森林,最大边的权值即为所求 prim算法并不是按照边的权值大小顺序依次加入最小生成树,故采用一个小根堆维护出最小生成树的第k大边,剩下k-1个孤立点,连通块数为k 时间复杂度: const int N=510; do
阅读全文
摘要:已有些边基础上求最小生成树 const int N=1010; double g[N][N]; PDD a[N]; double dist[N]; bool vis[N]; int n,m; double dis(PDD a,PDD b) { return sqrt((a.fi-b
阅读全文
摘要:BFS 由于是无向无权图,采用BFS 自环对于最短路无影响 重边和其它边对最短路径数的影响是一样的,不用做特别处理 采用dp思想即可统计出1号点到每个点的最短路径数 BFS 只入队一次,出队一次,可以抽象成拓扑图。 因为它可以保证被更新的点的父节点一定已经是最短距离了,并且这个点的路径数已经更新完成
阅读全文
摘要:单源最短路&单终点最短路 单终点最短路径其实就可以把所有的边反过来,直接就转换为单源最短路径了。 const int N=1010; vector<PII> g[N]; vector<PII> rg[N]; int dist1[N]; int dist2[N]; bool vis[N]; int n
阅读全文
摘要:代码 const int N=210; vector<PII> g[N]; int tim[N]; int dist[N]; bool vis[N]; int n,m,q; int dijkstra(int st,int ed,int limit) { if(tim[st]>limit |
阅读全文
摘要:map const int N=2e5+10; unordered_map<int,int> mp; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) { int x; cin>>x; mp[x]=i; } cin>>m; while(m--)
阅读全文
摘要:my solution 将转换成,a数组记录A的值,b数组记录B+C的值 问题转化为a,b数组中相等的数的配对数 t为当前配对的数,l记录当前a数组中配对数的个数,r记录b数组中配对数的个数 根据乘法原理,res每次加上 const int N=2e5+10;
阅读全文
摘要:模板题 unordered_map<string,int> mp; int n; int main() { cin>>n; for(int i=0;i<n;i++) { int op; string name; int score; cin>>op; if(op == 1) { cin>>
阅读全文
摘要:模板题 set<int> s; int n; int main() { cin>>n; for(int i=0;i<n;i++) { int op,x; cin>>op>>x; if(op == 1) { if(s.count(x)) puts("Already Exist"); else
阅读全文
摘要:将存在特殊关系的城市之间连边,才用哈希表统计具有特殊关系的城市对数 注意:若某个城市自身到自身存在边,则忽略,因为题目要求是不同的两个城市之间存在特殊的关系 unordered_map<string,int> mp; int n; int main() { ios; cin>>n; int ans=
阅读全文
摘要:为使整张图连通,还应增加的边数为连通块数减一 const int N=5010; int p[N]; int n,m,q; int find(int x) { if(x != p[x]) p[x]=find(p[x]); return p[x]; } int main() { while(cin>>
阅读全文
摘要:从k个奶牛分别dfs,用cnt[i]表示第i个牧场可以被多少头奶牛抵达,只有cnt[i]==k的牧场满足条件。 const int N=1010; vector<int> g[N]; int cow[110]; int cnt[N]; bool vis[N]; int k,n,m; void dfs
阅读全文
摘要:这个城市的路线只能由前面的城市过来(拓扑结构),因此跟自己前面最大经过城市数 +1 比较取最大即可 const int N=1e5+10; vector<int> g[N]; int f[N]; int din[N]; int n,m; void topo() { for(int i=1;i<=n;
阅读全文
摘要:spfa const int N=1510; vector<PII> g[N]; LL dist[N]; bool vis[N]; int n,m; void spfa() { memset(dist,-0x3f,sizeof dist); queue<int> q; q.push(1); dist
阅读全文
摘要:题目链接 注意最后统计要包含所有出度为0的点上的食物链个数 const int N=5010; vector<int> g[N]; int din[N],dout[N]; int f[N]; int n,m; int topo() { queue<int> q; for(int i=1;i<=n;i
阅读全文
摘要:显然地,本题中各项工作是有一定的依赖条件的,也就是说我们在进行工作 X 之前可能需要先进行一些其他的工作。 而完成工作 X 所需的时间和所有 X 所依赖的工作完成的时间的最大值有关。(应该还好理解吧) 在这道题中,我们可以列出一个简单的 DP 转移方程: $$f_i=\max\{pre_i\}+a_
阅读全文
摘要:const int N=1e5+10; vector<int> g[N]; bool vis[N]; int n,m; void dfs(int u) { vis[u]=true; cout<<u<<' '; sort(g[u].begin(),g[u].end()); for(int i=0;i<
阅读全文
摘要:暴力: const int N=10; int f[N][N][N][N]; int g[N][N]; int n; int main() { cin>>n; while(1) { int a,b,c; cin>>a>>b>>c; if(!a && !b && !c) break
阅读全文