vis

同志们的毒害1_xuhang01

天大地大妈咪最大 提交于 2019-11-28 08:49:52
     在光老犇的迫害下,高二全体信奥成员 含泪 为自己的战友们出了一套题   xuhang01同学光荣成为第一位迫害人,出了一套 科学且玄学 的卷,照理水一发题解博客   链接: http://218.62.22.209:8080/contest.php?cid=2228      T1   二分求解,二分两棵树之间的最长距离,O(n)验证即可   但是跑之前要先sort一遍......      1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m,maxx; 4 int a[100010]; 5 bool check(int x){ 6 int now=a[1],num=0; 7 for(register int i=2;i<=n;i++){ 8 if(abs(a[i]-now)>=x) num++,now=a[i]; 9 if(num==m-1) return true; 10 } 11 return false; 12 } 13 int ef(int l,int r){ 14 if(l==r) return l; 15 int mid=(l+r)/2; 16 if(check(mid+1)) ef(mid+1,r); 17 else ef(l,mid); 18 } 19 int main(){ 20

【匈牙利算法】

前提是你 提交于 2019-11-28 08:41:04
前置 二分图:二分图又称作二部图,是图论中的一种特殊模型。 设 \(G=(V,E)\) 是一个无向图,如果顶点V可分割为两个互不相交的子集 \((A,B)\) ,并且图中的每条边 \((i,j)\) 所关联的两个顶点i和j分别属于这两个不同的顶点集 \((i\;in A,j\;in B)\) ,则称图G为一个二分图。 简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。 无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。 匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配 极大匹配(Maximal Matching)是指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数。最大匹配(maximum matching)是所有极大匹配当中边数最大的一个匹配。选择这样的边数最大的子集称为图的最大匹配问题。 如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。 求二分图最大匹配可以用最大流(Maximal Flow)或者匈牙利算法(Hungarian Algorithm) 实战 下面好几道 (好像总共也没几道题) 都是网络流的题 因为数据太水可以用匈牙利水过

Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A,B,C【真的菜·】

非 Y 不嫁゛ 提交于 2019-11-28 07:27:07
8说了 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 6 signed main(){ 7 string str; 8 cin>>str; 9 int _; 10 cin>>_; 11 int flag1=0; 12 int flag2=0; 13 int flag3=0; 14 int flag4=0; 15 while(_--){ 16 string s; 17 cin>>s; 18 if(s==str){ 19 flag4=1; 20 continue; 21 } 22 if(s[0]==str[1]&&s[1]==str[0]){ 23 flag3=1; 24 continue; 25 } 26 if(str[0]==s[1]){ 27 flag1=1; 28 } 29 if(str[1]==s[0]){ 30 flag2=1; 31 } 32 } 33 // cout<<flag1<<" "<<flag2<<" "<<flag3<<" "<<flag4; 34 if(flag3||flag4||(flag1+flag2==2)){ 35 printf("YES\n"); 36 }else{ 37 printf("NO\n"); 38 } 39 return 0;

BZOJ 2039 人员雇佣(最小割)

一个人想着一个人 提交于 2019-11-28 07:05:06
最小割的建图模式一般是,先算出总收益,然后再通过网络模型进行割边减去部分权值。 然后我们需要思考什么才能带来收益,什么才能有权值冲突。 s连向选的点,t连向不选的点,那么收益的减少量应该就是将s集和t集分开的割边集。 下面说这道题的建图: 点:   每个人一个点,额外设源汇点。 边:   源向人连这个人能造成的全部收益(当作雇佣所有人,然后此人造成的收益)   人与人之间连两人熟悉度*2,呃,题意问题。   人向汇连雇佣需要花的钱。 # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <bitset> # include <set> # include <cmath> # include <algorithm> using namespace std; # define lowbit(x) ((x)&(-x)) # define pi acos(-1.0) # define eps 1e-8 # define MOD 1000000007 # define INF (LL)1<<60 # define mem(a,b

dfs(最长路径)

左心房为你撑大大i 提交于 2019-11-28 06:05:09
http://poj.org/problem?id=1154 LETTERS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9519 Accepted: 4252 Description A single-player game is played on a rectangular board divided in R rows and C columns. There is a single uppercase letter (A-Z) written in every position in the board. Before the begging of the game there is a figure in the upper-left corner of the board (first row, first column). In every move, a player can move the figure to the one of the adjacent positions (up, down,left or right). Only constraint is that a figure cannot visit a position marked with the same

P1910 L国的战斗之间谍

独自空忆成欢 提交于 2019-11-28 05:41:37
链接: P1910 ---------------------------------------------- 一看题目,这是道二维背包 然而暴力出奇迹啊 我就写了个dfs 然后TLE,吸了氧也TlE, 怎么办呢,剪枝!!1 --------------------------------------------- 思路:搜索,(我写的奇奇怪怪,题解都是搜索请不请第i个人,我写的是当还剩下 多少能力和钱(雾)) 这种写法实在太奇怪了,以至于还要剪枝,还有一个奇葩边界条件qwq。 就是大体是搜索每一种可行组合,然后如果在这一轮没有扩展任何状态,就更新一下答案 竟然能过(剪枝后不开02)。 剪枝:我们枚举的是组合,就递归的时候记下来上一个人是谁,然后从他开始枚举,就可以 优化ac了 (数据太小了) ------------------------------------------ 要不是记忆化wa了一半我才不写暴力呢 ------------------------------------------- // luogu-judger-enable-o2 #include<iostream> #include<cstdio> using namespace std; int n,m,x; int a[10001]; int b[10001]; int c[10001]; int

[广度优先搜索]仙岛求药

元气小坏坏 提交于 2019-11-28 05:16:12
题目大意 题目描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。 下图 显示了一个迷阵的样例及李逍遥找到仙药的路线. 输入格式 输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义: (1) ‘@’:少年李逍遥所在的位置; (2) ‘.’:可以安全通行的方格; (3) ‘#’:有怪物的方格; (4) ‘*’:仙药所在位置。 当在一行中读入的是两个零时,表示输入结束。 输出格式 对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。 输入输出样例 输入 #1 8 8 .@##...# #....#.# #.#.##.. ..#.###. #.#...#. ..###.#. ...#.*.. .#...### 6 5 .*.#. .#... ..

bfs(最短路径)

本秂侑毒 提交于 2019-11-28 05:04:49
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 146388 Accepted: 44997 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting. * Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute * Teleporting: FJ can move from any point X to the point 2 × X in a

P4292 [WC2010]重建计划

て烟熏妆下的殇ゞ 提交于 2019-11-28 04:50:08
传送门 纪念第一个自己写出的黑题... 看一眼就是分数规划,二分答案先套上,二分一个 $mid$ ,把所有边权减 $mid$ 然后就变成求树上边数在 $[L,R]$ 范围内的最长链 看到树,看到求链,再看看时间限制,点分治是没得跑了... 关键是考虑具体怎么点分治 每到一个分治节点 $x$ 就考虑所有以它为最浅点的所有链,发现对于两条以它为起点的深度相同的链,我们只要保留最长的长度 所以维护一个桶 $T[i]$ 表示当前深度为 $i$ 的所有以 $x$ 为起点的链的长度最大值,考虑新加入的一个儿子子树 $v$ 如何合并 设 $tmp[i]$ 表示 $v$ 中深度为 $i$(起点是 $x$) 的链的最长长度,考虑 $T$ 和 $tmp$ 的合并: 动态维护两个指针 $ld,rd$ ,分别表示之前的儿子贡献的深度和新加入的儿子贡献的深度 那么有 $ld+rd>=L$ 且 $ld+rd<=R$,考虑枚举 $rd$,使得 $ld$ 跟着变化,并统计合法 $ld$ 的区间内的贡献 通过上面两个式子得到 $ld>=L-rd,ld<=R-rd$ ,即 $ld \in [L-rd,R-rd]$ 发现 $rd$ 增加 $1$ 那么整个合法区间就整体移一位,并且区间大小不变(不考虑边界),发现这就是个滑动窗口,直接单调队列就完事了 点分树先预处理会快很多 以上就是本题关键思路,具体实现请看代码

【模板】dijikstra

一个人想着一个人 提交于 2019-11-28 04:15:29
1 dis[1]=0; 2 q.push(make_pair(0,1)); 3 while(!q.empty()) 4 { 5 int u=q.top().second; 6 q.pop(); 7 if(vis[u]) continue; 8 vis[u]=1; 9 for(int i=h[u];i;i=e[i].nex) 10 { 11 int v=e[i].to; 12 if(dis[v]>dis[u]+e[i].w) 13 { 14 dis[v]=dis[u]+e[i].w; 15 q.push(make_pair(dis[v],v)); 16 } 17 } 18 } 19 来源: https://www.cnblogs.com/xiaobuxie/p/11391838.html