11 2017 档案
摘要:Treap,也叫做树堆,是指有一个随机附加域满足堆的性质的二叉搜索树。 如果一棵二叉搜索树插入节点的顺序是随机的,那我们得到的二叉搜索树在大多数情况下是平衡的,期望高度是log(n). 但有些情况下我们并不能得知所有待插入节点,打乱以后再插入,这时我们需要给二叉搜索树加上一个随机附加域,并使这个随机
阅读全文
摘要:洛谷3382 1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std;
阅读全文
摘要:洛谷3811 先用n!p-2求出n!的乘法逆元 因为有(i-1)!-1=i!-1*i (mod p),于是我们可以O(n)求出i!-1 再用i!-1*(i-1)!=i-1 (mod p)即是答案 1 #include<iostream> 2 #include<cstring> 3 #include<
阅读全文
摘要:洛谷3370 这题煞笔的吧QAQ......排序去重或者Map都可以 1 #include<cstdio> 2 #include<map> 3 #include<string> 4 using namespace std; 5 map<int, int> dic; 6 int ans=0,n; 7
阅读全文
摘要:给出1-n的两个排列P1和P2,求它们的最长公共子序列。 洛谷1439 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=100010; 5 int n,x,ans,tmp,pos[max
阅读全文
摘要:洛谷3387 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int maxn=20010,maxm=200010; 6 int ans,n,m,etot,tot,
阅读全文
摘要:洛谷3865 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 const int maxn=100010; 6 int f[maxn][32],n,m,l,r; 7 void re
阅读全文
该文被密码保护。
摘要:洛谷3384 1 #include<cstdio> 2 #include<algorithm> 3 #define ls (cur<<1) 4 #define rs (cur<<1|1) 5 #define len(x) (a[x].r-a[x].l+1) 6 #define mid ((a[cur
阅读全文
摘要:洛谷3379 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=500010,inf=1e9; 5 int n,m,x,y,root,tot,dep[maxn],son[maxn],siz
阅读全文
摘要:洛谷3375 讲解 1 #include<cstdio> 2 #include<cstring> 3 const int maxn=1000100; 4 int lp,lt,j,f[maxn]; 5 char p[maxn],t[maxn]; 6 7 void getfail() { 8 f[1]=
阅读全文
摘要:【题解】 对于每一条边,我们通过它需要花费的代价是边权的两倍加上这条边两个端点的点权。 我们把每条边的边权设为上述的值,然后跑一边最小生成树,再把答案加上最小的点权就好了。 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std;
阅读全文
摘要:【Description】 n个点,m次操作,每次把(i*p+q)%n+1与(i*q+p)%n+1之间的点染上颜色i,被染过色的会被新颜色覆盖,求最后每个点的颜色。 【题解】 因为被染过的颜色会被新的颜色覆盖,所以对于一个点,有效的染色只是最后一次。 那么我们可以倒着染色,已经染色的不染 求每个点被
阅读全文
摘要:【题意概述】 给出三个n的排列,求有多少个数对在三个排列中顺序相同 【题解】 考虑用补集转化的方法,答案为总对数-不满足的对数 一对数不满足条件,当且仅当这对数在两个排列中顺序相同,在另一个排列中的顺序不同。 统计两两之间不满足偏序条件的数对的个数,那么每对数都被统计了两次
阅读全文
摘要:#include #include using namespace std; const int maxn=100010; int a[maxn],b[maxn],t[maxn],n,ans; void read(int &k){ k=0; int f=1; char c=getchar(); while(c'9')c=='-'&&(f=-1),c=getchar(); while('0'...
阅读全文
摘要:【题解】 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上。我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到V中每个点的路径上的最长边。因为我们每次在可选的w中选择了最小的,所以可以满足最长边最短的要求。 我
阅读全文
摘要:【Description】 Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100
阅读全文
摘要:【题意概述】 有n件物品,每件物品有体积Vi,背包容量为C,问最多可以装多少体积的物品 【题解】 显然是个无限背包嘛。。 直接做背包DP就好 注意无限背包的写法和01背包的区别 1 #include<cstdio> 2 #include<algorithm> 3 using namespace st
阅读全文
摘要:【题解】 我们可以发现,对于一只编号为a的兔子,a的父亲的编号是a-f[x],其中x为a出生的月份。 而计算a出生月份的方法是:找到第一个大于等于a的f[x],x即为a出生的月份。 那么我们只要不断的找a与b的父亲,直到它们相等即可。 1 #include<cstdio> 2 #include<al
阅读全文
摘要:【题意】 约翰留下他的N只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花朵!为了使接下来花朵的损失最小,约翰赶紧采取行动,把牛们送回牛棚. 牛们从1到N编号.第i只牛所在的位置距离牛棚Ti(1≤Ti≤2
阅读全文