vis

day5

孤人 提交于 2019-11-26 14:07:12
t1 给出一张有n个点m条边的无向图,现在给出起点s和终点t,每个点还存在一个点权,用01表示,询问在起点带的最少的钱,到达终点的前不少于w,每到达一个点,如果当前点权为1,就减少钱1,否则减少钱 \(\lceil \frac{w}{k} \rceil\) ,并且还要求输出字典序最小的路径, \(n\leq 5\times 10^5,m\leq 10^6\) 。 解 法一: 显然刚开始的前,不妨设为 \(e\) ,不好确定,而又具有单调性,因为e增大剩下的前肯定增大,否则减小,于是可以二分确定e,确定了e以后,现在问题就变成找出一条最优秀的路径,这显然是最短路问题,考虑优先队列bfs,因为钱是单调递减的,于是当前的状态能够到达的最优的状态,就是起点能够到达的最优状态,而对于字典序,只要考虑优先队列当中最小的相同的钱所在的点,取字典序最小那个,最终就可以保证路径字典序的最小(所以不能使用 \(A^*\) ),最终时间复杂度为 \(nlog(n)^2\) 。 参考代码 #include <iostream> #include <cstdio> #include <cstring> #define il inline #define ri register #define ll long long #define Size 500500 #define llmax

Mag——C++

久未见 提交于 2019-11-26 14:04:57
描述 您将获得一棵由无向边连接的树,树上每个节点都分配了一个魔力值 X X i i 。 路径的魔力值被定义为该路径上节点的魔力值的乘积除以该路径上节点的 数量 。 例如 , 路径上有两个点 , 魔力值分别为 3 3 和 和 5 5 , 那么这条路径的魔力值就 为 为 7.5 ( 3*5/2 )。 在给定的树中,找到具有最小魔力值的路径并输出该路径的魔力值。 输入 第一行输入包含整数 N N (1 1 ≤N N ≤ 10 6 6 )。表示树中的节点数。 接下来 1 N-1 行中的每一行包含两个整数,A A i i 和 和 B B i i (1 1 ≤A A i i ,B B i i ≤N N )。表示每 条边连接的两个节点的编号。 接下来 N N 行中的每一行包含一个整数 X X i i (1 1 ≤X X i i ≤ 10 9 9 )。表示第 i i 个节点的 魔力值。 输出 以分数 Q P/Q 的形式输出具有最小魔力值的路径的魔力值 (P P 和 和 Q Q 是互质的整 数)。 保证 P P 和 和 Q Q 小于 10 18 。 分数分布 对于 20% 的数据,N N ≤ 1000 。 对于另外 30% 的数据,不会有节点和超过 2 2 个其他节点直接相连。 样例输入 1 2 1 2 3 4 样例输出 1 3/1 样例输入 2 5 1 2 2 4 1 3 5 2 2 1 1 1

Minimal Power of Prime

戏子无情 提交于 2019-11-26 14:01:51
#include <bits/stdc++.h> using namespace std; const int maxn=1e4+5; typedef long long ll; ll n; int prime[maxn],cnt,e,ans; bool vis[maxn]; void get_prime(){ for(int i=2;i<maxn;i++){ if(!vis[i]) prime[cnt++]=i; for(int j=0;j<cnt&&i*prime[j]<maxn;j++){ vis[i*prime[j]]=true; if(i%prime[j]==0) break; } } } ll mysqrt3(ll x) { ll l=1,r=1e6+5,m; while(l<=r){ m=(l+r)>>1; if(m*m*m==x) return m; else if(m*m*m>x) r=m-1; else l=m+1; } return 0; } int cal(ll n){ ll sqrt2=sqrt(n),sqrt3,sqrt4; if(sqrt2*sqrt2==n){ sqrt4=sqrt(sqrt2); if(sqrt4*sqrt4==sqrt2) return 4; else return 2; } else{ sqrt3=mysqrt3(n); if

Sudoku(简单DFS)

故事扮演 提交于 2019-11-26 13:56:19
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5547 数据比较少,直接暴力DFS,检验成立情况即可 AC代码:但是不知道为什么用scanf,printf输入输出就WA了 1 /* */ 2 # include <iostream> 3 # include <stdio.h> 4 # include <string.h> 5 # include <cstdlib> 6 # include <cmath> 7 # include <climits> 8 # include <deque> 9 # include <queue> 10 # include <stack> 11 # include <vector> 12 # include <map> 13 # include <set> 14 # include <ctime> 15 # include <functional> 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f3f; 19 const int maxn=5e4+50; 20 const ll mod=1e9+7; 21 char ma[25][25]; 22 int vis[25]; 23 int p[25][25];

最大流最小割入门题

▼魔方 西西 提交于 2019-11-26 13:49:34
Dinic板子: const int tmax=1e4+5,inf_int=1e9+5; struct edge{ int to,cap,rev; }; vector<edge> G[tmax]; int level[tmax]; int iter[tmax]; void addedge(int from,int to,int cap) { G[from].push_back((edge){to,cap,G[to].size()}); G[to].push_back((edge){from,0,G[from].size()-1}); } void bfs(int s) { memset(level,-1,sizeof(level)); queue<int> que; level[s]=0; que.push(s); while(!que.empty()) { int v=que.front(); que.pop(); for(int i=0;i<G[v].size();i++) { edge &e=G[v][i]; if(e.cap>0&&level[e.to]<0) { level[e.to]=level[v]+1; que.push(e.to); } } } } int dfs(int v,int t,int f) { if(v==t) return f; for(int &i

牛客假日团队赛8:H.Cell Phone Network(最小支配集)

怎甘沉沦 提交于 2019-11-26 12:11:58
链接: https://ac.nowcoder.com/acm/contest/1069/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage their social interaction. This, however, requires him to set up cell phone towers on his N (1 ≤ N ≤ 10,000) pastures (conveniently numbered 1…N) so they can all communicate. Exactly N-1 pairs of pastures are adjacent, and for any two pastures A and B (1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B) there is a sequence of adjacent pastures such that A is the first pasture in the sequence and B is the

2019UMS培训day5解题报告

泪湿孤枕 提交于 2019-11-26 12:09:37
T1: 链接: https://www.luogu.org/problem/T92563 $sol1$:把所有的加起来,减去个数恒为$2$的,再减去$2 \times (n-1)$,即为答案。使用快速幂处理,还要注意答案可能出现负数。 $sol2$:推出矩阵式子后用矩阵快速幂来维护。 代码$(sol1)$: #include <bits/stdc++.h> const int mod = 19260817; typedef long long ll; using namespace std; ll n; ll qpow(ll x, ll y) { ll ans = 1; while(y) { if(y & 1) ans = (ll)(ans % mod * x % mod) % mod; x = (ll)(x % mod * x % mod) % mod; y >>= 1; } return ans % mod; } int main() { cin >> n; cout << ((qpow(2, n) - (2 * n)) % mod + mod) % mod << endl; return 0; } T2: 链接: https://www.luogu.org/problem/T92564 $sol1$:使用一维差分,然后执行$y2-y1$次。 $sol2$:直接二维差分

最短路总结

大兔子大兔子 提交于 2019-11-26 10:28:34
---恢复内容开始--- 看到的结论:E是边数,n是点数量。 Dijkstra(迪杰斯特拉): 适用于权值为非负的图的单源最短路径,优先队列优化 O(E+nlgn) SPFA: 适用于权值有负值,且没有 负环 的图的单源最短路径,SPFA的最坏情况是O(Vn). Floyd(弗洛伊德):任意两点 之间的最短路径。O(n^3) 给出结论: (1)单源最短路,当权值为 非负 时,用Dijkstra,。 (2)单源最短路,当权值有负值,且没有负环,则用SPFA,SPFA能检测负圈,但是不能输出负圈。 (3)数据小,无负环,任意两点之间的距离。弗洛伊德 弗洛伊德 二 迪杰斯特拉 朴实无华迪杰斯特拉 #define inf 0x3f3f3f3f const int N = 100; int ma[N][N]; int vis[N], dis[N], ne[N]; void dijkstra(int u){ memset(dis, inf, sizeof(dis)); memset(vis, 0, sizeof(vis)); int st = u; for(int i = 1; i <= n; i++){ dis[i] = min(dis[i], ma[st][i]); } for(int i = 1; i < n; i++){ int mi = inf; for(int j = 1; j <

一些模板

China☆狼群 提交于 2019-11-26 10:26:56
string 操作: 1 =,assign() //赋以新值 2 s.assign(str); 3 s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”赋给字符串 4 s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s 5 s.assign(“gaint”); 6 s.assign(“nico”,5);//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串 7 s.assign(5,’x’);//把五个x赋给字符串 8 b) swap() //交换两个字符串的内容 9 c) +=,append(),push_back() //在尾部添加字符 10 d) insert() //插入字符 11 e) erase() //删除字符 12 g) replace() //替换字符 13 h) +//串联字符串 14 ==,!=,<,<=,>,>=,compare() //比较字符串 15 string s(“abcd”); 16 s.compare(“abcd”); //返回0 17 s.compare(“dcba”); //返回一个小于0的值 18 s.compare(“ab”); //返回大于0的值 19 s.compare(s); //相等 20 s.compare(0,2,s,2,2); /

正睿暑期培训day4考试

谁说胖子不能爱 提交于 2019-11-26 10:22:56
链接 A 求出来到每座山的距离后,就可以计算出每只猫等待的时间与出发时间的关系。 如果出发时间为 \(x\) ,求出来只猫的等待时间。这里用 \(b_i\) 表示第i只猫的等待时间。然后我们将这些时间排序。问题就转化为了,从m个有序的数中,选出p个,每个数字覆盖以其为开头的一段区间。这段区间的贡献为 \(x\times num-sum\) ,其中x为当前选定的数字。 \(num\) 为覆盖区间的长度。 \(sum\) 为覆盖区间的数字和。 这样就可以得到一个 \(m^2p\) 的朴素dp。 \(f[i][j]\) 表示选出i个点,覆盖前j个元素,最小贡献。 \(f[i][j]=\min\limits_{k=1}^i\{f[i-1][k - 1]+b[k]\times j+(j-k)\times b[k]-(sum[j]-sum[k]))\}\) 然后就很斜率优化了。。。 /* * @Author: wxyww * @Date: 2019-08-07 19:31:15 * @Last Modified time: 2019-08-07 19:49:05 */ #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #include<ctime> #include<bitset> #include