青岛区域赛备战--模板及复习--简单算法

1、快速幂
2、LIS及其变形

快速幂

LL Pow(LL a, LL n, LL mod)
{
    LL t = 1;
    for (; n; n >>= 1, a = (a * a % mod))
        if (n & 1) t = (t * a % mod);
    return t;
}

LIS


int a[100100],ans[100100];
int LIS(int n){
    ans[0]=a[0];
    int len=1;
    for(int i=1;ians[len-1])
            ans[len++]=a[i];
        else{
            int pos=lower_bound(ans,ans+len,a[i])-ans; //在答案里找第一个比a[i]大的位置
            ans[pos]=a[i];
        }
    }
    return len;
}
在从小到大的排序数组中,

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

点分治

点分治还是很有意思的,不过自己看博客还是比较吃力的,看了好久。
基本思想:
找一颗树上的重心(所有以此点为根的子树中最大子树最小的那个根结点)
分治解决。(这是关键。)
详细解释一下:一开始结点数为n,朴素算法O( n 2 n^2 n2),若找重心分治处理就是O( l o g ( n ) log(n) log(n))层,每次合并时间是(这里是O(nlog(n)+n) 排序+找最远可行对)不定。
那最终就是O(n*log(n)*log(n)).
最终的决定权基本在合并算法的手里,能合并,就能处理。
需要注意的是

       ans-=solve(v,w);

要减掉没有经过根的点

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define clr(a, x) memset(a, x, sizeof(a))
#define mp(x, y) make_pair(x, y)
#define pb(x) push_back(x)
#define X first
#define Y second
#define fastin                    \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);
typedef long long LL;
typedef pair PII;
typedef vector VI;
const int INF=0x3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int N=10010;
const int M=40010;
int head[N];
int top;
struct Edge
{
    int val;
    int to;
    int next;
}edge[M];
void addedge(int a,int b,int c)
{
    edge[top]=Edge{c,b,head[a]};
    head[a]=top++;
}
void init()
{
    top=0;
    memset(head,-1,sizeof(head));
}
int k;
int root,sim[N],S,mxson[N];
int MX,vis[N];
void getroot(int u,int fa){
    sim[u]=1;mxson[u]=0;
    for(int i=head[u];~i;i=edge[i].next){
        int v=edge[i].to;
        int w=edge[i].val;
        if(v==fa||vis[v]) continue;
        getroot(v,u);
        sim[u]+=sim[v];
        mxson[u]=max(mxson[u],sim[v]);
    }
    mxson[u] = max(mxson[u],S-sim[u]);
    if(mxson[u]

LGV

青岛区域赛备战--模板及复习--简单算法_第1张图片

注意条件转移。

你可能感兴趣的:(acm,dp,图论)