11 2014 档案
摘要:缩点后转化成 DAG图上的单源最长路问题。spfa/dp随便。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int cmp[500001],sum,n,m,Us[500001],Vs[...
阅读全文
摘要:根据 高中的数学知识 即可推出 ans=m^n-m*(m-1)^(n-1) 。快速幂取模搞一下即可。 1 #include 2 using namespace std; 3 typedef long long ll; 4 #define MOD 100003 5 ll n,m; 6 ll Quick...
阅读全文
摘要:莫队经典。 开个数组维护a[i]出现的次数。 1 #include 2 #include 3 #include 4 using namespace std; 5 int Num,CH[12],f,c; 6 inline void R(int &x){ 7 c=0;f=1; 8 for...
阅读全文
摘要:题解见 :http://blog.csdn.net/iamzky/article/details/41088151ORZ ZKY2个懒标记:是否翻转,覆盖成了什么。怎么处理一个块上有两个标记的情况呢?若该块原来没有任何标记,或要打的标记和原本的标记种类相同,则直接打上标记;若已有翻转标记,再覆盖时则...
阅读全文
摘要:分块,打标记,维护两个标记:乘的 和 加的。每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值。每次 区间加的时候 对 加标记 加上那个值。(ax+b)*v=axv+bv。开 long long。 1 #include 2 #include 3 using namespace std;...
阅读全文
摘要:权值的种类只有100种,对每种开个二维BIT,然后是经典操作。 1 #include 2 using namespace std; 3 int n,m,q,x1,y1,x2,y2,val,op,a[301][301]; 4 struct BIT_2D 5 { 6 int d[301][301...
阅读全文
摘要:发现,若使方差最小,则使Σ(wi-平均数)2最小即可。因为权值的范围很小,所以我们可以枚举这个平均数,每次把边权赋成(wi-平均数)2,做kruscal。但是,我们怎么知道枚举出来的平均数是不是恰好是我们的这n-1条边的呢? 就在更新答案的时候加个特判就行了。 1 #include 2 #inclu...
阅读全文
摘要:裸的三维偏序。 对x坐标排序,y、z坐标分块。复杂度O(n*sqrt(n*log(n)))。代码很短。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 struct Point{int x,y,z,num;vo...
阅读全文
摘要:经典问题:二维偏序。给定平面中的n个点,求每个点左下方的点的个数。因为 所有点已经以y为第一关键字,x为第二关键字排好序,所以我们按读入顺序处理,仅仅需要计算x坐标小于树状数组。 1 #include 2 #include 3 #include 4 using namespace std; 5 st...
阅读全文
摘要:以下部分来自:http://www.cnblogs.com/zhuohan123/p/3726306.html此证明有误。DZY系列。这题首先是几个性质: 1.所有球质量相同,碰撞直接交换速度,而球又没有编号,那么就可以直接视作两个球没有碰撞。 2.所有的方向、初始位置都没有任何用处。然后就是速...
阅读全文
摘要:nlogn求出最长上升子序列长度。对每次询问,贪心地回答。设输入为x。当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] 即可。f[i]表示以a[i]开头的最长上升子序列长度。但这个东西难以统计。so 我们将原序列反序,求f[i] 表示以 a[i]为...
阅读全文
摘要:本意是求最小瓶颈生成树,但是我们可以证明:最小生成树也是最小瓶颈生成树(其实我不会)。数据范围很小,暴力kruscal即可。 1 #include 2 #include 3 using namespace std; 4 struct Edge{int u,v,w;void Read(){scanf(...
阅读全文
摘要:f[i][j]表示第i首歌音量为j是否可能。若是将状态之间建边,那么答案就是max(j){f[i][j]==true&&0 2 using namespace std; 3 int n,vis[51][1001],w[51],limit,sta; 4 void dfs(int cur,int now...
阅读全文
摘要:小vijos P1447 Updown背景开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。faebdc 之塔一共有 N 层,升降梯在每层都有一个停靠点。手柄有 M 个控制槽,第 i个控制槽...
阅读全文
摘要:暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优。但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处理出它应该从上面何处转移过来,消掉一个n。 1 #include 2 #include 3 using...
阅读全文
摘要:若打了一只鼹鼠后,还能打另一只,我们可以在它们之间连权值为1的边。于是答案就是 以m为终点的最长路长度+1。建反图,就是单源最长路。MLE TLE 一时爽。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 ve...
阅读全文
摘要:对n个位置,每个位置维护一个vector。每次插入,可能对MIN_SORT_GAP产生的影响,只可能是 插入元素 和 它的 前驱 后继 造成的,用一个set维护(存储所有序列中的元素)。我们还得维护一个multiset(存储相邻元素的差值),可能对MIN_GAP产生影响,只可能是它在序列中的前一个元...
阅读全文
摘要:权值分块……rank3……没什么好说的。 1 #include 2 #include 3 #include 4 using namespace std; 5 int n,sz,sum,x,y,l[501],r[501],Min,Max,sumv[501],num[250001],m,v[2...
阅读全文
摘要:论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4、5倍左右的样子…… 1 #include 2 #include 3 using namespace std; 4 struct Point{int v,p;}t[20001]; 5 bool operator =Ask[i].k)4...
阅读全文
摘要:不多说。比pb_ds还是要快不少的。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 80001 6 int sum,sz,num[N],l[295],r[295],a[N],op[N],en,ma[N],ans...
阅读全文
摘要:权值分块就是快……Rank5…… 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 38001 6 #define INF 2147483647 7 #define min(a,b) (((a)'9';c=getc...
阅读全文
摘要:权值分块,离散化非常蛋疼,只能离散化搞……需要支持操作:删除 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 201001 7 struct Point{int v,p;}tmp[N]; 8 boo...
阅读全文
摘要:pb_ds 裸题,写写权值分块试试能不能过……觉得够呛。P.S.cin读入大量数据会RE。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 using namespace __gnu_cx...
阅读全文
摘要:离散化,分块。预处理出:ans[i][j] 第i块到第j块的逆序对数。f[i][j] 第1~i块中大于j的数的个数。g[i][j] 第1~j块中小于j的数的个数。每次询问时对于整块部分可以O(1)获得。对于零散部分呢?>在一列数的后面添加一个数,逆序对数会增加 数列中比它大的数的个数。>在一列数的前...
阅读全文
摘要:权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快。但是被zkw线段树完虐。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 100000...
阅读全文
摘要:权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能。部分操作的时间复杂度:插入删除全局排名全局K大前驱后继全局最值按值域删除元素O(1)O(1)O(sqrt(n))O(sqrt(n))O(sqrt(n))O(sqrt(n))O(sqrt(n))O(sqrt(n))(懒标记)当然,因为...
阅读全文
摘要:There are three girls and fifteen boys who are having a meeting at a round rable.You need to put them at proper place to make sure that "there are l...
阅读全文
摘要:Part 1、块状链表。定位插入删除数组O(1)O(n)O(n)链表O(n)O(1)O(1)对于线性表的以上常见操作来说,数组和链表都无法有效地解决。但是,若我们将链表的每个节点存成一个数组,使得链表里每个节点的数据拼接起来就是原先的线性表中的内容(即块状链表),并且数组的大小合适的话,以上的操作都...
阅读全文
摘要:存反图,从终点dfs一遍,记录下无法到达的点。然后枚举这些记录的点,把他们的出边所连的点也全部记录。以上这些点都是无法在最短路中出现的。所以把两个端点都没被记录的边加进图里,跑spfa、BFS什么的随意。 1 #include 2 #include 3 #include 4 #include 5 u...
阅读全文
摘要:暴力枚举。 1 #include 2 #include 3 using namespace std; 4 int a[130][130],d,n,x,y,z,num,ans=-2147483647; 5 int main() 6 { 7 scanf("%d%d",&d,&n); 8 ...
阅读全文
摘要:不难发现,树中与某个点距离为2的点只可能是它的父亲的父亲、儿子的儿子 或者 兄弟,分类讨论一下即可。只有对于兄弟我们不能暴力搞,维护一下每个节点的所有儿子的前缀和、前缀MAX就行了。 1 #include 2 #include 3 #include 4 using namespace std; 5 ...
阅读全文
摘要:把所有情况打表,然后随便暴力。 1 #include 2 using namespace std; 3 int n,an,bn,p1,p2; 4 int a[10001],b[10001]; 5 bool f[6][6]; 6 int ans1,ans2; 7 void init() 8 { 9 ...
阅读全文
摘要:裸的最大匹配。 1 #include 2 #include 3 #include 4 using namespace std; 5 vectorG[2002]; 6 typedef vector::iterator ITER; 7 int n,m,mat[2002],x,y; 8 bool vis[...
阅读全文
摘要:在线块状树LCA模板。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 30001 7 vectorG[N]; 8 typedef vector::iterator ITER; 9 int ...
阅读全文
摘要:拓扑排序模板。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 10001 6 vectorG[N]; 7 stackS; 8 int n,m,x,y,ru[N],tot; 9 int main()10 {11 ...
阅读全文
摘要:两次dfs缩点,然后n次dfs暴搜。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 2001 6 vectorG[N],rG[N],vs,G2[N]; 7 typedef vector::iterator IT...
阅读全文
摘要:尺取法解题步骤:head=tail=0;while(1){①while(当前区间不满足约束&&tail<n) {tail后移;更新区间信息;}②if(当前区间不满足约束) break;③更新ans;④head后移;更新区间信息;}
阅读全文
摘要:分块,离散化,预处理出:①前i块中x出现的次数(差分);②第i块到第j块中的众数是谁,出现了多少次。询问的时候,对于整块的部分直接获得答案;对于零散的部分,暴力统计每个数出现的次数,加上差分的结果,尝试更新ans。 1 #include 2 #include 3 #include 4 #in...
阅读全文
摘要:详细的题解:http://www.docin.com/p-517243379.html一个图是二分图 等价于 其至少有两个节点且没有奇环。二分图判定的方法:从任意点出发进行一次dfs黑白染色,若某个点之前已经访问过(vis[v]==1)且color[v]==color[u],则存在奇环。 1 #in...
阅读全文
摘要:裸的分层图最短路。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 51 7 #define K 51 8 #define M 2001 9 struct Point{int u,d;Poi...
阅读全文
摘要:spfa最短路+判负权回路(是否某个点入队超过n次)。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define M 20001 6 #define N 1001 7 int n,m,x,y,w1,w2; 8 int v[M]...
阅读全文
摘要:分块90分。 By AutSky_JadeK 【重点在下面】 1 #include 2 #include 3 using namespace std; 4 #define N 1000001 5 #define INF 2147483647 6 #define min(a,b) (((a)'9')C...
阅读全文
摘要:floyd模板 1 #include 2 #include 3 using namespace std; 4 int a[101][101],m,x,y,n; 5 int main() 6 { 7 scanf("%d",&n); 8 for(int i=1;i<=n;i++) 9 ...
阅读全文
摘要:∵每个座位可以坐俩人,所以拆点最大匹配。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 2001 6 vectorG[N::iterator ITER; 8 int mat[N<<2]; 9 bool vis[...
阅读全文
摘要:裸的匈牙利,存模板。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 201 6 int n,m,x; 7 vectorG[N::iterator ITER; 9 int mat[N<<1]; bool vis[...
阅读全文
摘要:1、独立区间问题在N个区间里找出最多的互不覆盖的区间对结束点进行排序,然后从结束点最小的区间开始进行选择即可2、覆盖区间问题给一个大区间,再给出N个小区间,求出最少用多少个区间可以把大区间覆盖完先选出开始的一个,然后选开始点在这个区间里结束点最大的区间,然后以次类推3、区间的最小点覆盖给出N个区间,...
阅读全文
摘要:2014.11.4 7:33 还有三天半就要NOIP,圈一下要背的知识点:一、数论1、素数判断2、筛法求素数3、求一个数的欧拉函数值4、预处理欧拉函数5、卡塔兰数递推式6、快速幂(模素数的乘法逆元)7、GCD二、图论1、最短路:①堆dijkstra ②spfa2、kruscal 最小生成树3、LCA...
阅读全文
摘要:对于两条线段,若其中点重合,且长度相等,那么它们一定是某个矩形的对角线。N*N地处理出所有线段,排序,对每一部分中点重合、长度相等的线段进行暴力枚举,更新答案。用 long double 注意EPS的设置,卡精度。注意数组大小的设置,容易MLE。 1 #include 2 #include 3 #i...
阅读全文
摘要:考虑不限制奇偶的情况,那就是直接排序取前k个的和。加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者将其中的最小的偶数替换成未被选择的数中最大的奇数 是最优的。那么排序之后 就可以预处理出 某个位置左侧最小的奇数、左侧最小的偶数、右侧最大的...
阅读全文
摘要:注意细节和初始化。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 string ans[110],tmp[110][110]; 7 int m,cnt[110],maxv,maxm,n; 8 int Calc...
阅读全文
摘要:建图:每个点向它四周的点连边权为两点点权的差的绝对值的边。由于有多个需要“施法”的点,所以相当于对每个这样的点,询问与它的距离在T以内的最长边的最小值,即多次询问。最长边最小之类的,肯定是最小生成树没跑了。BUT 若是对每个点这样做的话,肯定会TLE。所以考虑一次处理出所有询问的答案。在并查集将两个...
阅读全文
摘要:10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n 2 #include 3 #include 4 #include 5 using namespace std; 6 #define M 500001 7 #define N 100001 8 struct Node 9 {10 ...
阅读全文
摘要://上图绿色扫描线右侧少画了一条扫描线。很多区间把数轴分成了很多段,看哪个点的(区间覆盖数*该点权值)最大。显然在某个区间的右端点的答案是最优的。排序后 用扫描线从左到右扫描,维护每个点的覆盖数,就是遇到左端点时cnt++,右端点时更新ans、cnt--。若某个点既有左端点,又有右端点,就把左端点放...
阅读全文
摘要:从左上角到右下角,共经过n+m个节点,从其中选择n各节点向右(或者m各节点向下),所以答案就是C(n+m,n)或者C(n+m,m),组合数暴力算即可,但是要取模,所以用了乘法逆元。 1 #include 2 #include 3 using namespace std; 4 typedef long...
阅读全文
摘要:拓扑排序,要让字典序最小,所以把栈改成堆。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 100001 6 priority_queue,greater >Q; 7 int n,m,x,y; 8 int v[N...
阅读全文
摘要:gcd(x,y)(1 gcd(x/k,y/k)=1,k是x的质因数 的个数 Σφ(x/k) (1 2 using namespace std; 3 typedef long long ll; 4 int phi[10000001],n; 5 bool unPrime[10000001]; 6 ll ...
阅读全文
摘要:∵∑gcd(i, N)(1 gcd(x/ki,N/ki)=1 (1 2 #include 3 using namespace std; 4 typedef long long ll; 5 ll n,ans; 6 int phi(ll x) 7 { 8 ll res=x; 9 for(...
阅读全文
摘要:判断堆:递归判断每个节点的孩子是否都比其父亲大(小)。判断BST:中序遍历是否有序。 1 #include 2 using namespace std; 3 #define lc (rtb[i-1]) {f2=0; break;}18 if(f2) return 1;19 retur...
阅读全文