vis

Amber

回眸只為那壹抹淺笑 提交于 2019-12-04 06:36:22
训练做的题里有板子单独拉出来。 欧拉筛 1 int vis[N+5],prim[N+5]; 2 int cnt; 3 void Eular() 4 { 5 vis[0]=vis[1]=1; 6 for(int i=0;i<N;i++) 7 if(!vis[i]) 8 { 9 prim[cnt++]=i; 10 for(ll j=(ll)i*i;j<N;j+=i) vis[j]=1; 11 } 12 } View Code 辗转相除法求逆元 1 ll ans,re; 2 void e_gcd(ll a,ll b) 3 { 4 if(b==0) 5 { 6 ans=1,re=0; 7 return; 8 } 9 e_gcd(b,a%b); 10 ll temp=ans; 11 ans=re; ///*** 12 re=temp-a/b*re; 13 } View Code SPFA找环【bfs 1 int vis[N]; 2 bool spfa_bfs() 3 { 4 ans[s]=v; 5 vis[s]=1; 6 queue<int> qu; 7 qu.push(s); 8 while(!qu.empty()) 9 { 10 int node=qu.front(); 11 qu.pop(); 12 vis[node]=0; 13 for(int i=1;i<=n;i++) 14 {

【noip2017】

偶尔善良 提交于 2019-12-04 06:34:40
noip2017 小凯的疑惑 看到了一个简单易懂的证明 设 \(x\) , \(x\equiv ma(mod\ b)(0\le m<b)\) (因为 \(m\ge b\) 的话可以表示为 \(ma=(m\%b)*a+\lfloor m/b\rfloor*b*a=(m\%b)a+(n+\lfloor m/b\rfloor)b\) 而 \(0\le m\%b< b\) ) 即 \(x=ma+nb\) 显然 \(n\ge0\) 时一定能表示出来,所以 \(n=-1\) , \(0\le m<b-1\) 所以最大值为 \((b-1)a-b=ab-a-b\) 时间复杂度 我lxy就是死,从这里跳下去,也不会做这道恶熏熏的题的! 逛公园 先dij跑一遍最短路 然后再类似dp来计算有多少条 若当前 \(used[u][val]==1\) 说明这个点还未走完又被进入了,构成了一个 \(0\) 环 无解 int tot=0,head[N]; struct edge{int v,w,nxt;}e[M]; void add(int u,int v,int w){e[++tot]=(edge){v,w,head[u]},head[u]=tot;} int dis[N];bool vis[N]; priority_queue<pii>q; void clean(){memset(dis,inf,sizeof

树结构

試著忘記壹切 提交于 2019-12-04 06:34:07
树 URAL1039 Anniversary Party \(O(n)\) 一棵树, 相邻点不能同时选, 问最大点权和 int ind[MAXN], val[MAXN]; int f[MAXN][2]; void DFS(int u, int fa) { f[u][1] += val[u]; for (int i = head[u]; i; i = adj[i].nex) { int v = adj[i].to; if (v == fa) continue; DFS(v, u); f[u][0] += max(f[v][0], f[v][1]); f[u][1] += f[v][0]; } } int main() { n = in(); for (int i = 1; i <= n; ++ i) val[i] = in(); for (int i = 1; i < n; ++ i) { int l = in(), k = in(); ++ ind[l]; addedge(k, l); } for (int i = 1; i <= n; ++ i) if (!ind[i]) { DFS(i, 0); printf("%d\n", max(f[i][0], f[i][1])); } return 0; } CF1038A.The Fair Nut and the Best Path

华容道

帅比萌擦擦* 提交于 2019-12-04 04:30:53
先扔个代码了……之后再写详细点吧 感谢@Erutsiom 巨佬的解读题目 dalao题解链接 //by Saber Alter Official //Erishikigal & Ishtar #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <queue> //#define Kama typedef long long ll; typedef unsigned long long ull; const int N = 35, inf = 0x3f3f3f3f; int n, m, q, ex, ey, sx, sy, tx, ty; bool G[N][N], OK[N][N][5];//OK[i][j][k]表示绿色格子在(i,j)位置的k方向是否能有空白格子 int mv[4][2] = {{-1, 0},{1, 0},{0, -1},{0, 1}};//0上 1下 2左 3右 /*建边操作*/ struct node { int to, next, val; }edge[5015]; int head[5015], cnt; inline void add_edge(int u,

DFS BFS 入门......

这一生的挚爱 提交于 2019-12-04 04:23:26
DFS ​ 枚举所有可以到达目标状态的路径,递归或者借助栈来实现,对一个传入状态,遍历它的子状态,对每一个都进行判断,若合法,则递归搜索这一子状态,直到达成目标条件或者状态不合法,则回溯到父亲节点,搜索下一个子状态。 递归: bool judge(参数列表){ //参数不合法或越界时返回false 否则返回true } void dfs(传入状态){ if(达成目标条件){ 输出信息或者修改信息; return; } for(遍历传入状态的所有子状态){ if(judge(子状态)){ 传入状态加标记; dfs(子状态); 传入状态取消标记//回溯 } } } 洛谷P1605 迷宫 int n,m,t,fx,fy,vis[10][10],arr[10][10],dict[4][2] = {{-1,0},{1,0},{0,-1},{0,1}},ans = 0; bool judge(int i,int j){ if(i < 1 || i > n || j < 1 || j > m) return false;//出边界 if(arr[i][j] || vis[i][j]) return false;//不合法 障碍 return true; } void dfs(int i,int j){ if(i == fx && j == fy){ ++ans; return; } for

考试整理

大憨熊 提交于 2019-12-04 02:11:34
考试整理 ​ 今天真 不错 进行了一波模拟考试 T1 小 R 与排列 其实 \(next\_ permutation\) 还是很好用的,但是他不让(我就呵呵了 我们可以考虑一下一个性质: 要是想求下一个排列需要从最后一位往前找,找到后 \(x\) 位的数列他不是那 \(x\) 个数的最后一个排列(难♂以描述) 其实就是手动的模拟 \(STL\) 中 \(next\_permutation\) 的实现就是了 在当前序列中,从尾端向前寻找两个相邻元素,前一个记为 \(*i\) ,后一个记为 \(*t\) ,并且满足$*i $< \(*t\) (这样 \(*t\) 后面的数都是递减的)。然后再从尾端寻找另一个元素 \(*j\) ,如果满足 \(*i < *j\) ,即将第 \(i\) 个元素与第 \(j\) 个元素对调(这样 \(*t\) 后面的数仍然保持递减),并将第 \(t\) 个元素之后(包括 \(t\) )的所有元素颠倒排序,即求出下一个序列了。 \(next\_permutation\) 的函数原型如下: template<class BidirectionalIterator> bool next_permutation( BidirectionalIterator _First, BidirectionalIterator _Last ); template<class

洛谷P2622 关灯问题II (二进制枚举+bfs

耗尽温柔 提交于 2019-12-04 01:05:39
题目描述 现有n盏灯,以及m个按钮。每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果。按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管;如果为-1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是0,无论这灯是否开,都不管。 现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。 输入格式 前两行两个数,n m 接下来m行,每行n个数,a[i][j]表示第i个开关对第j个灯的效果。 输出格式 一个整数,表示最少按按钮次数。如果没有任何办法使其全部关闭,输出-1 输入输出样例 输入 #1 复制 3 2 1 0 1 -1 1 0 输出 #1 复制 2 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 150; 4 bool vis[N]; 5 int mmp[N][N],m,n,num; 6 struct qwq{ 7 int now,step; 8 }; 9 void bfs(int n ){ 10 queue<qwq>Q;qwq f; 11 f.now = n;f.step = 0;Q.push(f); 12 while(!Q.empty()){ 13 qwq orz = Q

题解 AT1221 【水筒】

北慕城南 提交于 2019-12-04 00:37:17
题目链接 Solution 水筒 题目大意:一个 \(n \times m\) 的矩阵里有一些墙不能走,有一些建筑物,有一些地方是原野。每走过一格原野需要消耗一份水,建筑物可以将水壶补满。多次询问从一个建筑物到另一个建筑物水壶容量至少为多少。 Kruskal重构树 分析: 首先不难想到暴力,我们把所有可以相互到达的建筑物两两连边,如果我们要使得最大边权尽量小那么我们就要求最小生成树。证明考虑贪心:不断加边直到两点连通,这就是Kruskal的过程。 求树上两点间边权的最大值就是Kruskal重构树的板子题 但是如果我们暴力枚举所有建筑物无法承受,但是我们发现有些边是没有用的,我们可以考虑类似于缩点的方法。我们给每个建筑物一个颜色,然后同一颜色的点离它最近的加油站都相同 这样我们只需要枚举每个点以及和它相邻的点,如果颜色不同连边即可,这个可以在bfs的时候顺便计算,染色发现已经染过的不同色点就连边 #include <cstdio> #include <vector> #include <queue> #include <utility> #include <algorithm> using namespace std; const int maxn = 2e3 + 100,maxp = 4e5 + 100,maxdep = 25; int n,m,p,q,vis[maxn][maxn

POJ 2632 Crashing Robots

狂风中的少年 提交于 2019-12-04 00:11:06
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13304 Accepted: 5545 Description In a modernized warehouse, robots are used to fetch the goods. Careful planning is needed to ensure that the robots reach their destinations without crashing into each other. Of course, all warehouses are rectangular, and all robots occupy a circular floor space with a diameter of 1 meter. Assume there are N robots, numbered from 1 through N. You will get to know the position and orientation of each robot, and all the instructions, which are carefully (and mindlessly) followed by the

【noip2014】

一个人想着一个人 提交于 2019-12-03 21:06:16
noip2014 生活大爆炸版石头剪刀布 模拟== void rule(int x,int y){ if(x==0&&y==1) ++bb; if(x==0&&y==2) ++aa; if(x==0&&y==3) ++aa; if(x==0&&y==4) ++bb; if(x==1&&y==0) ++aa; if(x==1&&y==2) ++bb; if(x==1&&y==3) ++aa; if(x==1&&y==4) ++bb; if(x==2&&y==0) ++bb; if(x==2&&y==1) ++aa; if(x==2&&y==3) ++bb; if(x==2&&y==4) ++aa; if(x==3&&y==0) ++bb; if(x==3&&y==1) ++bb; if(x==3&&y==2) ++aa; if(x==3&&y==4) ++aa; if(x==4&&y==0) ++aa; if(x==4&&y==1) ++aa; if(x==4&&y==2) ++bb; if(x==4&&y==3) ++bb; } int main(){ rd(n),rd(na),rd(nb); for( int i=1;i<=na;++i) rd(a[i]); for(r int i=1;i<=nb;++i) rd(b[i]); int x=0,y=0;//从0开始!!!!!