vis

Leetcode刷题之路(51-60)

微笑、不失礼 提交于 2019-12-10 08:48:39
51.N皇后 N皇后题目链接 N皇后就是同一行,同一列,同一对角线只能存在一个皇后,而输入是n*n格子,答案让你输出对应的方案 private List<List<String>> results; public List<List<String>> solveNQueens(int n) { results = new ArrayList<>(); if(n==0){ results.add(new ArrayList<>()); return results; } boolean [][] vis= new boolean[n][n]; dfs(0,n,vis);//从第一排开始 return results; } private void dfs(int x,int n,boolean [][] vis){ if(x==n){ List<String> list = new ArrayList<>(); for(int i=0;i<n;i++){ StringBuilder stringBuilder = new StringBuilder(); for(int j=0;j<n;j++){ if(vis[i][j]){ stringBuilder.append("Q"); } else{ stringBuilder.append("."); } } list.add

P2685 [TJOI2012]桥

百般思念 提交于 2019-12-10 03:03:18
Debug一下午,没想到把n写成m,出锅了。。。 题意:1-n带权无向图,求删掉一条边使之后的最短路最长,输出这个值并输出删边的方案数 正解:先跑两遍dij,然后把最短路的边标记,考虑最短路1---s------t-----n    存在1----s-----x----y----t----n 删掉s---t(因为还要走最短路),所以要维护s---t的最小值(不经过s---t)    因此可以用线段树,    先bfs求出lr,(x:l=s,r=t )    把1-----s------x------y------t------n的长度放在线段树上维护 #include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> #include<queue> using namespace std; #define int long long #define olinr return #define _ 0 #define love_nmr 0 #define DB double inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') f=-f; ch

【网络流24题】最长k可重区间集问题

◇◆丶佛笑我妖孽 提交于 2019-12-10 02:36:43
这是一道我一开始没想出来的题。 题面 https://www.luogu.org/problemnew/show/P3358 题解 离散化。 图的基础是一条长链,流量为$k$,区间是从$l$指向$r$的边,流量为$1$,费用为长度。 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<vector> #define ri register int #define N 5000 #define S 0 #define INF 1000000007 using namespace std; int n,k,T; int l[550],r[550],v[550],dc[1450]; int read() { int ret=0,f=0; char ch=getchar(); while (ch>'9' || ch<'0') f|=(ch=='-'),ch=getchar(); while (ch>='0' && ch<='9') ret*=10,ret+=(ch-'0'),ch=getchar(); return f?-ret:ret; } struct graph { vector<int> to,w,c; vector<int> ed[N]

CodeForces - 103B(思维+dfs找环)

心不动则不痛 提交于 2019-12-07 18:13:32
题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作。美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼怪。 然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。 于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。 第一次射击的分析结果会反映在一张由n个点和m条边组成的无向图上。现在让我们来确定这张图 是不是可以被认为是章鱼怪。 为了简单起见,我们假设章鱼怪的形状是这样,他有一个球形的身体,然后有很多触须连接在他的身上。可以表现为一张无向图,在图中可以被认为由三棵或者更多的树(代表触须)组成,这些树的根在图中处在一个环中(这个环代表球形身体)。 题目保证,在图中没有重复的边,也没有自环 思路 法1: 按题意用dfs找无向图的环,若找到一个环且整个图是连通的,那么yes。 法2: 设环上有k个点,那么那些树除了根节点一共有n-k个点,而x个点的树有x-1条边,现在去掉了他们的根节点,所以有n-k条边,再加上环上有k条边,n-k+k = m。 所以可以直接判断图是否连通而且n==m。 代码 法1: #include<bits/stdc++.h> using namespace std; #define inf

后缀数组的应用

ⅰ亾dé卋堺 提交于 2019-12-07 01:13:44
后缀排序 题目链接: P3809【模板】后缀排序 sa[i]表示排名为i的后缀的起始位置的下标 #include<bits/stdc++.h> using namespace std; const int maxx = 1e6+10; char s[maxx]; int y[maxx],x[maxx],c[maxx],sa[maxx]; int rk[maxx],height[maxx],wt[30]; int n,m; void get_sa() { for(int i=1;i<=n;i++)c[x[i]=s[i]]++; //c数组是桶 //x[i]是第i个元素的第一关键字 for(int i=2;i<=m;i++)c[i]+=c[i-1]; for(int i=n;i>=1;i--)sa[c[x[i]]--]=i; for(int k=1;k<=n;k<<=1) { int num=0; for(int i=n-k+1;i<=n;i++)y[++num]=i; //y[i]表示第二关键字排名为i的数,第一关键字的位置 //第n-k+1到第n位是没有第二关键字的,所以排名在最前面 for(int i=1;i<=n;i++)if(sa[i]>k)y[++num]=sa[i]-k; for(int i=1;i<=m;i++)c[i]=0; for(int i=1;i<=n;i++

PAT-1111 Online Map (30分) 最短路+dfs

吃可爱长大的小学妹 提交于 2019-12-06 21:00:31
明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好 1.没有读清题目要求,或者说没有读完题目,明天一定要注意 2.vis初始化的时候从1初始化到n,应该从0开始,以后初始化就从0到n即可 题目大意:给一张地图,两个结点中既有距离也有时间,有的单行有的双向,要求根据地图推荐两条路线:一条是最快到达路线,一条是最短距离的路线。 第一行给出两个整数N和M,表示地图中地点的个数和路径的条数。接下来的M行每一行给出:道路结点编号V1 道路结点编号V2 是否单行线 道路长度 所需时间 要求第一行输出最快到达时间Time和路径,第二行输出最短距离Distance和路径 就用两次dij+dfs即可,好嘛,今晚dfs也不用练了.最好明天出一道这道题 #include <iostream> #include<bits/stdc++.h> #define each(a,b,c) for(int a=b;a<=c;a++) #define de(x) cout<<#x<<" "<<(x)<<endl using namespace std; const int maxn=500+5; const int inf=0x3f3f3f3f; int T[maxn][maxn]; int dis1[maxn]; int dis2[maxn]; bool vis[maxn];

PAT(甲级)2017年秋季考试

倾然丶 夕夏残阳落幕 提交于 2019-12-06 14:01:21
PAT(甲级)2017年秋季考试 还有一题由于上午心情复杂。。没调试完。待补。 A Cut Integer 模拟题 #include<bits/stdc++.h> using namespace std; typedef long long ll; int n; int getLen(ll x){ int len = 0; while(x){ len++; x/=10; } return len; } int main(){ cin>>n; while(n--){ ll x; cin>>x; int len = getLen(x); ll temp = x; int t = 0; ll right = 0; ll rightTemp = 0; ll left = 0; while(t<len/2){ rightTemp = rightTemp * 10 + temp%10; temp/=10; t++; } while(rightTemp){ right = right * 10 + rightTemp%10; rightTemp/=10; } left = temp; if(left == 0 || right == 0){ puts("No"); }else{ if(x%(left*right) == 0) puts("Yes"); else puts("No"); } }

YSU小吃街

痞子三分冷 提交于 2019-12-06 12:52:48
貌似百度没题解 贪心是贪不过的,举个例子 5 4 10 1 2 2 2 4 3 3 4 2 4 5 3 还有注意不连通情况 1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<string> 6 #include<cstring> 7 #include<algorithm> 8 #include<functional> 9 #include<iomanip> 10 #include<numeric> 11 #include<cmath> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #include<map> 16 #include<cctype> 17 const double PI = acos(-1.0); 18 const int INF = 0x3f3f3f3f; 19 const int NINF = -INF - 1; 20 const int maxn = 1e5 + 5; 21 typedef long long ll; 22 #define MOD 1000000007 23 using namespace std; 24 int n, m, st; 25 int

最短路--Dijkstra

纵然是瞬间 提交于 2019-12-06 07:56:39
Dijkstra--单源最短路 算法思想 每次选择没有被访问过的,并且dis最小的点,加入集合,更新dis 模板 int dis[maxn],vis[maxn]; //距离,标记 void dijkstra() { int k = 1,mi; vis[k] = 1; //初始化 mem(dis,inf); //wa for(int i = 1; i <= n; i++) dis[i] = a[k][i]; for(int i = 1; i < n; i++) //共选n-1次 { mi = inf; for(int j = 1; j <= n; j++) //每次选dis最小的点,加入集合 { if(!vis[j] && mi > dis[j]) { mi = dis[j]; k = j; } } if(mi == inf) break; vis[k] = 1; for(int j = 1; j <= n; j++) //再根据选的点,更新其他点 { if(!vis[j] && dis[j] > dis[k]+a[k][j]) dis[j] = dis[k]+a[k][j]; } } } 例题 参考博客 https://blog.csdn.net/kprogram/article/details/81225176 来源: https://www.cnblogs.com

江西理工摸底测试

我们两清 提交于 2019-12-06 07:02:19
A题:water: 一开始写的时候,写超时了:一是有的条件没加上去,二是没有进行优化。 后来用了set将没有装满的瓶子的下标放进去,并进行排序,然后二分查找找后面比他大的下标。 我觉得这样的思路非常的ok,应该没毛病,但是就是老wa,原来在后面的循环没有赋初值。 下面是AC代码 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <set> 5 6 using namespace std; 7 const int ma = 1e5 + 10; 8 int t,n,m; 9 set<int> s; 10 struct node 11 { 12 int x,y; 13 }num[ma]; 14 15 int main() 16 { 17 scanf("%d",&t); 18 while(t--) 19 { 20 s.clear(); 21 scanf("%d%d",&n,&m); 22 for(int i = 1;i <= n;i++) 23 scanf("%d",&num[i].x),s.insert(i),num[i].y=0; 24 int a,b,c; 25 while(m--) 26 { 27 scanf("%d%d",&a,&b); 28 c = min(num[a].x -