ZJNU 1213 - 取水——高级】的更多相关文章

某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这个N+1村庄相连,才能保证所有村庄有水 而村庄i连接到村庄N+1的费用,就可以直接理解为打井的费用Wi 其余部分使用Kruskal最小生成树即可 /* Written By StelaYuri */ #include<cstdio> #include<algorithm> using…
寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索dis1[i]+dis2[i]值最大的输出 /* Written By StelaYuri */ #include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef pair<short,int> P;…
根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把这些块当作信号发出源,就可以使全图都能够收到信号 所以答案就是入度为0的块的数量 (因为跑完程序刚好卡了时间限制,所以使用了缓冲区读入优化,最终程序耗时78ms) /* Written By StelaYuri */ #pragma GCC optimize(3) #include<bits/std…
类似于1213取水 可以把空投当作第0个城市 最后将0~n的所有城市跑最小生成树 /* Written By StelaYuri */ #include<iostream> #include<algorithm> using namespace std; struct road{ int from,to,cost; bool operator < (const road &a) const{ return cost<a.cost; } }ar[]; ]; int…
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1631    Accepted Submission(s): 616 Problem Description In 12th Zhejiang College Students Games 2007, there was a new stadium built…
Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为0 拿奇数阶进行Nim博弈即可 #include<stdio.h> int main(){ ; scanf("%d",&n); ;i<=n;i++){ scanf("%d",&a); ==) s^=a; } puts(s?"Y…
因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Written By StelaYuri */ #include<stdio.h> #include<memory.h> ]={,,-,},dy[]={,,,-},gp[]; ][]; int findp(int p){ return p==gp[p]?p:(gp[p]=findp(gp[p]…
打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最后1e9整无法枚举到 特判一下 /* Written By StelaYuri */ #include<bits/stdc++.h> using namespace std; typedef long long L; L senge(L in){ L ; while(in) out+=in%10L…
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除阶段,可以用 l=((L+prnum[i]-1)/prnum[i])*prnum[i] 计算出区间内的第一个是prnum[i]的倍数的数 注意,如果计算出来的使其本身,取倍数 再用 r=R/prnum…
将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对于航线左边的位置序号已经是排好序的了 那么只需要考虑右边的情况 在所有只开通1条航道的组合中 右侧出现的结果可能是{1},{2},{3},{4} 所以c[1]=1 在所有只开通2条航道的组合中 右侧出现的结果可能是{3,4},{1,2} 这里有两个组合,每个组合位置序号最大的元素分别是4和2,取小…