Colin's blog

A football fan,an English lover and a coder


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

LCA模板

发表于 2017-04-22   |   分类于 acm
LCALCA 是最近公共祖先问题,一般是图变成树做的问题,如有n个点m-1条边等等这样的条件,LCA有在线离线算法,这里总结的是在线算法,而且用st算法加速。 算法分析网上总结了一些博客: http://blog.csdn.net/liangzhaoyang1/article/details/52549822 http://blog.csdn.net/insistgogo/article/details/9929103 几题的变化都不大,可见模板的通用性。 Distance Queries原题:poj 1986 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 4e4+5; struct nod{ int to, cost; nod(int a=0,int b=0){to = a; cost = b;} }; int dep[maxn], se ...
阅读全文 »

Radio stations

发表于 2017-04-18   |   分类于 acm
原题:Radio stations 原题大意每个点有三个属性,x,r,f;统计有多少对点i,j满足 min(ri,rj) >= |xi-xj| 且 |fi-fj| <=k,这样的点对被称作是“坏的”。 算法分析考虑到min(ri, rj)这个条件比较烦,把点按r从大到小排序。排序后,对于第i个点,它和之前的第j个点组成bad pair的充要条件为|xi-xj|<=ri && |fi-fj|<=k。整理一下,变成xi-ri<=xj<=xi+ri && -k+fi<=fj<=k+fi。这其实就是按顺序在平面上插入点,并查询给定矩形区域内点的个数,是经典的三维偏序问题,用CDQ分治即可解决。 http://blog.csdn.net/jtjy568805874/article/details/50638665 http://www.cnblogs.com/mlystdcall/p/6351344.html 程序代码#include <bits/stdc++.h> using namespace s ...
阅读全文 »

A Simple Task

发表于 2017-04-16   |   分类于 acm
原题:A Simple Task 原题大意统计一个无向图中环的个数 算法分析首先考虑到一个环其实是一条链两头连接起来的,所以我们只要找到所有的链判一下两头是否联通即可。但是一个链的状态是首尾和经过的点,是n^2*2^n的,考虑到题目限制n<=19,这个状态数显然是爆炸的。现在我们考虑人为地把一个环从经过的点中id最小的点的两侧处切开,则得到了两个以id最小值为起点的链。对于任意的环我们都可以这样做,于是我们只要统计以id最小值为起点的成环链的数量,将结果除以2即可。这样由于起点已经固定,状态数就只有n*2^n, 然后dp一下即可。dp[i][j]表示状态i(具体路径)中,以i的最小id为起点,j为终点的路径数。 http://m.blog.csdn.net/article/details?id=49078233http://blog.csdn.net/kk303/article/details/9621933 程序代码#include <bits/stdc++.h> using namespace std; typedef long long ll; bool g ...
阅读全文 »

Hamiltonish Path

发表于 2017-04-16   |   分类于 acm
原题:Hamiltonish Path 原题大意给定一个无向图,有n个点,m条边,让你求出一条路径,这条路径有3个满足条件: 这条路径至少穿过两个点 这条路径只经过一个点一次 任何与起点或终点相邻的点一定包括在这条路径里面 题目输入保证存在路径,并且多条路径时,输出任意一条 算法分析可以从任意一点开始(记为x)。把x放到一个双端队列里,以之为起点。然后重复执行一下内容: 如果有与之相邻的点且不在队列里的,就将其放到队首,并以之为起点。 如果有与队尾相邻(终点)且不在队列里,就将其放到队尾,并以之为终点。 直到队首队尾没有点与之相邻,或相邻的都在队列里,输出队列。 程序代码#include <cstdio> #include <vector> #include <deque> #include <memory.h> #define mem(a,b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 1e5+5; bool vis[maxn]; vector& ...
阅读全文 »

Sorted Arrays

发表于 2017-04-16   |   分类于 acm
原题:Sorted Arrays 原题大意给一串长度为N的序列,问至少将其分成几个子序列,使得每个子序列要么非递增,要么非递减。输出最少子序列的个数。 算法分析设置类似开关一样的标志,如果开始以非递减序列为真的话,依次检查下一个数字,满足非递减条件就继续,标志依旧为真;不满足条件时,改标志为假,子序列个数加1;然后依次检查下一个数字,如果满足非递增的条件,标志依旧为假,否则再改为真,并且子序列个数加1,如此重复,知道结束。但是有一些注意的地方: 要另设一个长度标志len,记录新的子序列的长度,只有在长度大于1并且不符合前面的增减关系时才能增加子序列的个数,否则会多解。 如果当前数字和前一个相等时并且len为1时,len不变,直接继续下一次循环。 程序代码#include <cstdio> using namespace std; const int maxn = 1e5+5; int d[maxn]; int n; int main(){ //freopen("input.txt", "r", stdin); while( ...
阅读全文 »
1…141516…23
Shen Hao

Shen Hao

Colin's blog | acm |c++

114 日志
6 分类
71 标签
GitHub
© 2017 Shen Hao
由 Hexo 强力驱动
主题 - NexT.Muse