scanf

线段树模板

独自空忆成欢 提交于 2020-04-04 09:58:08
1、求区间和 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 const int maxn=50000+5; 5 int a[maxn]; 6 struct Node 7 { 8 int l,r,sum; 9 } node[maxn<<2]; 10 11 //参数含义:节点区间,节点编号 12 void InitTree(int l,int r,int k) 13 { 14 node[k].r=r;//节点k的右子树 15 node[k].l=l; 16 node[k].sum=0;//权值 17 if(l==r)//到达叶子节点 18 { 19 node[k].sum=a[r]; 20 return; 21 } 22 int mid=(l+r)>>1; 23 InitTree(l,mid,k<<1);//递归建左子树 24 InitTree(mid+1,r,k<<1|1);//递归建右子树 25 26 node[k].sum=node[k<<1].sum+node[k<<1|1].sum; 27 //父节点的值为两子节点值的和 28 //此为线段树的核心所在,求最值修改这一句即可 29 } 30 void UpdateTree(int l,int r,int k,int sum) 31 { 32

专题训练之拓步排序

↘锁芯ラ 提交于 2020-04-04 04:26:05
推荐几个博客:https://blog.csdn.net/dm_vincent/article/details/7714519 拓扑排序的原理及其实现 https://blog.csdn.net/u012860063/article/details/38017661 拓扑排序的几种写法 https://blog.csdn.net/shahdza/article/details/7779389 拓扑排序题集 1.基于DFS的拓扑排序:一般适用于数据较小并且需要判断有无环的情况 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=150; 6 int n,vis[maxn],topo[maxn],cnt; 7 bool g[maxn][maxn],flag; 8 9 void dfs(int u) 10 { 11 if ( vis[u]<0 ) { 12 flag=false; 13 return; 14 } 15 if ( vis[u]>0 ) return; 16 else vis[u]=-1; //表示当前还在访问中 17 for ( int v=1;flag&&v<=n;v++ ) { 18 if ( g[u][v] ) dfs

专题训练之强连通分量

北城余情 提交于 2020-04-04 04:23:18
tarjan模板 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=20010; 6 const int maxm=50010; 7 struct edge{ 8 int to,nxt; 9 }edge[maxm]; 10 int head[maxn],tot; 11 int low[maxn],dfn[maxn],stack[maxn],belong[maxn]; 12 int index,top; 13 int scc; 14 bool vis[maxn]; 15 int num[maxn]; 16 17 void addedge(int u,int v) 18 { 19 edge[tot].to=v; 20 edge[tot].nxt=head[u]; 21 head[u]=tot++; 22 } 23 24 void tarjan(int u) 25 { 26 int v; 27 low[u]=dfn[u]=++index; 28 stack[top++]=u; 29 vis[u]=true; 30 for ( int i=head[u];i!=-1;i=edge[i].nxt ) { 31 v=edge[i].to; 32

数据类型、常量、变量、printf、scanf和运算符

随声附和 提交于 2020-04-03 10:32:55
数据类型 常量 变量 printf函数介绍 scanf函数介绍 运算符 数据类型 数据类型是指数据在内存中存储的方式。 C语言中有5大数据类型:基本类型、构造类型、指针类型、空类型、定义类型。 C语言中常见的数据类型: 各种数据类型在内存中占用的空间大小:(单位:字节)(1 Byte = 8 bit) 16位编译器 32位编译器 64位编译器 char 1 1 1 Int 2 4 4 Float 4 4 4 Double 8 8 8 Short 2 2 2 Long 4 4 8 Long long 8 8 8 Void *(指针变量) 2 4 8 各种数据的表示范围: 常量 常量就是在内存中固定的数据,不可改变其内容。 常见分类: 整型常量 a) 十进制常量,和自然界十进制表示法一致 b) 二进制常量,以0b(0B)开头,例如:0b1100 c) 八进制常量,以0开头,例如:045 d) 十六进制常量,以0x开头,例如:0x123 实型常量 a) 单精度常量,小数后面加f表示单精度常量。 例如:3.14f b) 双精度常量,和自然界小数表示方法一致。 例如:3.1415926 3.8e5(或3.8E5 相当于3.8 x 10 5 ) 字符型常量 用单引号括起来的单个字符表示。 a) 普通字符:例如: ‘A’ ‘b’ ‘$’等等 b) 转义字符:例如:’\n’ ‘\t’ ‘%%’

置换,置换的运算

▼魔方 西西 提交于 2020-04-03 08:21:53
置换的概念还是比较好理解的,《组合数学》里面有讲。对于置换的幂运算大家可以参考一下潘震皓的那篇《置换群快速幂运算研究与探讨》,写的很好。 结论 一: 一个长度为l的循环T,l是k的倍数,则T^k是k个循环的乘积,每个循环分别是循环T中下标i mod k=0,1,2…的元素按顺序的连接。 结论 二: 一个长度为l的循环T,gcd(l,k)=1,则T^k是一个循环,与循环T不一定相同。 结论 三: 一个长度为l的循环T,T^k是m=gcd(l,k)个循环的乘积,每个循环分别是循环T中下标i mod gcd(l,k)=0,1,2…的元素的连接。 如果长度与指数不互质,单个循环就没有办法来开方。不过,我们可以选择相应m个长度相同的循环交错合并来完成开方的过程。可在这种情况下,如果找不到m个长度相同的循环,那就一定不能开方。其中:m是gcd(l,k)的倍数 *简单题:(应该理解概念就可以了) # pku3270 Cow Sorting 题目描述: 给你一个数字序列(每个数字唯一),每次你可以交换任意两个数字,代价为这两个数字的和,问最少用多少代价能把这个序列按升序排列好。 题目的具体做法是参考刘汝佳的《算法艺术与信息学奥赛》大概思路是:以后再用别种方法解, 1.找出初始状态和目标状态。明显,目标状态就是排序后的状态。 2.画出置换群,在里面找循环。例如,数字是8 4 5 3 2 7 明显,

Hdu 3887 Counting Offspring \\ Poj 3321 Apple Tree \\BZOJ 1103 [POI2007]大都市meg

霸气de小男生 提交于 2020-04-03 07:14:09
这几个题练习DFS序的一些应用。 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1、C x y 以节点x的权值修改为y。 2、Q x 求出以节点x为根的子树权值和。 最直观的做法, 枚举一个子树内所有节点的权值加和。但这种做法的每一次讯问的时间复杂度是O(n)的,很明显无法满足题目的需要,我们需要更优的解法。 我们考虑DFS序的另外一种形式,当访问到一个节点时记下当前的时间戳,我们设它为L[x], 结束访问一个节点时当前的时间戳设为R[x]。则以x为根的子树刚好是下标为L[x]和R[x]中间的点。我们看下面这个例子。 有了DFS序这个性质我们就可以讲这个问题转化成一个区间求和问题。 每一次询问的复杂度就是O(logn)级别的,完全可以接受。 另外:很多人习惯在生成DFS序的时候,叶子节点的进出时间戳差1,我习惯于叶子节点的进出时间戳一样。这样根节点的时间戳为[1,n] 比如说:上图中如果采用叶子节点进出时间戳差1的写法,DFS序为:4、3、1、7、7、1、2、6、6、2、3、5、8、8、5、4.数量为2*n 如果按照我习惯的做法,DFS序为:4、3、1、7、2、6、5、8. 两种做法都可以,我习惯于第二种。 练习题: 第一题: http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意

Codeforces Global Round 1

僤鯓⒐⒋嵵緔 提交于 2020-04-03 04:29:15
A. Parity 签. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 100010 5 int b, k, a[N]; 6 7 int main() 8 { 9 while (scanf("%d%d", &b, &k) != EOF) 10 { 11 int res = 0; 12 for (int i = 1; i <= k; ++i) scanf("%d", a + i); 13 int base = 1; 14 for (int i = k; i >= 1; --i) 15 { 16 res = (res + a[i] * base % 2) % 2; 17 base = base * b % 2; 18 } 19 puts(res % 2 ? "odd" : "even"); 20 } 21 return 0; 22 } View Code 做的时候卡了一会儿 因为想用费马小定理 认为 $b^x = b^{(x \% \phi(m))} \pmod m$ 然后幂次都变为$0$ 就直接加起来$模2判断一下就好了$ $但是没有考虑到0^0次的问题$ $在这里如果b \% 2 == 0, 那么带b的项都为0$ 1 #include <bits/stdc++.h> 2 using namespace

最小生成树(模板+入门题)

点点圈 提交于 2020-04-02 23:39:38
最小生成树 加权图是一种为每条边关联一个权值(可表示成本、时间等)的图模型。这种图能表示许多场景,如航空图中边表示航线,权值表示距离或费用。在航空图中,通常的问题是如何使距离或费用最小化。 我们可以通过加权无向图的最小生成树来解决这个问题。 图的生成树:是它的一颗含有其他所有顶点的无环连通子图。一幅加权无向图的最小生成树(MST)是它的一颗权值最小的生成树(树中所有边的权值之和最小)。 我们会一起学习计算最小生成树的两种经典算法:Prime算法和Kruskal算法。 首先有几个注意点: 只考虑连通图 边的权值可以表示距离、时间、费用或其他变量 边的权重可能是0或负数 所有边的权重都不相同 我们要在一幅加权连通无向图中找到它的最小生成树。 首先定义一下 加权无向图的数据结构 最小生成树算法:Prim算法和Kruskal算法 Prim算法: Prim算法 模板: 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include

【贪心】Codeforces 704B & 705D Ant Man

Deadly 提交于 2020-04-01 22:38:00
题目链接:    http://codeforces.com/problemset/problem/704/B 题目大意:   给N个点,起点S终点T,每个点有X,A,B,C,D,根据I和J的 X坐标 可得I到J的距离计算公式:(题目描述的那个i<j有错!害我WA了好几次) | x i  -  x j | +  c i  +  b j seconds if x[ j]  < x[ i] . | x i  -  x j | +  d i  +  a j seconds otherwise (x[ j ] > x[ i] ).    求从起点到终点,经过N个点恰好一次的最短路。 题目思路:    【贪心】   这题首先一看过去觉得像DP题,但是数据好大,一时不知道怎么做。   我是先把每个点到其他点的距离算出来,然后一个一个往S到T中间插入点,用一个链表记录每个点到达的下一个点。   如果把当前结点I插在J和K中间比插在其他区间更优就更新答案。 1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<map> 9 #include<memory.h> 10

Codeforces Round #223 (Div. 2)

强颜欢笑 提交于 2020-04-01 04:28:47
Sereja and Dima 1Y 直接按着题目给的方法模拟就好了 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <map> 6 #include <algorithm> 7 #include<stack> 8 #define maxlen 1010 9 using namespace std; 10 int n; 11 int num[maxlen]; 12 int main () 13 { 14 while(scanf("%d",&n)!=EOF) 15 { 16 for(int i=0;i<n;++i) 17 scanf("%d",&num[i]); 18 int i=0,j=n-1; 19 int cnt=1; 20 int sum0=0,sum1=0; 21 while(cnt<=n) 22 { 23 if(cnt&1) 24 { 25 if(num[i]>num[j]) 26 { 27 sum0+=num[i]; 28 i++; 29 } 30 else 31 { 32 sum0+=num[j]; 33 j--; 34 } 35 } 36 else 37 { 38 if(num[i]>num[j]) 39 { 40 sum1+