基本算法

  • 快速幂
 ll ksm(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&) ans=ans*a%p;
b>>=;
a=a*a%p;
}
return ans;
}

ksm

  • 64位大整数乘法
 ll mul(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&) ans=(ans+a)%p;
b>>=;
a=a*%p;
}
return ans;
}

mul

  • 离散化
     for(int i=;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b++n);
int cnt=unique(b+,b++n)-(b+);
for(int i=;i<=n;i++) a[i]=lower_bound(b+,b+cnt+,a[i])-b;

discrete

  • 归并排序求逆序对
 void mergesort(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
mergesort(l,mid);
mergesort(mid+,r);
int i=l,j=mid+,k=l-;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j]) b[++k]=a[i],i++;
else b[++k]=a[j],j++,(ans+=mid-i+)%=moder;
}
while(i<=mid) b[++k]=a[i],i++;
while(j<=r) b[++k]=a[j],j++;
for(int qwq=l;qwq<=r;qwq++) a[qwq]=b[qwq];
}

mergesort

  • 全排列
 void dfs(int x)
{
for(int i=;i<=n;i++)
if(!vis[i])
{
seq[x]=i;
vis[i]=;
if(x==n) work();
else dfs(x+);
vis[i]=;
}
}

Permutation

  • ST表
 #include<cstdio>
#include<algorithm>
#include<cmath> using namespace std; int n,m;
int st[][]; int sta(int l,int r)
{
int k=log2(r-l+);
return max(st[l][k],st[r-(<<k)+][k]);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&st[i][]);
for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
st[i][j]=max(st[i][j-],st[i+(<<(j-))][j-]);
for(int i=;i<=m;i++)
{
int l=,r=;
scanf("%d%d",&l,&r);
printf("%d\n",sta(l,r));
}
return ;
}

ST Table

  • 两种二分
 while(l<r)
{
int mid=(l+r)>>;
if(check(mid)) r=mid;
else l=mid+;
}
while(l<r)
{
int mid=(l+r+)>>;
if(check(mid)) r=mid-;
else l=mid;
}

整数域二分

 double eps=1e-;
while(l+eps<r)
{
double mid=(l+r)/;
if(check(mid)) r=mid;
else l=mid;
}

实数域二分

 void Recantor(ll x)
{
memset(vis,,sizeof(vis));
x--;
int j=;
for(int i=;i<=n;i++)
{
ll t=x/fac[n-i];
for(j=;j<=n;j++)
if(!vis[j])
{
if(!t) break;
t--;
}
printf("%d ",j);
vis[j]=;
x%=fac[n-i];
}
printf("\n");
} ll cantor()
{
ll ans=;
for(int i=;i<=n;i++)
{
int tot=;
for(int j=i+;j<=n;j++)
if(a[j]<a[i]) tot++;
ans+=1ll*tot*fac[n-i];
}
return ans;
}

Cantor&Recantor

其他算法

  • 莫队算法(不带修)
 bool cmp(query a,query b)
{
return (a.l/block)^(b.l/block) ? a.l<b.l : (((a.l/block)&) ? a.r<b.r : a.r>b.r);
}//奇偶块排序 block=sqrt(n);
for(int i=;i<=n;i++) scanf("%d",&seq[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d",&ask[i].l,&ask[i].r);
ask[i].id=i;
ask[i].in=ask[i].l/block;
}
sort(ask+,ask++m,cmp);
for(int i=;i<=m;i++)
{
int l=ask[i].l,r=ask[i].r;
while(posl<l) remove(posl++);
while(posr>r) remove(posr--);
while(posl>l) add(--posl);
while(posr<r) add(++posr);
ans[ask[i].id]=noww;
}
for(int i=;i<=m;i++) printf("%d\n",ans[i]);

Mo's Algorithm

数学

  • 预处理阶乘和处理逆元求组合数
 ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==)
{
x=;
y=;
return a;
}
int gu=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return gu; } ll niyuan(ll hu)
{
x=,y=;
ll tmp=exgcd(hu,p,x,y);
return (x+p)%p;
} ll C(ll k,ll m)
{
ll up=fac[k]%p;
ll down=fac[m]%p*fac[k-m]%p;
ll ans=up*niyuan(down)%p;
return ans;
} void pre()
{
fac[]=;
for(int i=;i<=n+;i++)
fac[i]=(ll)fac[i-]*i%p;
}

Combination

  • 杨辉三角求组合数

     C[][]=;C[][]=;
for(int i=;i<=n;i++) C[i][]=,C[i][i]=;
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
(C[i][j]=C[i-][j]+C[i-][j-])%=moder;

Yang's triangle

数据结构

  • $vector$实现普通平衡树 慎用!!!
 #include<cstdio>
#include<algorithm>
#include<vector> using namespace std; int n;
vector<int>v; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int op=,x=;
scanf("%d%d",&op,&x);
if(op==) v.insert(upper_bound(v.begin(),v.end(),x),x);
else if(op==) v.erase(lower_bound(v.begin(),v.end(),x));
else if(op==) printf("%d\n",lower_bound(v.begin(),v.end(),x)-v.begin()+);
else if(op==) printf("%d\n",v[x-]);
else if(op==) printf("%d\n",*--lower_bound(v.begin(),v.end(),x));
else if(op==) printf("%d\n",*upper_bound(v.begin(),v.end(),x));
}
return ;
}
/*
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
*/

Balanced Tree By vector

图论

  • Floyd算法。复杂度$O(n^3)$
     memset(dis,0x3f,sizeof(dis));
for(int i=;i<=v;i++) dis[i][i]=,dis[][i]=;//这一步很重要
for(int i=;i<=e;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
dis[x][y]=min(dis[x][y],z);
dis[y][x]=min(dis[y][x],z);
}
for(int kk=;kk<=v;kk++)
for(int i=;i<=v;i++)
for(int j=;j<=v;j++)
dis[i][j]=min(dis[i][j],dis[i][kk]+dis[kk][j]);

floyd

  • Dijkstra+堆优化。复杂度$O(mlogn)$。稠密图优。好像不能用来跑最长路诶(
 void dijkstra()
{
priority_queue<pair<int,int> >q;
memset(dis,0x3f,sizeof(dis));
dis[s]=;q.push(make_pair(,s));
while(!q.empty())
{
int u=q.top().second;q.pop();
if(vis[u]) continue;
vis[u]=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
q.push(make_pair(-dis[v],v));
}
}
}
}

Dijkstra+Heap

  • spfa过世算法复杂度理解为$O(nm)$。但稀疏图$O(km)$。
 void spfa()
{
memset(dis,0x3f,sizeof(dis));
queue<int>q;
q.push(s),vis[s]=,dis[s]=;
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
if(!vis[v]) q.push(v),vis[v]=;
}
}
}
}

spfa

  • 判断树上两路径是否相交

*  题目:LuoguP3398仓鼠找sugar / 计蒜客NOIP提高组模拟一试T2 敌对势力 / hihocoder 11D(题目找不到了==可以看这位dalao的博客

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#define maxn 100090 using namespace std; int n,m,tot,t;
int head[maxn],d[maxn],f[maxn][];
struct node{
int to,next;
}edge[maxn*]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void LCA_prework()
{
queue<int>q;
q.push();d[]=;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(d[v]) continue;
d[v]=d[u]+;
f[v][]=u;
for(int j=;j<=t;j++)
f[v][j]=f[f[v][j-]][j-];
q.push(v);
}
}
} int LCA(int x,int y)
{
if(d[x]>d[y]) swap(x,y);
for(int i=t;i>=;i--)
if(d[f[y][i]]>=d[x]) y=f[y][i];
if(x==y) return x;
for(int i=t;i>=;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][];
} int main()
{
scanf("%d%d",&n,&m);
t=log2(n)+;
for(int i=;i<=n-;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
LCA_prework();
for(int i=;i<=m;i++)
{
int a=,b=,c=,e=;
scanf("%d%d%d%d",&a,&b,&c,&e);
int Chemist=LCA(a,b);
int cellur=LCA(c,e);
if(Chemist==cellur)
{
printf("NO\n");
continue;
}
if(d[Chemist]>d[cellur])
{
if(LCA(Chemist,c)==Chemist||LCA(Chemist,e)==Chemist)
{
printf("NO\n");
continue;
}
else
{//没有相交输出yes
printf("YES\n");
continue;
}
}
else
{
if(LCA(cellur,a)==cellur||LCA(cellur,b)==cellur)
{
printf("NO\n");
continue;
}
else
{
printf("YES\n");
continue;
}
}
} return ;
}
  • 最短路计数
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring> using namespace std;
typedef long long ll; int n,m,fake;
int vis[],dis[];
ll f[];
int e[][]; void spfa()
{
memset(dis,,sizeof(dis));
fake=dis[];
queue<int>q;
q.push();vis[]=;dis[]=;f[]=;
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=;
if(u==n) continue;
for(int i=;i<=n;i++)
{
if(dis[i]==dis[u]+e[u][i])
f[i]+=f[u];
if(dis[i]>dis[u]+e[u][i])
{
dis[i]=dis[u]+e[u][i];
f[i]=f[u];
}
if(f[i]&&!vis[i]) vis[i]=,q.push(i);
}
f[u]=;
}
} int main()
{
scanf("%d%d",&n,&m);
memset(e,,sizeof(e));
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
e[x][y]=min(e[x][y],z);
}
spfa();
if(fake==dis[n]) printf("No answer");
else printf("%d %lld",dis[n],f[n]);
return ;
}

以上是过世算法$spfa$,现在我来为大家表演一下$dijkstra$。(搬运逛公园的30部分分)dij不用清空,非常优秀。

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define maxn 100090 using namespace std;
typedef long long ll; int T,n,m,k,tot;
int head[maxn];
bool vis[maxn];
ll moder,f[maxn],dis[maxn];
struct node{
int to,next,val;
}edge[maxn<<]; void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
edge[tot].val=z;
} void Clear()
{
tot=;
memset(head,,sizeof(head));
memset(vis,,sizeof(vis));
memset(f,,sizeof(f));
} void dijkstra()
{
priority_queue<pair<ll,int> >q;
for(int i=;i<=n;i++) dis[i]=3e9;
q.push(make_pair(,));dis[]=;f[]=;
while(!q.empty())
{
int u=q.top().second;q.pop();
if(vis[u]) continue;
vis[u]=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
q.push(make_pair(-dis[v],v));
(f[v]=f[u])%=moder;
}
else if(dis[v]==dis[u]+edge[i].val)
(f[v]+=f[u])%=moder;
}
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%lld",&n,&m,&k,&moder);
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dijkstra();
// if(dis[n]==3e9) printf("-1");
printf("%lld\n",f[n]);
//for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
Clear();
}
return ;
}

Counting

  • kruskal算法求最小生成树:基于边。比较好理解,先对所有边进行排序,用并查集维护联通关系。复杂度为$O(mlogm)$。(其实不用找到n-1条边就退出...)
 /*
最小生成树Kruskal算法
快排权值+并查集看是否连通
*/
#include<cstdio>
#include<algorithm> using namespace std; int n,m,cnt,ans;
int fa[];
struct node{
int f,t,w;
}edge[]; bool cmp(node a,node b)
{
return a.w<b.w;
} int getf(int x)
{
if(x==fa[x]) return x;
return fa[x]=getf(fa[x]);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&edge[i].f,&edge[i].t,&edge[i].w);
for(int i=;i<=n;i++) fa[i]=i;
sort(edge+,edge++m,cmp);
for(int i=;i<=m;i++)
{
if(cnt==n-) break;
int pp=getf(edge[i].f);
int qq=getf(edge[i].t);
if(pp==qq) continue;
fa[qq]=pp;
cnt++;
ans+=edge[i].w;
}
if(cnt<n-) printf("orz");
else printf("%d\n",ans);
return ;
}

Kruskal

  • Prim算法求最小生成树:基于点,逐步扩展。随便找一个点作为起点,设$dis$为添加了这个点需要增加的边权,然后每次在尚未被进入生成树的节点中寻找最小的$dis$,记录它的位置,这一次就把他加入生成树,并更新其他点的$dis$。复杂度$O(n^2)$。注意是否$vis$。
 #include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 5090 using namespace std;
typedef long long ll; int n,m,tot;
ll ans;
int head[maxn],dis[maxn],vis[maxn];
struct node{
int to,next,val;
}edge[]; void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
edge[tot].val=z;
} void prim()
{
memset(dis,,sizeof(dis));
dis[]=;
for(int k=;k<=n;k++)
{
int u=-,sta=0x3f3f3f3f;
for(int i=;i<=n;i++)
if(dis[i]<sta&&!vis[i]) sta=dis[i],u=i;
if(u==-) {printf("orz\n");exit();}
ans+=dis[u];
vis[u]=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]) continue;
dis[v]=min(dis[v],edge[i].val);
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
prim();
printf("%d\n",ans);
return ;
}

Prim

  • 树的直径方法一:两遍bfs/dfs【不能处理有负权边情况】【记录路径】
 int bfs(int x)
{
queue<int>q;
memset(d,0x3f,sizeof(d));
memset(pre,,sizeof(pre));
fake=d[];
q.push(x);d[x]=;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(d[v]==fake) q.push(v),pre[v]=i,d[v]=d[u]+;
}
}
int top=x;
for(int i=;i<=n;i++)
if(d[i]>d[top]) top=i;
return top;
}
int get_d()
{
p=bfs();
p=bfs(p);
return d[p];
}

Tree's Diameter/BFS

  • 树的直径方法二:树形dp
 void Treedp(int u)
{
vis[u]=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]) continue;
Treedp(v);
ans=max(ans,f[x]+f[y]+edge[i].val)
f[x]=max(f[x],f[y]+edge[i].val);
}
}

Tree's Diameter/Treedp

  • 强连通分量/缩点(in有向图)
 void tarjan(int u)
{
dfn[u]=low[u]=++dfs_clock;
st.push(u);
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!scc[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
scc_cnt++;
while()
{
int x=st.top();st.pop();
scc[x]=scc_cnt;
if(x==u) break;
}
}
}
—————————————————————————————————————
for(int i=;i<=n;i++)//在主程序中
if(!dfn[i]) tarjan(i);
for(int x=;x<=n;x++)
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(scc[x]!=scc[y])
ADD(scc[x],scc[y]);
}

tarjan1

  • 树上倍增求LCA

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#define maxn 500090 using namespace std; int n,m,s,tot,t;
int d[maxn],head[maxn],f[maxn][];
struct node{
int to,next;
}edge[maxn<<]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void init()
{
queue<int>q;
q.push(s);d[s]=;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(d[v]) continue;
d[v]=d[u]+;
f[v][]=u;
for(int j=;j<=t;j++)
f[v][j]=f[f[v][j-]][j-];
q.push(v);
}
}
} int lca(int x,int y)
{
if(d[x]<d[y]) swap(x,y);
for(int i=t;i>=;i--)
if(d[f[x][i]]>=d[y]) x=f[x][i];
if(x==y) return x;
for(int i=t;i>=;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][];
} int main()
{
scanf("%d%d%d",&n,&m,&s);
t=log2(n)+;
for(int i=;i<=n-;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
init();
for(int i=;i<=m;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return ;
}

LCA

字符串

  • $trie$树
 tot=;
void insert()
{
int p=;
int len=strlen(tmp+);
for(int i=;i<=len;i++)
{
int qwq=tmp[i]-'';
if(!trie[p][qwq]) trie[p][qwq]=++tot;
p=trie[p][qwq];
}
}

trie--insert

  • 最小表示法
 void work()
{
n=strlen(str+);ans=;
for(int i=;i<=n;i++) str[n+i]=str[i];
int i=,j=,k;
while(i<=n&&j<=n)
{
for(k=;k<=n&&str[i+k]==str[j+k];k++);
if(k>=n) break;
if(str[i+k]>str[j+k])
{i=i+k+;if(i==j) i++;}
else
{j=j+k+;if(i==j) j++;}
}
ans=min(i,j);
printf("%d\n",ans);
}
//注意数组开二倍+

Minimal Expression

其他技巧

srand(time(NULL));
  • 生成数据的批处理文件($bat$)
 @echo off
:loop rand.exe baoli.exe sol.exe fc baoli.out sol.out if not errorlevel goto loop pause goto loop

dp.bat

  • 生成数据
 int random(int lim)
{
return (unsigned long long)rand()*rand()%lim;
} 调用时:int x=random()+;

rand

看到小数据范围:暴搜 全排列 二进制枚举  状压

$O(n^3)$:考虑枚举区间?

NOIp知识集合 By cellur925的更多相关文章

  1. python易错知识集合

    本篇用于记录在写leetcode时遇到的python易错知识. 2019.8.29 1.Python range() 函数用法: range(start, stop[, step]) start: 计 ...

  2. Java基础知识➣集合整理(三)

    概述 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类) ...

  3. Java基础知识--集合

    集合类 数组和集合的比较:数组可以存储对象,也可以存储基本数据类型,但是缺点就是长度固定,不能改变:集合长度是可变的,但是集合只能存储对象,集合可以存储不同类型的对象. Java容器类库一共有两种主要 ...

  4. 面试基础知识集合(python、计算机网络、操作系统、数据结构、数据库等杂记)

    python python _.__.__xx__之间的差别 python中range.xrange和randrange的区别 python中 =.copy.deepcopy的差别 python 继承 ...

  5. python知识集合

    1.list list是一种有序的集合 例子:classmates = ['Michael', 'Bob', 'Tracy']; 方法:1. len len(classmates) //3 2.app ...

  6. python基础知识-集合,列表,元组间的相互装换

    在python中列表,元祖,集合间可以进行相互转化, def main(): set1={'hello','good','banana','zoo','Python','hello'} print(l ...

  7. cocopods 知识集合 及 一个 好的 国外iOS技术翻译站

    http://www.exiatian.com/cocoapods%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E5%8F%8A%E9%85%8D%E7%BD%AE%E7% ...

  8. 从壹开始 [ Id4 ] 之二║ 基础知识集合 & 项目搭建一

    前言 哈喽大家又见面啦,感觉好久没更新了,这几天看了一本书<解忧杂货铺>,嗯挺好的,推荐一下

  9. js数组相关知识集合

    一.js数组快速排序 <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; fun ...

随机推荐

  1. leetcode 863. All Nodes Distance K in Binary Tree

    We are given a binary tree (with root node root), a target node, and an integer value K. Return a li ...

  2. react-native 支持 gif 图片

    只需要在android/app/build.gradle中的dependencies字段中添加: compile 'com.facebook.fresco:animated-gif:0.13.0' 然 ...

  3. make和rest用法

    位置(position):下一个要读取或写入的数据的索引.缓冲区的位置不能为负,并且不能大于其限制(limit). 标记(mark)与重置(reset):标记是一个索引,通过Buffer中的mark( ...

  4. zabbix simple check

    摘自: http://www.ttlsa.com/zabbix/zabbix-simple-checks/ 1. 开始 Simple checks通常用来检查远程未安装代理或者客户端的服务 使用sim ...

  5. 用gdisk调整gpt/ext4分区大小

    主机: CentOS release 6.4 (Final) 目的:从/home分区分出100G来创建新分区/vm 参考: http://ryanclouser.com/?p=66 http://fa ...

  6. BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)

    在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  很多年后,人们终于在进香 ...

  7. bzoj 3267: KC采花&&3272&&3638&&3502 线段树

    题目大意 给定一个长为n的序列,维护两种操作: 1.单点修改 2.在[l,r]这段区间中取k个互不相交的子段,使子段之和最大. \(n \leq 50000,k \leq 20\) 题解 四倍经验.( ...

  8. Spring boot 学习 五:domain的定义

    一 public class City implements Serializable 实现了Sericalizable接口,只是一种标志.表示可以被序列化. java的ObjectOutputStr ...

  9. Docker入门(五):Swarms

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  10. Ubuntu候选栏乱码

    解决方案 cd ~/.config rm -rf SogouPY* sogou* 注销重新登录就可以