【PA 2014】Kuglarz】的更多相关文章

[题目链接]            点击打开链接 [算法]            sum[i]表示前i个杯子中,杯子底下藏有球的杯子总数            那么,知道[i,j]这段区间中,藏有球的杯子总数的奇偶性,相当于知道sum[j] - sum[i-1]的奇偶性            我们发现,知道哪些杯子底下藏有球,就是需要我们知道所有sum[i]的奇偶性            因此,我们只需将所有的(i-1,j)连边,边权为输入数据中给出的费用c(i,j),然后,求出这个图的最小  …
[题目链接] 点击打开链接 [算法] 按x轴排序,将相邻点连边 按y轴排序,将相邻点连边 然后对这个图跑最短路就可以了,笔者用的是dijkstra算法 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 200000 struct info { int id,x,y; } a[MAXN+]; int N,i; ]; vector< pair<]; template <typename T> inl…
[题目链接] 点击打开链接 [算法] 线段树 注意标记下传 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 500000 typedef long long LL; struct SegTreeNode { LL l,r,sum,lazya,lazyb; }tree[MAXN+]; LL i,N,P,Q,l,r,x,opt; LL a[MAXN+]; template <typename T> void…
[题目链接] 点击打开链接 [算法] 树链剖分 每个宗教建一棵线段树,注意数据量大,要动态开点 [代码] #include<bits/stdc++.h> using namespace std; #define MAXLOG 18 ; ; int i,n,q,x,y,t,Lca,SZ,timer; int w[MAXN],c[MAXN],son[MAXN],dfn[MAXN],top[MAXN],size[MAXN],anc[MAXN][MAXLOG], dep[MAXN],fa[MAXN],…
[题目链接] 点击打开链接 [算法] 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i]),注意如果a[j]不止一个,只需加上下标最大的即可,否则会重复计数 那么,100分的做法,其实就是用树状数组来优化这个东西,注意因为a[i]最大10^9,所以要离散化 [代码] #include<bits/stdc++.h> using namespace std; ; ; int i,n,an…
[题目链接] 点击打开链接 [算法] 考虑求lca(x,y)的深度 我们可以将从根到x路径上的点都打上标记,然后,询问y到根上路径的权值和 那么,求sigma(depth(lca(i,z)))(l <= i <= r ),我们可以将区间[l,r]中的点依次打上标记,然后,询问点z到根路径 上的权值和 因为此题有多组询问,显然在线很难做,因此,我们考虑离线计算答案 求sigma(depth(lca(i,z))) (l <= i <= r),我们可以转化为 sigma(depth(lc…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3631 [算法] 树上差分 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 300010 #define MAXLOG 20 int i,n,u,v,Lca; int a[MAXN],dep[MAXN],cnt[MAXN]; int anc[MAXN][MAXLOG]; vector< int &g…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3670 [算法] KMP [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 1000010 ; int T,i,j,ans,len,tmp; int num[MAXN],nxt[MAXN],cnt[MAXN]; char s[MAXN]; int main() { scanf("%d",…
http://www.lydsy.com/JudgeOnline/problem.php?id=3876 这道题每条支线的意思是每条边... 那么每条边的下界设为1就行了. 这样建出一个DAG,每条边下界为1,上界为正无穷,赋上费用.设1为S.所有点向T连边,下界为0,上界为正无穷,费用为0,表示可以随时退出.答案是这个图中的最小费用可行流. 最小费用可行流怎么求啊! 可行流什么的我只会求无源汇的. 想了好半天才明白该怎么做... 抛弃原来的建图,还是建出一个DAG,每条边下界为1,上界为正无穷…
http://uoj.ac/problem/29 cdq四次处理出一直向左, 一直向右, 向左后回到起点, 向右后回到起点的dp数组,最后统计答案. 举例:\(fi\)表示一直向右走i天能参观的最多景点数. 其中有一个很重要的条件\(fi≤fi+1fi≤fi+1\),这个条件是分治的前提. 关于这个条件的证明,我想了好久才想出来,用反证法证明一下就行. 分治时需要用主席树维护路径上的前k大和. #include<cstdio> #include<cstring> #include&…