vis

VJ数论专题AC代码临时保存

我的梦境 提交于 2020-02-05 11:55:47
//A #include<bits/stdc++.h> using namespace std; bool vis[1000010]; void Get_Prime() { int n = 1000010; int m = sqrt(n+0.5); memset(vis,0,sizeof(vis)); for(int i=2; i<=m; i++) if(!vis[i]) for(int j=i*i; j<=n; j+=i) vis[j] = 1; return ; } int Find(int n) { for(int i=n+1; ; i++) if(!vis[i]) return i; } int main() { Get_Prime(); int t,n,x; long long sum; scanf("%d",&t); for(int i=1; i<=t; i++) { scanf("%d",&n); sum = 0; while(n--) { scanf("%d",&x); sum += Find(x); } printf("Case %d: %lld Xukha\n",i,sum); } return 0; } 来源: https://www.cnblogs.com/sdutzxr/p/12262985.html

POJ 3436 ACM Computer Factory 最大流,拆点 难度:1

青春壹個敷衍的年華 提交于 2020-02-05 07:20:08
题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi个产品,但有输入要求,即对于部件Pi,输入要求会说明要求其存在(1),不存在(0)或者无要求(2),每台机器的输出状态是一定的,会说明经过该机器加工后某个零件是否存在(1),不存在(0)。所有零件都存在(状态都为1时)组装成功,问如何重新安排生产线这张图使得每小时输出的产品数量最多?或者可以简单理解为:在有向图中有n个结点,它们有允许的状态输入,有确定的状态输出,每个点有自身容量限制,状态输入全为0的结点都为最大流起点,状态输出全为1的结点都为最大流终点,求最大流容量。 思路 题目索引中这道题可以使用KM算法,但是我采用了较为简单的思路。 首先对于某两个机器结点i,j,从i出发能否连接j可以直接穷举j的输入状态是否符合i的输出状态。 这样就能得到初始的图,而在这张图中,由于作为起点或终点的结点可能有很多个,所以需要建立超级起点,从超级起点出发连接所有起点,建立超级终点,从所有终点出发连接超级终点。 但是此时这张图上只有点有流量限制,边没有流量限制,所以需要把机器结点拆分为两个结点,两个结点一个为入点,一个为出点,入点到出点之间连一条有向边,容量限制为点的流量限制

网络流小结

╄→尐↘猪︶ㄣ 提交于 2020-02-05 06:53:10
网络流主要包括: 1、最大流 2、费用流 3、有上下界的网络流 网络流的基本技巧: 1、多个源点和汇点的情况。建立超级源点和超级汇点。 2、顶点有容量限制。拆成两个点,此两点连边,容量为原来的点被限制的容量。 3、最大费用转为最小费用。变负数,最后变回来。 一、最大流 最大流算法的思想是不断地找 S 到 T 的增广路。算法的效率是由找增广路的方法决定的。 Edmond - Karp 算法:用广搜找增广路,时间复杂度 O (n*m*m ) 。思路最简单。 1 const int N=110, INF=0x3f3f3f3f; 2 int Map[N][N],pre[N],n,ans; 3 bool vis[N]; 4 queue<int> que; 5 bool EK_bfs(int s,int e) 6 { 7 int i,k; 8 while(!que.empty()) que.pop(); 9 memset(vis,0,sizeof(vis)); 10 memset(pre,0,sizeof(pre)); 11 que.push(s); 12 vis[s]=1; 13 while(!que.empty()) 14 { 15 k=que.front(); 16 if(e==k) return 1; 17 que.pop(); 18 for(i=1;i<=n;i++) 19 { 20

Visitor Pattern

℡╲_俬逩灬. 提交于 2020-02-05 03:30:44
1.Visitor模式:将更新(变更)封装到一个类中(访问操作),并由待更改类提供一个接收接口,则可在不破坏类的前提下,为类提供增加新的新操作。 2.Visitor模式结构图 Visitor模式的关键是双分派(Double-Dispatch)的技术:Accept()操作是一个双分派的操作,具体调用哪个Accept()操作,有两个决定因素(1)Element类型(2)Visitor类型。 3.实现 1 #ifndef _VISITOR_H_ 2 #define _VISITOR_H_ 3 4 class Element; 5 6 class Visitor 7 { 8 public: 9 virtual ~Visitor(); 10 virtual void VisitConcreteElementA(Element* elm) = 0; 11 virtual void VisitConcreteElementB(Element* elm) = 0; 12 protected: 13 Visitor(); 14 private: 15 }; 16 17 class ConcreteVisitorA:public Visitor 18 { 19 public: 20 ConcreteVisitorA(); 21 virtual ~ConcreteVisitorA(); 22

差分约束

偶尔善良 提交于 2020-02-04 23:59:32
具体三类模型看这篇博客: 添加链接描述 写的很详细,我只给出对应例题的代码: 建图技巧: 1.a-b<=c ——> add(b,a,-c)spfa跑最短路 2.a-b>=c ——> add(b,a,c)spfa跑最长路 其他不等式或者等式可以转化成这种形式来做 1、线性约束 线性约束一般是在一维空间中给出一些变量(一般定义位置),然后告诉你某两个变量的约束关系,求两个变量a和b的差值的最大值或最小值。 【例题1】N个人编号为1-N,并且按照编号顺序排成一条直线,任何两个人的位置不重合,然后给定一些约束条件。 X(X <= 100000)组约束Ax Bx Cx(1 <= Ax < Bx <= N),表示Ax和Bx的距离不能大于Cx。 Y(X <= 100000)组约束Ay By Cy(1 <= Ay < By <= N),表示Ay和By的距离不能小于Cy。 如果这样的排列存在,输出1-N这两个人的最长可能距离,如果不存在,输出-1,如果无限长输出-2。 像这类问题,N个人的位置在一条直线上呈线性排列,某两个人的位置满足某些约束条件,最后要求第一个人和最后一个人的最长可能距离,这种是最直白的差分约束问题,因为可以用距离作为变量列出不等式组,然后再转化成图求最短路。 令第x个人的位置为d[x](不妨设d[x]为x的递增函数,即随着x的增大,d[x]的位置朝着x正方向延伸)。

JSOI2012~2013

断了今生、忘了曾经 提交于 2020-02-04 23:39:21
JSOI 2012~2013 C 游戏中的学问 题面: bzoj 题解:递推 注意一个圈至少要三个人…… (上来以为是圆排列然后WA) 式子看代码吧 code I 侦探jyy 题面: bzoj 题解:bfs 对于每个事件,假设他必须发生 那么有两种可能 一是由他往上只要有一个点是一开始钦定了要发生 二是由所有入度为零且不是他祖先的点往下推,推完后还有钦定被发生而没有发生的 code Q 贪心的导游 题面: bzoj 题解:主席树 看到 \(a[i],p\leq 1000\) ,可以考虑暴力 每次在主席树的 \([l,r]\) 区间找到对应的数字 具体看代码吧 code C code #include<bits/stdc++.h> using namespace std; #define ll long long ll s[3005][3005],n,k,p; int main() { scanf("%lld%lld%lld",&n,&k,&p); s[0][0]=1; for(int j=1;j<=k;++j) for(int i=3*j;i<=n;++i) s[i][j]=(1ll*(i-1)*(i-2)*s[i-3][j-1]+1ll*(i-1)*s[i-1][j])%p; printf("%lld\n",s[n][k]); return 0; } top I code

[BZOJ1902]:[NOIP2004]虫食算(搜索)

霸气de小男生 提交于 2020-02-04 09:51:54
题目传送门 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。 来看一个简单的例子:    43#98650#45+8468#6633=44445506978 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是 5 和 3 ,第二行的数字是 5 。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法是 N 进制加法,算式中三个数都有 N 位,允许有前导的 0 。 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的。我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是 N 进制的,我们就取英文字母表中的前 N 个大写字母来表示这个算式中的 0 到 N-1 这 N 个不同的数字(但是这N个字母并不一定顺序地代表 0 到 N-1 )。输入数据保证 N 个字母分别至少出现一次。    BADC+CBDA=DCCC 上面的算式是一个 4 进制的算式。很显然,我们只要让 ABCD 分别代表 0123 ,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出 N 个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解。 输入格式 包含 4 行。第一行有一个正整数 N ,后面的 3 行每行有一个由大写字母组成的字符串

树的直径及应用

假如想象 提交于 2020-02-04 07:15:54
树的直径:   树的直径指树上距离最远的两点间的距离,它在树上问题上有许多应用,往往通过树的直径的性质可以将一个高时间复杂度的解法变为线性求解。 树的直径的性质: ( 1 ) (1) ( 1 ) . 对树上的任意一点而言,树上与它距离最远的点一定为树的直径的两个端点的其中之一; ( 2 ) (2) ( 2 ) .直径两端点一定是两个叶子节点; ( 3 ) (3) ( 3 ) .对于两棵树,如果第一棵树直径两端点为 ( u , v ) (u,v) ( u , v ) ,第二棵树直径两端点为 ( x , y ) (x,y) ( x , y ) ,用一条边将两棵树连接,那么新树的直径的两端点一定是 u , v , x , y u,v,x,y u , v , x , y 中的两个点; ( 4 ) (4) ( 4 ) .对于一棵树,如果在一个点的上接一个叶子节点,那么最多会改变直径的一个端点; ( 5 ) (5) ( 5 ) .若一棵树存在多条直径,那么这些直径交于一点 且交点是这些直径的中点 ; 求法: (1)搜索(dfs/bfs): 步骤:   首先,以任意一点为搜索的起点,进行第一次搜索。此次搜索得到的距起点最远的点即为直径端点之一。然后以该点为起点进行第二次搜索,所得到的距其距离最远的点即为另一个端点。 复杂度: O ( n ) O(n) O ( n ) 方便记录路径 (2)树形dp

【SDOI2011】消防

不羁岁月 提交于 2020-02-02 20:34:51
题目链接: https://www.luogu.com.cn/problem/P2491 题目大意:给定一棵带有 \(n\) 个点的树 , 求出在这棵树的直径中的不超过长度 \(s\) 的路径, 其中的每个点到其他点的距离的最大值最小 solution 一道看似很奇怪的辣鸡题 , 其实就是树网的核的加强版 题目挺难看懂的 , 但经过仔细地思考以后 , 若令 \(d[i]\) 等于从点 \(i\) 到 其它点的最大距离 , 原题就可以简化为求: \[min_{r \leq len}\left\{max_{l \leq i \leq r}\left\{d[i]\right\}(dist(l, r) \leq s)\right\}(其中 len 表示直径上点的个数)\] 令 \(pre[i]\) 表示从直径的一个端点到第 \(i\) 个点的距离 , 由直径的最长性 , 可得 \(d[i] = pre[i]\) , 从而原式可变为: \[max_{l \leq i \leq r}\left\{max\left\{pre[len] - pre[r] , pre[l]\right\}\right\}(dist(l, r) \leq s)\] 但这个式子仍有一个问题 , 当这条路径上中间有一些点出现了直径的分支时 , 实际上从另一条直径的端点走到这些点的距离会更大 , 于是我们可以令 \(dis

dfs+剪枝 poj1011

十年热恋 提交于 2020-02-02 14:19:49
  Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 113547 Accepted: 26078 问题描述   George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero. 输入格式   The input contains blocks of 2 lines. The first line contains the number of sticks