码迷,mamicode.com
首页 > 其他好文 > 详细

学习总结

时间:2019-02-01 01:15:02      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:ase   push   设计   建图   opera   状态   ide   计划   lse   

 STL:


 

容器与迭代器的概念
重载运算符

vector:
v.size();
v.push_back();
v[i];

set:
set.insert();
set.erase();
set.begin();
set.end();指到最后一个的后一个
set.count();
set.lower_bound();
set.upper_bound();
set.size();

priority_queue:
Q.push();
Q.pop();
Q.size();
Q.top();
实现普通堆

multiset:
和set类似,删除的时候特别注意

string:
动态开空间

deque:
deq.front();
deq.back();
deq.push_front(x);
deq.pop_front();
deq.push_back(x);
deq.pop_back();

lower_bound();
upper_bound();

string:
动态开空间

重载运算符:

bool operator < (const Vergil &x) const
{
}

 

 

 


 

建图 :邻接矩阵  邻接表

图的dfs和bfs : 魔板

 

二分图染色: 封锁阳光大学

最短路: SPFA&&dij

// 差分约束系统

拓扑序入度 出度 

欧拉XX:

 

无向图:

欧拉道路: 只有两个奇度点                                         欧拉回路: 每个点都是偶度

有向图:

欧拉道路: 一个点入度=出度+1 一个点出度=入度+1    欧拉回路:入度=出度

回路属于道路

树:

DFS序
重心:删除这个点后树的最大儿子最小   采用一遍dfs,计算每个点的相连的最大的连通块规模,求取最大值;再在所有最大值中找出最小的,这个点就是重心。
直径:树的两个距离最长的点

一个点的最远路 必是直径的一点

并查集
最小生成树

树状数组

最近公共祖先

线段树:

运用倍增的思想 优化复杂度

对于区间的修改  //借教室

关于DP的优化    //LIS

 

 

 

算法


 

DP:

Vergil:

首先是设计状态,我们肯定是要有一个一维或多维的状态的,那么如何设计它们的意义呢,首先我们可以分析出题目中的一些重要的量,比如当前时间,选了几个,考虑到了哪里,对于这些状态我们是要以一个值来表示这些状态的最优情况,比如f[i][j][k]..=P,i,j,k表示状态,P表示那个值,我们i,j,k,P都是这些重要的量,我们应该先把这些重要的量列出,然后感觉一下如何设计状态容易转移,一般来说设计了一个好的状态剩下的事情都比较好办。

如果这个状态不是太好,我们可以考虑优化转移,我们可以再开一个别的数组维护我们转移的信息,比如说维护最小值,或者用高级数据结构维护,或者发现状态的一些性质(单调性),这样就能更快的转移。

其实动态规划也是考虑了所有的状态,如果说你设计的DP没有将所有的状态考虑到,那么一定是错误的,动态规划的实质就是枚举了所有的状态,然后保留最大值。

个人认为动态规划就是一个分类,动态规划的状态就是分类的标准,动态规划在每一中类别中都取得最优解,另外对于每个基本元素来说,一般都有几个状态,比如说背包问题中每个物品的选与不选,或者是这个元素放在哪个位置等等等等,考虑到每个元素的状态也有助于我们设计整体的状态。

区间DP:

由小到大         //合并石子

背包DP:

背包九讲

https://www.cnblogs.com/jbelial/articles/2116074.html

选与不选         //津津的储蓄计划

树形DP:

树形背包      //选课

选择结点      //没有上司的舞会

状压DP:

用二进制串进行选与不选    //炮兵阵地   互不侵犯king

贪心(玄学)

1.数学式子推出结论

2.考虑临界   感受贪心策略可不可行(用心去感受~)

二分:

*最大的最小值

二分需具有单调性

如果是单峰函数 则需三分 //借教室  期末考试 通向奥格瑞玛的道路

三分:期末考试代码

 

技术分享图片
 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100005
typedef long long LL;
LL A,B,C,ans;
int t[maxn],b[maxn],n,m,L,R;
 
LL f(int x)
{
    LL res1=0;
    LL res2=0;
    LL ff=0;
    for (int i=1;i<=m;i++) 
        if (b[i]<x) res1+=(x-b[i]);
    for (int i=1;i<=m;i++)
        if (b[i]>x) res2+=(b[i]-x);
    if (A>=B) ff=res2*B;
    else
    {
        if (res1>=res2) ff=res2*A;
        else
        {
            ff=res1*A;
            res2-=res1;
            ff+=res2*B;
        }
    }
    for (int i=1;i<=n;i++) 
        if (t[i]<x) ff+=C*(x-t[i]);
    return ff;
}
 
int main()
{
    scanf("%lld%lld%lld",&A,&B,&C);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",&t[i]);
    for (int i=1;i<=m;i++) scanf("%d",&b[i]),R=max(R,b[i]);
    if (C>1e6+1) 
    {
        int x=1e5+1;
        for (int i=1;i<=n;i++) x=min(x,t[i]);
        printf("%lld\n",f(x));
        return 0;
    }
    L=1;ans=1e18;
    while (R-L>=5) 
    {
        int mid1=(L+R)>>1;
        int mid2=(mid1+R)>>1;
        LL ans1=f(mid1);
        LL ans2=f(mid2);
        if (ans1<ans2) 
        {
            ans=min(ans,ans1);
            R=mid2;
        }
        else
        {
            ans=min(ans,ans2);
            L=mid1;
        }
    }
    for (int i=L;i<=R;i++) 
        ans=min(ans,f(i));
    printf("%lld\n",ans);
    return 0;
}
View Code

 

 

 

差分:

同样用于优化复杂度

往往是多次修改单次查询

开一个差分数组维护影响     //luogu3397 地毯

 

学习总结

标签:ase   push   设计   建图   opera   状态   ide   计划   lse   

原文地址:https://www.cnblogs.com/637w/p/10333904.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!