vis

【BZOJ2878】【NOI2012】迷失游乐园(动态规划)

匿名 (未验证) 提交于 2019-12-03 00:32:02
BZOJ 记得以前考试的时候做过这道题目 这题的暴力还是非常显然的,每次 d f s d f s 一下就好了。 时间复杂度 O ( n 2 ) O ( n 2 ) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std ; #define ll long long #define RG register #define MAX 111111 inline int read() { RG int x= 0 ,t= 1 ;RG char ch=getchar(); while ((ch< '0' ||ch> '9' )&&ch!= '-' )ch=getchar(); if (ch== '-' )t=- 1 ,ch=getchar(); while (ch<= '9' &&ch>= '0' )x=x* 10 +ch- 48 ,ch=getchar(); return x*t; } struct Line{ int v,next,w;}e[MAX<< 1 ]; int h

HDU2717 Catch That Cow(BFS || 最短路解法,SPFA版)

匿名 (未验证) 提交于 2019-12-03 00:30:01
一种方法是BFS。以N为根,每个点有三个子节点。因为每条边的权值都是1,所以第一次广度搜索到K的时间就是答案。 另一种解法是最短路。求N到K的单源最短路即可。 //93ms 2.9MB #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <string> using namespace std ; const int maxn= 1e5 + 100 ; int d[maxn]; bool vis[maxn]; int N,K; void spfa() { memset (d, 0x3f , sizeof (d)); memset (vis, false , sizeof (vis)); vis[N]= true ; d[N]= 0 ; queue < int > que; que.push(N); while (!que.empty()) { int u=que.front();que.pop(); vis[u]= false ; ///没有负环的话,vis可以不要 int v; for ( int i= 0 ;i< 3 ;i++) { if (i== 0 ) v=u+ 1 ; else if (i== 1 ) v=u- 1 ;

POJ 3683 Priest John&#039;s Busiest Day

匿名 (未验证) 提交于 2019-12-03 00:28:02
看这个题目之前可以先看POJ2186复习一下强联通分量的分解 题意:给出N个开始时间和结束时间和持续时间三元组,持续时间可以在开始后或者结束前,问如何分配可以没有冲突。 先解释一下合取范式(离散数学已经学过): 如果合取范式中的每个字句的文字个数不超过两个就称为2-SAT问题 一般性称为n-SAT问题 举个栗子: ( a ∨ b ) ∧ a ( a ∨ b ) ∧ a 在a为false而b为true时整个范式的取值为真。 利用强连通分量的知识,就可以在布尔公式字句个数的线性时间内解决2-SAT问题。在离散数学中我们已经学过蕴含范式。对于 a ∨ b a ∨ b 可以转换为 ( a b ) ∧ ( b a ) ( a b ) ∧ ( b a ) 下面就是建图过程了: 对于每一个布尔变量x,构造两个顶点x和 x x ;以 为有向边建立有向图。 在有向图中,如果a能到达b的话,a为真则b也为真。 因此在同一个强连通分量中所含的所有文字代表的布尔值都相同。 特别注意的是,假设x和 x 都在同一个强连通分量中,则显然,这个强连通分量始终不可能为真。 相反,如果不存在这样的布尔变量,对于每个布尔变量x,让 x所在的强连通分量的拓扑序在 x x 所在的强连通分量之后,(也就是比较二者的拓扑序) 就是使得该公式的值为真的一组合适的布尔变量的解。 ――――――-我是分割线――――――――-

2017蓝桥杯C++B组 国赛

匿名 (未验证) 提交于 2019-12-03 00:18:01
个人理解,仅供参考,欢迎讨论 (5) 标题:对局匹配 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。 现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。 小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)? 第一行包含两个个整数N和K。 第二行包含N个整数A1, A2, … AN。 对于30%的数据,1 <= N <= 10 对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000 一个整数,代表答案。 样例输入: 10 0 1 4 2 8 5 7 1 4 2 8 样例输出: 6 再比如, 样例输入: 10 1 2 1 1 1 1 4 4 3 4 4 样例输出: 8 资源约定: 峰值内存消耗 < 256M CPU消耗 < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准

1428 漫步校园(记忆化搜索)

匿名 (未验证) 提交于 2019-12-03 00:17:01
漫步校园 Problem Description LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划分为n*n个小方格,代表各个区域。例如LL居住的18号宿舍位于校园的西北角,即方格(1,1)代表的地方,而机房所在的第三实验楼处于东南端的(n,n)。因有多条路线可以选择,LL希望每次的散步路线都不一样。另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。现在他想知道的是,所有满足要求的路线一共有多少条。你能告诉他吗? Input 每组测试数据的第一行为n(2=<n<=50),接下来的n行每行有n个数,代表经过每个区域所花的时间t(0<t<=50)(由于寝室与机房均在三楼,故起点与终点也得费时)。 Output 针对每组测试数据,输出总的路线数(小于2^63)。 Sample Input 3 1 2 3 1 2 3 1 2 3 3 1 1 1 1 1 1 1 1 1 Sample Output 1 6 Author LL 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5

06-图1 列出连通集 (25 分)

匿名 (未验证) 提交于 2019-12-03 00:16:01
给定一个有 N个顶点和 E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到 N 1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数 N( 0)和 E,分别是图的顶点数和边数。随后 E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。 输出格式: v 1 v 2 v k 输入样例: 8 6 0 7 0 1 2 0 4 1 2 4 3 5 输出样例: { 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 } #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int maxn = 15; const int INF = 100000000; bool vis[maxn]; int G[maxn][maxn]; void DFS(int v,int n); void BFS(int v,int n); int main() { int n,m; scanf("%d%d",&n,&m); fill(G[0], G[0]+maxn*maxn, INF); for (int i = 0; i < m;

【模板】spfa

匿名 (未验证) 提交于 2019-12-03 00:15:02
int dis[maxn]; bool vis[maxn]; queue<int>q; void spfa(int x) { mem(dis, 0x3f); mem(vis, false); dis[x] = 0; q.push(x); vis[x] = true; while (!q.empty()) { int t = q.front(); q.pop(); vis[t] = false; for (Re int i = head[t]; i != -1; i = e[i].nxt) { int u = e[i].u; int w = e[i].w; if (dis[u] > dis[t] + w) { dis[u] = dis[t] + w; if (!vis[u]) { q.push(u); vis[u] = true; } } } } } 来源:博客园 作者: thjkhdf12 链接:https://www.cnblogs.com/thjkhdf12/p/11766338.html

2019 China Collegiate Programming Contest Qinhuangdao Onsite

匿名 (未验证) 提交于 2019-12-03 00:14:01
传送门 D - Decimal 题意: 询问 \(\frac{1}{n}\) 是否为有限小数。 思路: 拆质因子,看是不是只包含2和5即可,否则除不尽。 Code #include <bits/stdc++.h> #define MP make_pair #define fi first #define se second #define sz(x) (int)(x).size() using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 1e5 + 5; int t,n; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef Local freopen("../input.in", "r", stdin); freopen("../output.out", "w", stdout); #endif cin>>t; while(t--){ cin>>n; while(n%2==0){ n/=2; } while(n%5==0){ n/=5; } if(n!=1)cout<<"Yes\n"; else cout<<"No\n"; } return 0; } E - Escape

「ZJOI2006」物流运输

匿名 (未验证) 提交于 2019-12-03 00:14:01
题目 【内存限制:$256MiB$】 【时间限制:$1000ms$】 【标准输入输出】 【题目类型:传统】 【评测方式:文本比较】 【题目描述】 物流公司要把一批货物从码头 A 运到码头 B。由于货物量比较大,需要 $n$ 天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。 由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输线路,让货物能够按时到达目的地。但是修改路线是一件十分麻烦的事情,会带来额外的成本,因此物流公司希望能够订一个 $n$ 天的运输计划,使得总成本尽可能地小。 【输入格式】 第一行是四个整数 $n(1\le n\le 100),m(1\le m\le 20),K,e$。$n$ 表示货物运输所需天数,$m$ 表示码头总数,$K$ 表示每次修改运输路线所需成本。 接下来 $e$ 行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度 $(>0)$。其中码头 A 编号为 $1$,码头 B 编号为 $m$。单位长度的运输费用为 1。航线是双向的。 再接下来一行是一个整数 $d$,后面的 $d$ 行每行是三个整数 $P(1<P<m),a,b(1\le a\le b\le n)$。表示编号为 $P$ 的码头从第 $a$ 天到第 $b$ 天无法装卸货物

SAT算法

匿名 (未验证) 提交于 2019-12-03 00:10:02
今早用微云打的笔记...头大 我惊,这不是可爱的离散吗?! 手热来了一发模板题 https://www.luogu.org/problem/P4782 贴 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+5; 4 int n,m,a,b,fla,flb,cnt,head[N<<1]; 5 int dfn[N<<1],low[N<<1],vis[N<<1],col[N<<1],scnt,idx; 6 stack<int> st; 7 struct edge{ 8 int to,next; 9 }e[N<<1]; 10 inline void addedge(int a,int b) 11 { 12 e[++cnt]={b,head[a]}; 13 head[a]=cnt; 14 } 15 void tarjan(int u) 16 { 17 dfn[u]=low[u]=++idx;vis[u]=1; 18 st.push(u); 19 for(int i=head[u];i;i=e[i].next) 20 { 21 if(!dfn[e[i].to]) tarjan(e[i].to),low[u]=min(low[u],low[e[i].to]); 22 else if(vis[e[i].to])