nex

网络流24题小结

做~自己de王妃 提交于 2021-02-18 17:30:28
1.飞行员配对方案问题 二分图最大匹配。 #include<bits/stdc++.h> using namespace std; inline int read(){ int x= 0 ,f= 1 ; char ch= getchar(); while (ch< ' 0 ' ||ch> ' 9 ' ){ if (ch== ' - ' )f=- 1 ;ch= getchar();} while (ch>= ' 0 ' &&ch<= ' 9 ' ){x=(x<< 3 )+(x<< 1 )+ch- ' 0 ' ;ch= getchar();} return x* f; } #define MN 2005 #define S 0 #define T 205 #define inf 200000000 struct edge{ int to,w,nex;}e[MN* T]; int hr[T+ 5 ],cnt= 1 ,d[T+ 5 ]; int q[T+ 5 ],top,ans; int m,n; void ins( int f, int t, int w){ e[ ++cnt]=edge{t,w,hr[f]};hr[f]= cnt; e[ ++cnt]=edge{f, 0 ,hr[t]};hr[t]= cnt; } bool bfs(){ memset(d, 0 , sizeof d);

P1015 回文数解题思路(非原创)

痴心易碎 提交于 2021-02-13 03:44:17
测试 #include<bits/stdc++.h> using namespace std; int n,m,step; string nn; int len,nex; bool dfs(unsigned long long x) { unsigned long long a= 0 ; for (unsigned long long i=x;i;i/= n) a =a*n+i% n; nex =x+ a; return x== a; } unsigned long long zf( char a) { if (a>= ' 0 ' &&a<= ' 9 ' ) return a- ' 0 ' ; return a- ' A ' + 10 ; } int main() { cin >>n>> nn; len = nn.size(); for ( int i= 0 ;i<len;i++ ) { m =m*n+ zf(nn[i]); } for (step= 0 ;!dfs(m)&&step<= 30 ;step++ ) m = nex; if (step<= 30 ) cout<< " STEP= " <<step<< endl; else cout<< " Impossible! " << endl; return 0 ; } 代码很简洁 毕竟是看了题解 大概思路很简单,针对每个n的值

ACM-ICPC 2018 南京网络赛

余生长醉 提交于 2021-02-12 02:50:56
A 1 /* Huyyt */ 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int mod = 998244353 ; 6 const int maxn = 1e3 + 5 ; 7 int main() 8 { 9 int T; 10 cin >> T; 11 while (T-- ) 12 { 13 ll x; 14 scanf( " %lld " ,& x); 15 printf( " %lld\n " ,x- 1 ); 16 } 17 return 0 ; 18 } //A B #include<bits/stdc++.h> #define lc(x) (2*x) #define rc(x) (2*x+1) #define fi first #define se second using namespace std; typedef long long ll; const ll mod = 998244353 ; const int maxn = 1e5+ 5 ; const int maxm = 1e2+ 5 ; int n,m,k; vector < int > v[maxm]; int lit[maxn]; int near[maxm]; int

顺序存储的线性表的基本操作

╄→гoц情女王★ 提交于 2021-01-22 09:46:56
刚开始学数据结构,几乎算是什么都不会,想记录一下学习的东西,所以就学别人开始写博客。 刚学了顺序存储的线性表的基本操作,把操作写了一遍。 可能会有错误。 顺序存储的线性表,用结构体类型。注意:结构体并不是用来存储元素的,elem才是存储元素的首地址 1 typedef struct 2 { 3 ElemType *elem; // 存储空间基地址 6 int length; // 表长 7 int listsize; // 表容量 8 }SqList; 初始化:构造空表L,返回一个状态,需要带回一个表给基地址动态分配一定大小的空间,表长赋0,表容量赋值 注意:开辟内存失败; 1 Status InitList_Sq(SqList &L) // L为结构体的一个变量,所以在使用它的成员时用L. 2 { 3 L.elem=(ElemType *) malloc (LIST_INIT_SIZE* sizeof (ElemType)); 4 if (! L.elem) 5 exit(OVERFLOW); 6 L.length= 0 ; 7 L.listsize= LIST_INIT_SIZE; 8 return OK; 9 } 创建表:先初始化,再依次输入每个元素,返回状态,传一个表、输入几个数,带回一个表 注意:每输入一个表长+1 这里的输入不通用,只能输入整型数据

多个凸多边形相交面积

隐身守侯 提交于 2021-01-09 23:58:36
#include <bits/stdc++.h> using namespace std; const long double eps=1e- 8 ; const double pi=acos(- 1.0 ); int sgn( double x) { if (fabs(x)< eps) return 0 ; return x< 0 ?- 1 : 1 ; } int dcmp( double x, double y) { if (fabs(x-y)< eps) return 0 ; return x<y?- 1 : 1 ; } struct Point { double x,y; Point() {}; Point( double x, double y):x(x),y(y) {} Point operator + (Point b) { return Point(x+b.x,y+ b.y); } Point operator - (Point b) { return Point(x-b.x,y- b.y); } Point operator *( double k) { return Point(x*k,y* k); } Point operator /( double k) { return Point(x/k,y/ k); } bool operator == (Point

BZOJ 4213 贪吃蛇 上下界费用流 网络流

本秂侑毒 提交于 2020-11-21 08:20:19
https://darkbzoj.cf/problem/4213 https://www.cnblogs.com/DaD3zZ-Beyonder/p/5733326.html 题目描述 dbzoj又崩了存个代码 一条对答案有贡献的蛇一定有两个点在边界上且这两个点都只连了一条边,这条蛇上的其他点一定都连了两条边。 把格子按照如国际象棋棋盘的样式黑白填充,那么一条蛇是一条链(或者环),链上的点黑白交错。 对每个白点匹配两个相邻的黑点(黑白填充是为了方便建图(类似于二分图匹配)),只能匹配一个相邻点的点的数量的最小值/2就是最少的有贡献的蛇的数量。 所以建图为 s -> 白 流量2 费用0 上下界2 黑 -> t 流量2 费用0 上下界2 白 -> 相邻黑 流量1费用0 边缘白 -> t 流量1费用1 s -> 边缘黑 流量1费用1 改造成上下界的就可以了。同这道题→ BZOJ2055 80人环游世界 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define LL long long 9 const int maxn= 60100 ; 10 int

树链剖分

时光毁灭记忆、已成空白 提交于 2020-11-11 07:55:00
   树链剖分    树链剖分听起来超级难,然而昨天听说我们这一届有同学已经会了,感觉压力很大。去看了一下所谓“树剖的前置知识”,惊奇的发现自己都会!于是莫名其妙的又学起了数据结构...noip前除了这个我就再不学超纲内容了...   树链剖分:开始,有一个序列,要区间修改查询,于是有了线段树。后来,这个序列长成了一棵树,要路径修改查询、子树修改查询,于是有了树链剖分。   找了好几个课件,然而还是看不懂,决定先在博客上理理思路再写。   把一棵树切成多条链,就可以降低树上操作的复杂度了。但是怎么切比较好呢?按照一种的轻重链剖分的思想。以下是一些定义:   重儿子:对于每一个非叶子节点,它的子节点中子树节点最多的节点为该节点的重儿子;   轻儿子:对于每一个非叶子节点,它的儿子中非重儿子的儿子即为轻儿子;   重边:连接两个重儿子的边叫做重边;   轻边:不是重边的边;   重链:相邻重边连起来的链叫重链;   叶子节点,如果是轻儿子,则有一条以自己为起点的长度为1的链;   重链以轻儿子为起点;     第一次dfs:求取每一个节点的子树大小,深度,重儿子,父亲;   第二次dfs:按照树的dfs序进行重新编号,给新编号赋初始值,处理每一个点所在链的顶端,处理每一条链。dfs的顺序要按照先重儿子后轻儿子的顺序,这样每条重链中的点在dfs序中是连续的

链表:反转链表

痞子三分冷 提交于 2020-08-19 03:27:27
题目描述 输入一个链表,反转链表后,输出新链表的表头。 考察点:如何调整指针以达到反转的效果。 思路: 初始化3个指针: 1.pre:已反转链表的最后一个节点,刚开始没有反转,所以是null。 2.cur:原始链表的第一个节点,刚开始就是head; 3.nex:原始链表的第二个节点,用来保留原始链表。刚开始是null,循环里要重新定义。 每次循环: 1.nex=cur.next;---先保留原始链表 2.cur.next=pre;---倒转指针去指向已反转链表的最后一个节点 3.pre=cur; cur=nex; 继续去操作下一个节点。 循环条件:cur !=null; 跳出循环时,pre就是反转完成的链表的首节点了,返回pre即可。 代码: public class Solution { public ListNode ReverseList(ListNode head) { ListNode pre=null; ListNode cur=head; ListNode nex=null; while(cur!=null){ nex=cur.next; cur.next=pre; pre=cur; cur=nex; } return pre; } } 来源: oschina 链接: https://my.oschina.net/u/4527334/blog/4300063

题解 [NOI2009] 植物大战僵尸

两盒软妹~` 提交于 2020-08-14 09:15:40
  讲网络流的时候没有听懂最大权闭合子图,然后讲题的时候学长问我们这是什么模型。   我就瞎口胡了最大权闭合子图,然后就中了。   总之,依题可知,要吃一个植物,必须吃它右侧的植物,并且吃掉保护它的植物(全都是玉米加农炮嗷)。所以在两个点之间连一条有向边,连完之后发现要获取一个点的分数必须获取所有它连接的点的分数。   所以就是最大权闭合子图辣。不过由于一个植物可能会保护它自己,或者保护(保护它的植物),所以判环,环与环到达的点统统不拿来建图。建个反图跑拓扑排序就好了。   代码: #include <bits/stdc++.h> #define maxn 720005 #define inf 0x3f3f3f using namespace std; long long n,m,tot= 1 ,ans= 0 ; queue < int > q; int head[maxn],nex[maxn],to[maxn],edge[maxn],cur[maxn]; int mapp[ 300 ][ 300 ],vis[maxn],lev[maxn]; int attack[ 605 ][ 605 ],start,endn,cango[maxn]; int in [maxn]; void add( int x, int y, int z){ to[ ++tot]=y;edge[tot]=z

Hdu 6774 String Distance —— lcs,暴力

只谈情不闲聊 提交于 2020-08-13 09:09:01
This way 题意: 你手上有两个字符串S,T。你每次可以选择一个串,删除任意一个位置或者在任意一个位置添加一个字符。定义两个串的距离为需要的操作数使得这两个串相同。 题解: 在被01卡住的时候,为了收束一下思路,顺手就把这题A掉了…不是很懂为什么大家都要去做01而不是做这道签到题。 首先我们肯定不能 O ( n m ) O(nm) O ( n m ) 的时间去做lcs,但是其实预处理一下就可以 O ( m 2 ) O(m^2) O ( m 2 ) 的时间做lcs。 预处理出nex数组 nex[i][j]表示字符串n第i个位置上下一个字符j的位置。 那么dp[i][j]表示字符串m到第i个位置上,lcs的长度为j的时候的最早的结束位置。 那么dp的第一维就可以去掉。然后枚举i的时候枚举j∈(0,i-1),从那个位置转移过来,lcs记录一下最大值即可。 然后答案是r-l+1+m-2*lcs #include<bits/stdc++.h> using namespace std ; const int N = 1 e5 + 5 , M = 35 ; int nex [ N ] [ M ] , dp [ M ] ; char s1 [ N ] , s2 [ M ] ; int main ( ) { int t ; scanf ( "%d" , & t ) ; while ( t --