vis

牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)

*爱你&永不变心* 提交于 2019-12-02 16:01:35
牛客练习赛53 D德育分博弈政治课 链接: https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子。他玩的骰子不同,他的骰子有六面,每面上写着一个 1 到 9 之间的数字,且六个面上的数字互不相同。现在他手上有 n 个这样的骰子。政治课学长为了在小学妹面前树立威信,决定难为一下德育分。他向德育分提出了 Q 个问题,每个问题是一个字符串,且只含有‘1’~‘9’之间的字符,若德育分可以用他手上的骰子组成这个字符串,则这一回合德育分获胜,否则政治课获胜。若字符串长度为 L,则德育分从他的骰子中选出 L 个,选定每个骰子朝上的面,以一定顺序排列后恰好是这个字符串,则定义为可以组成这个字符串。 输入描述: 第一行输入 n,Q。接下来 n 行,每行输入一个长度为 6 的字符串,每个字符都在‘1’~‘9’。接下来 Q 行,每行一个字符串,每个字符都在‘1’~‘9’。且 Q 个字符串的总长度不超过 2000000。1<=n<=500000,1<=Q<=100。 输出描述: 对于每一回合,若德育分获胜,输出“dyf”。若政治课获胜,输出“zzk”。 示例1 输入 复制 3 3 137628 987654 123456 288 2288 333 输出 复制 dyf zzk zzk 思路: 如图建立流量网络, S是源点

tomcat性能调优和性能监控(visualvm)

為{幸葍}努か 提交于 2019-12-02 14:44:47
tomcat 服务器优化 1、 JDK 内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。 Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大. Tomcat默认可以使用的内存为128MB,Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】 -XX:PermSize=64M -XX:MaxPermSize=128m' 需要把几个参数值调大。例如: JAVA_OPTS='-Xms256m -Xmx512m' 表示初始化内存为256MB,可以使用的最大内存为512MB。 参数详解 - server 启用jdk 的 server 版; - Xms java虚拟机初始化时的最小内存; - Xmx java虚拟机可使用的最大内存; - XX:PermSize 内存永久保留区域 - XX:MaxPermSize 内存最大永久保留区域 -Xmn jvm最小内存 32G 内存配置示例: JAVA_OPTS="$JAVA_OPTS -Xms10g

图论--二分图最佳完美匹配(KM模板)

夙愿已清 提交于 2019-12-02 14:40:45
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 305; const int INF = 0x3f3f3f3f; int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度 int ex_girl[MAXN]; // 每个妹子的期望值 int ex_boy[MAXN]; // 每个男生的期望值 bool vis_girl[MAXN]; // 记录每一轮匹配匹配过的女生 bool vis_boy[MAXN]; // 记录每一轮匹配匹配过的男生 int match[MAXN]; // 记录每个男生匹配到的妹子 如果没有则为-1 int slack[MAXN]; // 记录每个汉子如果能被妹子倾心最少还需要多少期望值 int N; bool dfs(int girl) { vis_girl[girl] = true; for (int boy = 0; boy < N; ++boy) { if (vis_boy[boy]) continue; // 每一轮匹配 每个男生只尝试一次 int gap = ex_girl[girl] + ex_boy[boy] - love[girl][boy]; if (gap == 0) { /

tarjan找有向图强连通分量

寵の児 提交于 2019-12-02 10:49:47
tarjan找强连通分量 有向图强连通分量 在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。 tarjan找强连通算法 算法思想 首先,一个强连通分量形成一个环,或者是一个单点。 如何知道这个环上的某个点呢?即让这个点在dfs中被遍历到两次即可。 我们知道,图可以用dfs遍历,且dfs采用了“栈”的思想,可以用栈实现对强连通分量上的点的保存。一个点及其子孙中存在极大强连通分量,当且仅当该点是其与子孙各点中dfs序最小的那个,否则,若有一个子孙在它之前被遍历到,则能构成一个更大的强连通分量。 具体实现 变量定义 dfn[N]:某个点的dfs序 low[N]:某个点以及其子孙中dfs序最小的值 color[N]:某个点所属的强连通分量的颜色 st[N]:栈,用于储存可能构成强连通分量的点 vis[N]:某个点是否在栈中 代码 void tarjan(int u) { dfn[u]=low[u]=++deep; vis[u]=1; st[++top]=u; int sz=g[u].size(); for(int i=0;i<sz;i++) { int v=g[u][i

(模板)解决带负权最短路径 Bellman-ford 与 SPFA(前者的队列优化)

会有一股神秘感。 提交于 2019-12-02 09:52:55
// 模板记录 // Bellman-ford O(V*E) s到每个点的最短路 1 #include<cstdio> 2 #define INF 0x3f3f3f3f 3 const int MAXN = 100+5; 4 const int MAXM = 10000+5; 5 6 struct node { 7 int u, v, w; 8 } edge[MAXM]; 9 10 int n, m, x;// 点的数量,边的数量,源点 11 int dis[MAXN]; 12 13 bool Bellman_ford() { 14 for(int i = 0; i < n-1; ++i) { 15 for(int j = 0; j != m; ++j) { 16 if(dis[edge[j].v] > dis[edge[j].u] + edge[j].w) { 17 dis[edge[j].v] = dis[edge[j].u] + edge[j].w; 18 } 19 } 20 } 21 bool flag = true; 22 for(int i = 0; i != m; ++i) { 23 if(dis[edge[i].v] > dis[edge[i].u] + edge[i].w) { 24 flag = false; 25 break; 26 } 27 } 28

【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)

落爺英雄遲暮 提交于 2019-12-02 06:45:58
uoj传送门 题意: 二维平面上给出一些点,同时给出一些无向边连接两个点。 现在从 \(1\) 号点出发,经过每条边一次,最终回到 \(1\) 号点。问最终绕原点顺时针旋转最多多少圈。 思路: 直接思考绕原点顺时针转圈不好考虑,因为最终走的一定是一个闭合图形,所以我们可以随便找一条射线,最终顺时针经过这条射线的次数减去逆时针经过这条射线的次数即为答案。 判断是否存在欧拉回路很简单。 接下来我们就来找最大圈数。我们首先贪心给边定向,即每条边都是顺时针走,但这显然最后很可能走不出欧拉回路。 那么我们需要将一些边反向,代价即为这条边对答案的贡献乘以 \(2\) 。 最后根据度数连接源点汇点,跑个最小费用流就行了。 至于为什么最后需要得到最大流才行,因为我们一定需要将所规定数量的边进行反向,这时我们同时还要得到最小代价,所以就是最大流最小费用了。 这跟 这道题 很像,就是多了个费用。 注意一下,可能有一些孤立的点存在,这时也可能存在欧拉回路。 #include <bits/stdc++.h> #define MP make_pair #define fi first #define se second #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() #define INF 0x3f3f3f3f //

CF723D 【Lakes in Berland】

…衆ロ難τιáo~ 提交于 2019-12-02 06:39:11
题目链接 题解 CF723D 【Lakes in Berland】 首先将边界的水用bfs处理掉 再将中间的每一个湖泊处理出来,存入一个结构体内,结构体里记录湖泊大小和开始点 将湖泊排序从小往大填满,并利用开始点进行bfs改变地图 细节见代码: #include<bits/stdc++.h> using namespace std; int n,m,k; int vis[100][100],mapp[100][100]; int dx[5]={0,-1,0,1,0}; int dy[5]={0,0,1,0,-1},cnt; struct SYM{ int cc,sx,sy; }lake[10000]; void bfs(int x,int y,int opt){ queue<int> qx,qy;int siz=0; if(opt==1){ //处理边界 vis[x][y]=1;qx.push(x);qy.push(y); while(!qx.empty()){ int xx=qx.front(),yy=qy.front();qx.pop();qy.pop(); for(int i=1;i<=4;i++){ int nx=xx+dx[i],ny=yy+dy[i]; if(nx==0||ny==0||nx==n+1||ny==m+1) continue; if(vis[nx][ny]

[IOI2008]Island

一个人想着一个人 提交于 2019-12-02 06:28:45
题目链接: Click here Solution: 一句话题意:给定基环树森林,求每颗基环树的直径之和 考虑基环树求直径的方法,考虑基环树套路,把环和树分开考虑 我们先把环找出来,对环上的点的子树求直径,再求出这个点开始的最长链,这个很简单,可以用treedp做 考虑一颗基环树的直径可能有哪些情况:基环树上某棵子树的直径或是一棵子树走到另一颗子树 第一种情在我们dp的时候就处理完了,考虑第二种情况怎么做 从一颗子树走到另一颗子树肯定是要经过环上的点的,所以第二种情况必然是一种这样的形式 \(f[x]+f[y]+dis(x,y)\) 其中 \(f[x]\) 表示以 \(x\) 为起点,终点在其子树内的最长链的长度,在dp中已经处理好了, \(dis(x,y)\) 表示环上两点 \(x,y\) 的距离 我们把环拆成链来考虑,再把这条链倍长,这样它就能描述任意 \(dis(x,y)\) 了 我们考虑记 \(dis[x]\) 表示 \(x\) 到链上第一个点的距离,那么 \(dis(x,y)=dis[x]-dis[y]\) (这里我们钦定 \(x\) 在 \(y\) 之后)则直径可被表述为 \(f[x]+f[y]+dis[x]-dis[y]\) 倘若我们直接对于环上每个点枚举另外一个点来算直径,时间复杂度是 \(O(n^2)\) 的,考虑如何来优化 考虑把上面的式子转化形式: \(f[x

模板 - SPFA

守給你的承諾、 提交于 2019-12-02 03:26:55
普通的SPFA: int top; int head[MAXN]; struct Edge { int v, nxt; int w; } edge[MAXM]; void init() { top = 0; memset(head, -1, sizeof(head)); } void add_edge(int u, int v, int w) { ++top; edge[top].v = v; edge[top].w = w; edge[top].nxt = head[u]; head[u] = top; } bool vis[MAXN]; int cnt[MAXN]; int dis[MAXN]; queue<int>q; bool spfa(int s, int n) { memset(vis, 0, sizeof(vis)); memset(cnt, 0, sizeof(cnt)); for(int i = 0; i < MAXN; ++i) dis[i] = 0x3f3f3f3f; while(!q.empty()) q.pop(); q.push(s); vis[s] = 1; cnt[s] = 1; dis[s] = 0; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i =

Codeforces Round #595 (Div. 3)

隐身守侯 提交于 2019-12-02 03:24:01
第一次这么顺手。。。都是1A。。。。D想了1个小时,想了一个假算法。。。最后20分开E,我叼,简单DP???不负众望的10分钟A掉。。。 A. Yet Another Dividing into Teams 只会有两个队 B1.B2. Books Exchange直接DFS找环,环内的传递时间是一样的。标记一下,线性复杂度。 C1. Good Numbers (easy version) 其实就是3进制表示形式不能有2,那么简单版本直接预处理1-1000然后找第一个大于n的数即可。 #include<bits/stdc++.h> #define LL long long using namespace std; vector<int>ans; bool check(int x){ int flag=0; while(x){ if (x%3==2){ flag=1; break; } x=x/3; } if (flag==1)return 0; else return 1; } void init(){ for (int i=1;i<=19683;i++){ if(check(i)){ ans.push_back(i); } } } int main(){ int t,n; scanf("%d",&t); init(); while(t--){ scanf("%d",&n); int