vis

洛谷 P5663 加工零件

别说谁变了你拦得住时间么 提交于 2019-12-05 10:09:29
题目传送门 解题思路: 最暴力的做法 : bfs模拟,每次将一个阶段的所有点拿出来,将其所有直连的点都放进队列,知道本阶段结束,最后看1号点会不会在最后一个阶段被放入队列.(洛谷数据40分) 优化了一下代码: 上面的做法我用了两个队列,发现代码可以优化一下,用一个队列.(洛谷数据55分). 正解: 对于一个点,如果它加工的零件是偶数阶段,则在一定范围内与它偶数距离的点都要提供原料. 对于一个点,如果它加工的零件是奇数阶段,则在一定范围内与它奇数距离的点都要提供原料. 那么这个一定范围是多少呢? 就是小于等于这个点加工阶段大小的范围. 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<cstring> 5 #include<queue> 6 7 using namespace std; 8 9 int n,m,qq,x,y; 10 bool vis[500001]; 11 queue<int> q,q1; 12 struct kkk{ 13 vector<int > a; 14 int len; 15 }e[100001]; 16 17 inline void solve() { 18 int id,s; 19 scanf("%d%d",&id,&s); 20 memset(vis,0

损坏的RAID5

心不动则不痛 提交于 2019-12-05 07:34:55
损坏的RAID5 string讀入卡cin 関同步 ios::sync_with_stdio(false) 由塊號映射到具體位置 塊號id對應第col個字符串 字符串開始的位置st 1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 #include<algorithm> 5 #include<vector> 6 #include<queue> 7 using namespace std; 8 int n,s,l; 9 bool vis[1005]; 10 string t[1005]; 11 int calraw(int id) 12 { 13 return id/(s*(n-1)); 14 } 15 int calcol(int id) 16 { 17 int st = (n-calraw(id)%n)%n; 18 id -= (id/((n-1)*s))*(n-1)*s; 19 int ans = (st + id/s)%n; 20 // cout<<st<<" stid "<<id<<endl; 21 return ans; 22 } 23 int st(int id) 24 { 25 int r=calraw(id); 26 int ans=r*8*s+8*(id%s); 27 return ans;

Codeforces Round #600 (Div. 2)

不羁岁月 提交于 2019-12-04 21:45:23
A. Single Push 给定数组A,B,能否选取A中连续一段把A变得跟B相同 #include<bits/stdc++.h> using namespace std; #define int long long #define si signed #define pb push_back #define fi first #define se second #define endl '\n' #define P pair<int,int> int t,n; int A[100000+5]; int B[100000+5]; signed main() { scanf("%I64d",&t); while(t--){ scanf("%I64d",&n); for(int i=0;i<n;i++){ scanf("%I64d",&A[i]); } for(int i=0;i<n;i++){ scanf("%I64d",&B[i]); } bool f=0; int a=-1; for(int i=0;i<n;i++){ A[i]=B[i]-A[i]; if(A[i]<0){ cout<<"No"<<endl; f=1; break; } } int cnt =0; if(!f){ for(int i=0;i<n;i++){ if(A[i]&&cnt==0){ cnt++;

dijkstra

旧街凉风 提交于 2019-12-04 20:55:08
朴素版 int dist[maxn], g[40][40]; bool vis[maxn]; void dijkstra(int cc) { //cc是单源节点编号 for (int i = 1; i <= n; i++) { dist[i] = g[i][cc]; } dist[cc] = 0; memset(vis, 0, sizeof(vis)); vis[cc] = 1; for (int i = 1; i <= n; i++) { int mark = -1, mindis = INF; for (int j = 1; j <= n; j++) { if (!vis[j] && dist[j] < mindis) { mindis = dist[j]; mark = j; } } vis[mark] = 1; for (int j = 1; j <= n; j++) { if (!vis[j]) { dist[j] = min(dist[j], dist[mark] + g[mark][j]); } } } } 来源: https://www.cnblogs.com/woxiaosade/p/11883150.html

[bzoj1854]游戏

耗尽温柔 提交于 2019-12-04 17:15:48
考虑将武器(a,b)看成一条无向边,那么对于一个连通块 1.当没有环,即是一棵树,那么任选一个点作为根,每条边只选儿子节点即可,显然根要选编号最大的 2.当有环,任选一个环作为根,其余环上的某一条边拆掉使得变成基环树,树边选择儿子,环边按某种顺序选择即可 那么题目相当于要求维护每一个树连通块的最小的最大编号,用并查集维护即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,x,y,ans,f[1000005],vis[1000005]; 4 int find(int k){ 5 if (k==f[k])return k; 6 return f[k]=find(f[k]); 7 } 8 int main(){ 9 scanf("%d",&n); 10 for(int i=1;i<=n+1;i++)f[i]=i; 11 for(int i=1;i<=n;i++){ 12 scanf("%d%d",&x,&y); 13 if (find(x)==find(y))vis[find(x)]=1; 14 else{ 15 if (find(x)>find(y))swap(x,y); 16 vis[find(y)]|=vis[find(x)]; 17 vis[find(x)]=1; 18 f[find(x)]=find(y);

小明种苹果(续)

假装没事ソ 提交于 2019-12-04 16:38:10
问题描述: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m, current, temp, sum = 0, cutTreeNum = 0, t3Num = 0; boolean[] vis = new boolean[n + 5]; for (int i = 0; i < n; i++) { m = scanner.nextInt(); current = scanner.nextInt(); for (int j = 1; j < m; j++) { temp = scanner.nextInt(); if (temp <= 0) { current += temp; } else if (current > temp) { current = temp; vis[i] = true; } } sum += current; } for (int i = 0; i < n; i++) { if (vis[i]) cutTreeNum++; if (vis[(i - 2 + n) % n] && vis[(i

>19/11/16训练赛

我的未来我决定 提交于 2019-12-04 16:18:32
今天下午图论dfs训练赛,5/10,待补,复习了最短路和最小生成树 早上又是一个偷懒的早上 题目 A B C D E F G H I J 做题情况 未做 未做 AC(-3) AC 未做 未做 WA(-11) AC(-1) AC(-2) AC(-5) A(待补) B(待补) C 题意是n个点,m条路,有一条未知的路在维修,求1到n最短路径的最大值。一开始以为是求最长路径,我是个读假题的机器人。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<string> #define inf 0x3f3f3f3f #define mem(k,b) memset(k,b,sizeof(k)) using namespace std; const int maxn=1100; int mp[maxn][maxn],dis[maxn],vis[maxn]; int l,m,n,x,y,w; int pos[maxn]; void dj(int ss) { for(int i=1;i<=n;i++){ vis[i]=0,dis[i]=inf; } dis[1]=0; for(int i=1;i<=n;i++) { int minn=inf;int k=-1;

CF1244F Chips 的题解

有些话、适合烂在心里 提交于 2019-12-04 15:57:38
题目的字面意思: 就是说给出了一个环,然后对于每一个位置i判断他的左右邻居中白色多还是黑色多,哪个多,这个i就变成什么颜色。一次循环称为一次操作,然后问在k次操作之后,这个环是什么样子。 然后环的个数是2e5,k的个数是1e9 看到数据之后,就可以明白,暴力一定是不行的。(废话一句) 然后先给出两个定理: 1、 对于BWWB这样的串,一定是不会再产生任何的变化了,那么我们就可以总结出,如果i位置的左右任意一个位置有一个和他相同,那么i就不会再变了。 2、 如果位置i在第x次操作之后,不会再变化了(参考1),那么他左右的元素一定是在x+1轮不需要再变化了或者左右元素在这之前就已经不需要变化了。 证明方式如下,对于任意一个还在变化的位置来说,左右元素一定和他不一样(类似与010或者101),那么位置i发生变化之后,一定会影响他左右的还在变化的位置,也就是说左右位置一定会在下一轮的操作变成不需要变化的。证明结束。 详细的可以看代码,给了注释。 1 #include <stdio.h> 2 #include <queue> 3 using namespace std; 4 char s[200009]; 5 //预处理,就是可以快速的访问左右邻居,没啥好说 6 #define li (i-1+len)%len 7 #define ri (i+1)%len 8 #define lnow

ACwing94 递归实现排列型枚举 dfs

风流意气都作罢 提交于 2019-12-04 15:56:48
网址:网址: https://www.acwing.com/problem/content/96/ 题意: 把$1$到$n$这$n$个 整数排成一行后随机打乱顺序,输出所有可能的次序。 题解: 其实直接使用$next_permutation$就行,但是我们这次使用递归,我们直接将每一层标记全部从$1$开始,然后使用一个$vis$数组记录该数是否已经被访问,如果没有就选,然后标记$vis$,继续递归,回溯时消除$vis$标记即可。 AC代码: #include <bits/stdc++.h> using namespace std; int sta[15], cnt; int vis[15]; int n; void dfs(int div) { if (div == n) { for (int i = 0; i < n; ++i) printf("%d%c", sta[i], i == n - 1 ? '\n' : ' '); return; } for (int i = 1; i <= n; ++i) { if (!vis[i]) { vis[i] = 1; sta[cnt++] = i; dfs(div + 1); --cnt; vis[i] = 0; } } return; } int main() { scanf("%d", &n); dfs(0); return 0; }

点分治练习

爷,独闯天下 提交于 2019-12-04 15:54:23
P3806 【模板】点分治1 题目链接 解题思路: 点分治,我对于每次询问都直接计算...感觉复杂度挺大的..点分治处理出每个节点到根的距离, 排序后左右指针移动计算长度为k的路径数量 #include <bits/stdc++.h> using namespace std; /* freopen("k.in", "r", stdin); freopen("k.out", "w", stdout); */ // clock_t c1 = clock(); // std::cerr << "Time:" << clock() - c1 <<"ms" << std::endl; //#pragma comment(linker, "/STACK:1024000000,1024000000") #define de(a) cout << #a << " = " << a << endl #define rep(i, a, n) for (int i = a; i <= n; i++) #define per(i, a, n) for (int i = n; i >= a; i--) typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; typedef pair<double,