根号算法

——如何让复杂度去掉维

数据结构 算法

By

分块

一般分块

板子&原理

SIZ=(int)sqrt(n);//块大小

for(inti=(x-1)*SIZ+1;i<=x*SIZ;i++);//遍历块x(当然)

bl[i]=(i-1)/SIZ+1//i$所在块编号

f[bl[a]+1][bl[b]-1]//a、b之间块内答案

大概只有一类题:

(在线)维护XJB玩意儿。无修

维护一些JB玩意儿比如块内答案、块间答案,然后询问的时候、大力出奇迹。

带修

考虑打标记或者以一定频率重构块。

BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

感觉地球人都会听说过而且都会做.

以及我去年2月份代码真好看.

/*

Author:Scarlet

*/

#include

#include

#include

#definemaxn200011

usingnamespacestd;

intn,m,bl[maxn],f[maxn],to[maxn],k[maxn];

inlineintask(intx){inthe=0;while(x

inlinevoidchange(intx,inty)

{

inti,j=bl[x],r;

f[x]=y;r=y;

if(bl[r]==bl[x])to[x]=to[r],k[x]=k[r]+1;

elseto[x]=y,k[x]=1;

for(i=x-1;i>=0;i--)

{

if(bl[i]!=j)break;r=f[i];

if(bl[r]==bl[i]&&r

elseto[i]=r,k[i]=1;

}

}

intmain()

{

scanf("%d",&n);

inti,j,aa,bb,cc,r,sq=int(sqrt(n)),o=sq,t=0;

for(i=0;i

{

if(o==sq)bl[i]=++t,o=1;elsebl[i]=t,o++;

scanf("%d",&f[i]);f[i]+=i;

}

for(i=n-1;i>=0;i--)

{

r=f[i];

if(bl[r]!=bl[i]||r>=n)to[i]=r,k[i]=1;

elseto[i]=to[r],k[i]=k[r]+1;

}

scanf("%d",&m);

while(m--)

{

scanf("%d",&aa);

if(aa==1)scanf("%d",&bb),printf("%d\n",ask(bb));

elsescanf("%d%d",&bb,&cc),cc+=bb,change(bb,cc);

}

return0;

}

BZOJ 2724: [Violet 6]蒲公英

题意:在线区间众数

cls有的技巧,但是代码复杂度太大只敢写带的.

大致思路是分块,处理出块间众数,答案只可能在块间或者零碎的部分中产生。

枚举一下是哪个,时间计算一下出现了几次,就了.

/*

Author:Scarlet

*/

#include

#definemaxn100005

#definemaxm350

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineLL read()

{

LL x=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

intn,m,SIZ,id,v[maxn],bl[maxn];

intf[maxm][maxm];

mapmp;

intval[maxn],cnt[maxn];

vectorve[maxn];

voidpre(intx)

{

memset(cnt,0,sizeof(cnt));

intmx=0,ans=0,t;

for(inti=(x-1)*SIZ+1;i<=n;i++)

{

cnt[v[i]]++;

t=bl[i];

if(cnt[v[i]]>mx||(cnt[v[i]]==mx&&val[v[i]]

ans=v[i],mx=cnt[v[i]];

f[x][t]=ans;

}

}

intQ(intl,intr,intx)

{

returnupper_bound(ve[x].begin(),ve[x].end(),r)-lower_bound(ve[x].begin(),ve[x].end(),l);

}

intquery(inta,intb)

{

intans,mx,t;

ans=f[bl[a]+1][bl[b]-1];

mx=Q(a,b,ans);

for(inti=a;i<=min(bl[a]*SIZ,b);i++)

{

t=Q(a,b,v[i]);

if(t>mx||(t==mx&&val[v[i]]

}

if(bl[a]!=bl[b])

for(inti=(bl[b]-1)*SIZ+1;i<=b;i++)

{

t=Q(a,b,v[i]);

if(t>mx||(t==mx&&val[v[i]]

}

returnans;

}

intmain()

{

n=read(),m=read();

SIZ=(int)sqrt(n);

intans=0;

for(inti=1;i<=n;i++)

{

v[i]=read();

if(!mp[v[i]])mp[v[i]]=++id,val[id]=v[i];

v[i]=mp[v[i]];

ve[v[i]].push_back(i);

}

for(inti=1;i<=n;i++)bl[i]=(i-1)/SIZ+1;

for(inti=1;i<=bl[n];i++)pre(i);

for(inti=1;i<=m;i++)

{

inta=read(),b=read();

a=(a+ans-1)%n+1;b=(b+ans-1)%n+1;

if(a>b)swap(a,b);

ans=val[query(a,b)];

printf("%d\n",ans);

}

return0;

}

但是我不知怎地就看到了PoPoQQQ的无分块技巧,比在下带的好写到不知道哪里去了(但是并不短)。

姿势水平++。RunID

User

Problem

Result

Memory

Time

Language

Code_Length

Submit_Time

1777662

xmc54300

2724

Accepted

35516 kb

3832 ms

C++/Edit

1980 B

2017-01-06

1777222

xmc54300

2724

Accepted

3676 kb

18892 ms

C++/Edit

1723 B

2017-01-06

Interesting..

/*

Author:Scarlet

*/

#include

#definemaxn40010

#definemaxm210

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

#defineZZ t=++cnt[v[i]];if(t>mx||(t==mx&&val[v[i]]

inlineLL read()

{

LL x=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

intn,m,SIZ,id,v[maxn],bl[maxn];

intf[maxm][maxm],ff[maxm][maxm],g[maxm][maxn];

mapmp;

intval[maxn],cnt[maxn],tim[maxn],T;

voidpre(intx)

{

memset(cnt,0,sizeof(cnt));

intmx=0,ans=0,t;

for(inti=(x-1)*SIZ+1;i<=n;i++)

{

cnt[v[i]]++;t=bl[i];

if(cnt[v[i]]>mx||(cnt[v[i]]==mx&&val[v[i]]

f[x][t]=ans;ff[x][t]=mx;

}

}

intquery(inta,intb)

{

intans,mx,t;++T;

ans=f[bl[a]+1][bl[b]-1];

mx=ff[bl[a]+1][bl[b]-1];

if(bl[a]==bl[b])

for(inti=a;i<=b;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=0;

ZZ

}

else

{

for(inti=a;i<=bl[a]*SIZ;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=g[bl[b]-1][v[i]]-g[bl[a]][v[i]];

ZZ

}

for(inti=(bl[b]-1)*SIZ+1;i<=b;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=g[bl[b]-1][v[i]]-g[bl[a]][v[i]];

ZZ

}

}

returnans;

}

intmain()

{

n=read(),m=read();

SIZ=(int)sqrt(n);

intans=0;

for(inti=1;i<=n;i++)

{

v[i]=read();

if(!mp[v[i]])mp[v[i]]=++id,val[id]=v[i];

v[i]=mp[v[i]];

}

for(inti=1;i<=n;i++)bl[i]=(i-1)/SIZ+1;

for(inti=1;i<=n;i++)

g[bl[i]][v[i]]++;

for(inti=1;i<=bl[n];i++)

for(intj=1;j<=n;j++)

g[i][j]+=g[i-1][j];

for(inti=1;i<=bl[n];i++)pre(i);

for(inti=1;i<=m;i++)

{

inta=read(),b=read();

a=(a+ans-1)%n+1;b=(b+ans-1)%n+1;

if(a>b)swap(a,b);

ans=val[query(a,b)];

printf("%d\n",ans);

}

return0;

}

BZOJ 4241: 历史研究

原理一样,答案不在块间就在边角料里。

带过不去

/*

Author:Scarlet

*/

#include

#definemaxn100010

#definemaxm350

#defineINF200000000000000ll

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

#defineZZ t=val[v[i]]*++cnt[v[i]];t>mx?mx=t:0;

inlineLL read()

{

LL x=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

intn,m,SIZ,id,v[maxn],bl[maxn];

LL f[maxm][maxm];intg[maxm][maxn];

mapmp;

LL val[maxn],cnt[maxn];

inttim[maxn],T;

voidpre(intx)

{

memset(cnt,0,sizeof(cnt));

LL mx=-INF;

for(inti=(x-1)*SIZ+1;i<=n;i++)

{

cnt[v[i]]++;

if(cnt[v[i]]*val[v[i]]>mx)mx=cnt[v[i]]*val[v[i]];

f[x][bl[i]]=mx;

}

}

LL query(inta,intb)

{

++T;LL t,mx=f[bl[a]+1][bl[b]-1];

if(bl[a]==bl[b])

for(inti=a;i<=b;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=0;

ZZ

}

else

{

for(inti=a;i<=bl[a]*SIZ;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=g[bl[b]-1][v[i]]-g[bl[a]][v[i]];

ZZ

}

for(inti=(bl[b]-1)*SIZ+1;i<=b;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=g[bl[b]-1][v[i]]-g[bl[a]][v[i]];

ZZ

}

}

returnmx;

}

intmain()

{

n=read(),m=read();

SIZ=(int)sqrt(n);

for(inti=1;i<=n;i++)

{

v[i]=read();

if(!mp[v[i]])mp[v[i]]=++id,val[id]=v[i];

v[i]=mp[v[i]];

}

for(inti=1;i<=n;i++)bl[i]=(i-1)/SIZ+1;

for(inti=1;i<=n;i++)

g[bl[i]][v[i]]++;

for(inti=1;i<=bl[n];i++)

for(intj=1;j<=n;j++)

g[i][j]+=g[i-1][j];

for(inti=1;i<=bl[n];i++)pre(i);

for(inti=1;i<=m;i++)

{

inta=read(),b=read();

printf("%lld\n",query(a,b));

}

return0;

}

BZOJ 2821: 作诗(Poetize)

做题前先吟一句诗:苟

这套路贼JB明显。

但是出题人您为什么要卡内存啊,幸好在下分块可以调节块的大小,但还是MLE+RE了不知道几发

/*

Author:Scarlet

*/

#include

#definemaxn100005

#definemaxm305

#defineINF200000000000000ll

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineLL read()

{

LL x=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

intn,m,SIZ,id,v[maxn],bl[maxn];

intf[maxm][maxm],g[maxm][maxn],cnt[maxn];

inttim[maxn],T,c;

voidpre(intx)

{

memset(cnt,0,sizeof(cnt));

intans=0;

for(inti=(x-1)*SIZ+1;i<=n;i++)

{

cnt[v[i]]++;

if(cnt[v[i]]&1)cnt[v[i]]-1?ans--:0;

elseans++;

f[x][bl[i]]=ans;

}

}

intquery(inta,intb)

{

++T;

intans=f[bl[a]+1][bl[b]-1],t;

if(bl[a]==bl[b])

for(inti=a;i<=b;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=0;

t=++cnt[v[i]];

if(cnt[v[i]]&1)cnt[v[i]]-1?ans--:0;

elseans++;

}

else

{

for(inti=a;i<=bl[a]*SIZ;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=g[bl[b]-1][v[i]]-g[bl[a]][v[i]];

t=++cnt[v[i]];

if(cnt[v[i]]&1)cnt[v[i]]-1?ans--:0;

elseans++;

}

for(inti=(bl[b]-1)*SIZ+1;i<=b;i++)

{

if(tim[v[i]]!=T)tim[v[i]]=T,cnt[v[i]]=g[bl[b]-1][v[i]]-g[bl[a]][v[i]];

t=++cnt[v[i]];

if(cnt[v[i]]&1)cnt[v[i]]-1?ans--:0;

elseans++;

}

}

returnans;

}

intmain()

{

n=read(),c=read(),m=read();

intans=0;

SIZ=(int)sqrt(n);

if((n-1)/SIZ+1>300)SIZ=350;

for(inti=1;i<=n;i++)

v[i]=read();

for(inti=1;i<=n;i++)bl[i]=(i-1)/SIZ+1;

for(inti=1;i<=n;i++)

g[bl[i]][v[i]]++;

for(inti=1;i<=bl[n];i++)

for(intj=1;j<=n;j++)

g[i][j]+=g[i-1][j];

for(inti=1;i<=bl[n];i++)pre(i);

for(inti=1;i<=m;i++)

{

inta=read(),b=read();

a=(a+ans)%n+1;b=(b+ans)%n+1;

if(a>b)swap(a,b);

printf("%d\n",ans=query(a,b));

}

return0;

}

树分块

板子&原理建树

在原树上遍历并暴力建块(判断父亲块是否满块),暴力记录每块内容,并在块间连单向边,构成“块树”。

点修改

只更新所在块内容。

加点

只判断父亲块是否满而选择新建块还是和父亲搞基。

子树询问

和根在同一块的单独统计,否则可以大力在“块树”上成块统计。

/*

Author:Scarlet

*/

voiddfs(intx)//“分块”处理,可能不是最快的姿势,另一种可以看树上莫队第一题

{

if(blo[bel[fa[x]]].size==block)//块满

blo[bel[x]=++cnt].ist(a[x]),AE(bidx,bel[fa[x]],cnt);//新开一块并和父亲块连(单向)边

else

blo[bel[x]=bel[fa[x]]].ist(a[x]);//在原块内加入

for(inti=idx[x];i;i=nxt[i])//遍历原树

if(to[i]!=fa[x])

fa[to[i]]=x,dfs(to[i]);

}

voidBDFS(intx,inty)

{

//块内点统计

for(inti=bidx[x];i;i=nxt[i])

BDFS(to[i],y);//遍历相邻的块,因为是单向的而且处理的是子树问题所以只要无脑遍历就行了。

}

voidDFS(intx,inty)//求解

{

//块外点统计

for(inti=idx[x];i;i=nxt[i])//遍历原树

if(to[i]!=fa[x])

if(bel[to[i]]==bel[x])//在根所在的块内要单独统计

DFS(to[i],y);

else

BDFS(bel[to[i]],y);//不在块内的就可以成块统计了

}

//调用:

dfs(1);//构树

blo[bel[x]].mdf(...);//对点x修改

AE(idx,x,n);fa[n]=x;//新建点的实力伪代码

if(x块满)新块加入n,x块->n块;elsex块加入n;

DFS(x,...);//对x的子树查询

大概只有一类题:

(在线)在树上维护XJB玩意儿。

大力出奇迹。

BZOJ 3720: Gty的妹子树

树分块板子题,也是板子来源..

在板子里讲得很清楚了w

/*

Author:Scarlet

*/

#include

#definemaxn30300

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

structpoi

{

inta[210],size;

voidist(intx)//

{

++size;

inti=size;

for(;i>1&&a[i-1]>x;i--)a[i]=a[i-1];

a[i]=x;

}

voidmdf(intx,inty)//

{

intt=lower_bound(a+1,a+size+1,x)-a;

for(;t

for(;t>1&&a[t-1]>y;t--)a[t]=a[t-1];

a[t]=y;

}

intqry(intx)//

{

intt=upper_bound(a+1,a+size+1,x)-a;

returnsize-t+1;

}

}blo[10100];

#defineAE(idx,u,v)to[Si]=v,nxt[Si]=idx[u],idx[u]=Si++

intidx[maxn*2],bidx[maxn],nxt[maxn*4],to[maxn*4],Si=1;

inta[maxn*2],fa[maxn*2],bel[maxn*2];

intn,m,block,ans,cnt;

voiddfs(intx)

{

if(blo[bel[fa[x]]].size==block)

blo[bel[x]=++cnt].ist(a[x]),AE(bidx,bel[fa[x]],cnt);

else

blo[bel[x]=bel[fa[x]]].ist(a[x]);

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa[x])fa[to[i]]=x,dfs(to[i]);

}

voidBDFS(intx,inty)

{

ans+=blo[x].qry(y);

for(inti=bidx[x];i;i=nxt[i])BDFS(to[i],y);

}

voidDFS(intx,inty)

{

if(a[x]>y)++ans;

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa[x])

if(bel[to[i]]==bel[x])DFS(to[i],y);

elseBDFS(bel[to[i]],y);

}

intmain()

{

n=read();

for(inti=1,x,y;i

x=read(),y=read(),AE(idx,x,y),AE(idx,y,x);

for(inti=1;i<=n;i++)

a[i]=read();

block=(int)(sqrt(n)+1e-7);

dfs(1);

m=read();

for(;m--;)

{

intp=read(),x=read(),y=read();

x^=ans,y^=ans;

if(p==0)ans=0,DFS(x,y),printf("%d\n",ans);

elseif(p==1)blo[bel[x]].mdf(a[x],y),a[x]=y;

else

{

a[++n]=y;AE(idx,x,n);fa[n]=x;

if(blo[bel[x]].size==block)

blo[bel[n]=++cnt].ist(y),AE(bidx,bel[x],cnt);

else

blo[bel[n]=bel[x]].ist(y);

}

}

return0;

}

BZOJ 1086: [SCOI2005]王室联邦

PoPoQQQ:《手把手教你树分块系列》

简单来说就是用一遍dfs实现自下而上的贪心

(以下来自hzwer)一个省至少要有B,如果子树大小超过B,直接子树划个省,根为省会

。。。

剩余的部分小于B的话随便扔哪都是合法的吧

/*

Author:Scarlet

*/

#include

#definemaxn1005

#definemaxm2010

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

intn,B,top,pro;

#defineAE(u,v)to[Si]=v,nxt[Si]=idx[u],idx[u]=Si++

intidx[maxn],nxt[maxm],to[maxm],Si=1;

intq[maxn],size[maxn],belong[maxn],cap[maxn];

voiddfs(intx,intfa)

{

q[++top]=x;

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa)

{

dfs(to[i],x);

if(size[x]+size[to[i]]>=B)

{

size[x]=0;cap[++pro]=x;

while(q[top]!=x)

belong[q[top--]]=pro;

}

elsesize[x]+=size[to[i]];

}

size[x]++;

}

voidpaint(intx,intfa,intc)

{

if(belong[x])c=belong[x];elsebelong[x]=c;

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa)

paint(to[i],x,c);

}

intmain()

{

n=read();B=read();

if(n

for(inti=1,u,v;i

u=read(),v=read(),AE(u,v),AE(v,u);

dfs(1,0);

if(!pro)cap[++pro]=1;

paint(1,0,pro);

printf("%d\n",pro);

for(inti=1;i<=n;i++)printf("%d ",belong[i]);puts("");

for(inti=1;i<=pro;i++)printf("%d ",cap[i]);

return0;

}

咦...树分块好像没有会做的题目了?

没智商可减.jpg

膜队

一般莫队

板子&&原理

序列上的莫队一般是先维护一个区间的答案(一般来说这个维护起来十分simple),再通过对离线询问的特殊排序,做到均摊的高妙复杂度。

相信直接看上面一段都看不懂。

inlineboolcmp(constpoi&a,constpoi&b){returnbel[a.l]==bel[b.l]?a.r

for(inti=1,L=1,R=0;i<=m;i++)

{

for(;R

for(;L>Q[i].l;)ins(a[--L]);

for(;R>Q[i].r;)del(a[R--]);

for(;L

ans[Q[i].i]=//计算答案

}

是不是感觉这个算法强无敌?

BZOJ 3585: mex

先离线套个莫队冷静以下,然后问题就变成了如何快速求mex。

考虑到莫队转移,计算的特性,明显我们希望有一个插入,查询的数据结构,这样可以把复杂度降到。

还能怎么办?分块!

对权值分块,记录每个块中数字出现个数以及是否已满。

插入、删除:找到所在块,cnt更新,判断size,

询问:找到第一个未满的块,在块内查询,

没了?没了。。

/*

Author:Scarlet

*/

#include

#definemaxn200100

#definemaxm450

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

structpoi{intl,r,i;}Q[maxn];

inta[maxn],bel[maxn],f[maxn],ba[maxm],ans[maxn];

intl[maxm],r[maxm];

intn,m,SIZ;

inlineboolcmp(constpoi&a,constpoi&b){returnbel[a.l]==bel[b.l]?a.r

voidins(intx)

{

if(x>n)return;

if(!f[x]++)ba[bel[x]]++;

}

voiddel(intx)

{

if(x>n)return;

if(!--f[x])ba[bel[x]]--;

}

intqry()

{

if(!f[0])return0;

inti;

for(i=1;l[i];i++)if(ba[i]!=r[i]-l[i]+1)break;

for(intj=l[i];j<=r[i];j++)if(!f[j])returnj;

returnn;

}

intmain()

{

n=read(),m=read();

SIZ=(int)(sqrt(n)+1e-7);

for(inti=1;i<=n;i++)bel[i]=(i-1)/SIZ+1,a[i]=read();

for(inti=1;(i-1)*SIZ+1<=n;i++)

l[i]=(i-1)*SIZ+1,r[i]=min(i*SIZ,n);

for(inti=1,x,y;i<=m;i++)x=read(),y=read(),Q[i]=(poi){x,y,i};

sort(Q+1,Q+1+m,cmp);

for(inti=1,L=1,R=0;i<=m;i++)

{

for(;R

for(;L>Q[i].l;)ins(a[--L]);

for(;R>Q[i].r;)del(a[R--]);

for(;L

ans[Q[i].i]=qry();

}

for(inti=1;i<=m;i++)//我m打成n也A了= =

printf("%d\n",ans[i]);

return0;

}

当然这道题有十分优秀的树状数组离线和主席树在线算法然而并不在讨论范围之中

当你点进hzwer的BIT题解时发现他并没有写BIT,反而是写了一个奇慢无比的线段树然后想来把我批判一番时,那么抱歉在下已经用这个算法艹进第一页了

BZOJ 3809: Gty的二逼妹子序列

还是十分simple的一道题,一模一样的处理吧。

块间枚举、边角料枚举。

时限挺宽的,卡个毛线常数啊。

/*

Author:Scarlet

*/

#include

#definemaxn100100

#definemaxm350

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

structpoi{intl,r,a,b,i;}Q[1000100];

inta[maxn],bel[maxn],f[maxn],ba[maxm],ans[1000100];

intl[maxm],r[maxm];

intn,m,SIZ;

inlineboolcmp(constpoi&a,constpoi&b){returnbel[a.l]==bel[b.l]?a.r

voidins(intx){if(!f[x]++)ba[bel[x]]++;}

voiddel(intx){if(!--f[x])ba[bel[x]]--;}

intqry(inta,intb)

{

intans=0;

if(bel[a]==bel[b]){for(inti=a;i<=b;i++)if(f[i])ans++;}

else

{

for(inti=a;i<=r[bel[a]];i++)if(f[i])ans++;

for(inti=l[bel[b]];i<=b;i++)if(f[i])ans++;

for(inti=bel[a]+1;i

}

returnans;

}

intmain()

{

n=read(),m=read();

SIZ=(int)(sqrt(n)+1e-7);

for(inti=1;i<=n;i++)bel[i]=(i-1)/SIZ+1,a[i]=read();

for(inti=1;(i-1)*SIZ+1<=n;i++)

l[i]=(i-1)*SIZ+1,r[i]=min(i*SIZ,n);

for(inti=1,x,y,a,b;i<=m;i++)

x=read(),y=read(),a=read(),b=read(),Q[i]=(poi){x,y,a,b,i};

sort(Q+1,Q+1+m,cmp);

for(inti=1,L=1,R=0;i<=m;i++)

{

for(;R

for(;L>Q[i].l;)ins(a[--L]);

for(;R>Q[i].r;)del(a[R--]);

for(;L

ans[Q[i].i]=qry(Q[i].a,Q[i].b);

}

for(inti=1;i<=m;i++)

printf("%d\n",ans[i]);

return0;

}

树上莫队

板子&&原理

树上莫队一般是先求出一个dfs序,然后把树分块。就可以十分simple地维护一条链的答案。再通过对离线询问的特殊排序,做到均摊的高妙复杂度。

相信直接看上面一段都看不懂。

inlineboolcmp(constpoi&a,constpoi&b){returnbel[a.u]==bel[b.u]?dfn[a.v]

voidrev(intx)

{

vis[x]^=1;

if(vis[x]){p[c[x]]++;if(p[c[x]]==1)upd();}

else{p[c[x]]--;if(p[c[x]]==0)upd();}

}

voidmove(intu,intv)

{

for(;u^v;)

if(dep[u]>dep[v])rev(u),u=fa[u][0];

elserev(v),v=fa[v][0];

}//爬

for(inti=1;i<=m;i++)//main

{

move(q[i-1].u,q[i].u);

move(q[i-1].v,q[i].v);

//搞事情

}

是不是感觉这个算法强无敌?

UPD:貌似通过拆点变成贡献+1-1的dfs序就可以直接上莫队了啊QAQ

BZOJ 3757: 苹果树

维护链上颜色数。。

暴力莫队啊QAQ。

BZOJ不能交了。

跑了5sRE安慰自己。

/*

Author:Scarlet

*/

#include

#definemaxn50010

#definemaxm100010

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

#defineAE(u,v)to[Si]=v,nxt[Si]=idx[u],idx[u]=Si++

intidx[maxn],nxt[maxm],to[maxm],Si=1;

intbin[20],n,m,ans,top,ind,blo,blonum,root;

intres[maxm],p[maxn],fa[maxn][17],dep[maxn];

intc[maxn],st[maxn],dfn[maxn],bel[maxn];

boolvis[maxn];

structpoi{intu,v,a,b,i;}q[maxm];

inlineboolcmp(constpoi&a,constpoi&b){returnbel[a.u]==bel[b.u]?dfn[a.v]

intdfs(intx)

{

intsize=0;

dfn[x]=++ind;

for(inti=1;i<=16;i++)

fa[x][i]=fa[fa[x][i-1]][i-1];

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa[x][0])

{

dep[to[i]]=dep[x]+1;

fa[to[i]][0]=x;

size+=dfs(to[i]);

if(size>=blo)//这里用的是hzwer的【1086】分块技巧,听说比PoPoQQQ写的那种(即树分块模板里的)要快

{

blonum++;

for(intk=1;k<=size;k++)

bel[st[top--]]=blonum;

size=0;

}

}

st[++top]=x;

returnsize+1;

}

intlca(intx,inty)

{

if(dep[x]

for(inti=0,t=dep[x]-dep[y];bin[i]<=t;i++)

if(t&bin[i])x=fa[x][i];

if(x==y)returnx;

for(inti=16;i>=0;i--)

if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];

returnfa[x][0];

}

voidrev(intx)

{

vis[x]^=1;

if(vis[x]){p[c[x]]++;if(p[c[x]]==1)ans++;}

else{p[c[x]]--;if(p[c[x]]==0)ans--;}

}

voidmove(intu,intv)

{

for(;u^v;)

if(dep[u]>dep[v])rev(u),u=fa[u][0];

elserev(v),v=fa[v][0];

}

intmain()

{

freopen("w.in","r",stdin);

bin[0]=1;

for(inti=1;i<20;i++)bin[i]=bin[i-1]<<1;

n=read();m=read();

blo=sqrt(n);

for(inti=1;i<=n;i++)c[i]=read();

for(inti=1,u,v;i<=n;i++)

{

u=read(),v=read();

if(!u)root=v;elseif(!v)root=u;

elseAE(u,v),AE(v,u);

}

dfs(root);

blonum++;

while(top)bel[st[top--]]=blonum;

for(inti=1;i<=m;i++)

{

intu=read(),v=read(),a=read(),b=read();

if(dfn[u]>dfn[v])swap(u,v);

q[i]=(poi){u,v,a,b,i};

}

sort(q+1,q+1+m,cmp);

intt=lca(q[1].u,q[1].v);

move(q[1].u,q[1].v);

rev(t);//因为是边链,所以怎么处理大家都懂得

res[q[1].i]=ans;

if(p[q[1].a]&&p[q[1].b]&&q[1].a!=q[1].b)res[q[1].i]--;

rev(t);

for(inti=2;i<=m;i++)

{

move(q[i-1].u,q[i].u);

move(q[i-1].v,q[i].v);

t=lca(q[i].u,q[i].v);

rev(t);res[q[i].i]=ans;

if(p[q[i].a]&&p[q[i].b]&&q[i].a!=q[i].b)res[q[i].i]--;

rev(t);

}

for(inti=1;i<=m;i++)

printf("%d\n",res[i]);

return0;

}

带修莫队

板子&原理

带修莫队,就是带修改的莫队,同样适合序列上和树上。

考虑每次修改实际上就是时间推移,那么我们把询问带上时间戳,修改一下块的大小为就能在内跑了。

voidtimeleap(intx,inty)//修改操作(好中二的名字)

{

if(vis[x])rev(x),C[x]=y,rev(x);

elseC[x]=y;

}

for(intj=q[i-1].t+1;j<=q[i].t;j++)

timeleap(c[j].x,c[j].y);//时间跳跃

for(intj=q[i-1].t;j>q[i].t;j--)

timeleap(c[j].x,c[j].pre);

出题人好像只喜欢在树上带修= =

要上什么例题了大家都懂的哈。

BZOJ 3052: [wc2013]糖果公园

因为糖果是按序吃按序得分的,而且同样的糖果,123吃法和321的得分是一样的。那么就可以大力莫队了

/*

Author:Scarlet

*/

#include

#definemaxn100010

#definemaxm200010

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

#defineAE(u,v)to[Si]=v,nxt[Si]=idx[u],idx[u]=Si++

intidx[maxn],nxt[maxm],to[maxm],Si=1;

LL V[maxn],W[maxn],C[maxn],pre[maxn],ans,res[maxn];

intbin[20],n,m,top,ind,blo,blonum;

intfa[maxn][17],dep[maxn],num[maxn];

intst[maxn],dfn[maxn],bel[maxn];

boolvis[maxn];

structpoi{intx,y,t,i;}q[maxn];

structUUZ{intx,y,pre;}c[maxn];

inlineboolcmp(constpoi&a,constpoi&b)

{

if(bel[a.x]==bel[b.x]&&bel[a.y]==bel[b.y])returna.t

elseif(bel[a.x]==bel[b.x])returnbel[a.y]

elsereturnbel[a.x]

}

intdfs(intx)

{

intsize=0;

dfn[x]=++ind;

for(inti=1;i<=16;i++)

fa[x][i]=fa[fa[x][i-1]][i-1];

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa[x][0])

{

dep[to[i]]=dep[x]+1;

fa[to[i]][0]=x;

size+=dfs(to[i]);

if(size>=blo)

{

blonum++;

for(intk=1;k<=size;k++)

bel[st[top--]]=blonum;

size=0;

}

}

st[++top]=x;

returnsize+1;

}

intlca(intx,inty)

{

if(dep[x]

for(inti=0,t=dep[x]-dep[y];bin[i]<=t;i++)

if(t&bin[i])x=fa[x][i];

if(x==y)returnx;

for(inti=16;i>=0;i--)

if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];

returnfa[x][0];

}

voidrev(intx)

{

if(vis[x])ans-=W[num[C[x]]]*V[C[x]],num[C[x]]--;

elsenum[C[x]]++,ans+=W[num[C[x]]]*V[C[x]];

vis[x]^=1;

}

voidtimeleap(intx,inty)

{

if(vis[x])rev(x),C[x]=y,rev(x);

elseC[x]=y;

}

voidmove(intu,intv)

{

for(;u^v;)

if(dep[u]>dep[v])rev(u),u=fa[u][0];

elserev(v),v=fa[v][0];

}

intmain()

{

bin[0]=1;

for(inti=1;i<20;i++)bin[i]=bin[i-1]<<1;

n=read();m=read();intQ=read();

blo=pow(n,2.0/3)*0.5;

for(inti=1;i<=m;i++)V[i]=read();

for(inti=1;i<=n;i++)W[i]=read();

for(inti=1,u,v;i

u=read(),v=read(),AE(u,v),AE(v,u);

for(inti=1;i<=n;i++)pre[i]=C[i]=read();

dfs(1);

blonum++;

while(top)bel[st[top--]]=blonum;

intc1=0,c2=0;

for(inti=1;i<=Q;i++)

{

inttyp=read(),x=read(),y=read();

if(!typ)

c[++c1]=(UUZ){x,y,pre[x]},pre[x]=y;

else

{

if(dfn[x]>dfn[y])swap(x,y);

q[++c2]=(poi){x,y,c1,c2};

}

}

sort(q+1,q+1+c2,cmp);

for(inti=1;i<=q[1].t;i++)

timeleap(c[i].x,c[i].y);

move(q[1].x,q[1].y);

intt=lca(q[1].x,q[1].y);

rev(t);res[q[1].i]=ans;rev(t);

for(inti=2;i<=c2;i++)

{

for(intj=q[i-1].t+1;j<=q[i].t;j++)

timeleap(c[j].x,c[j].y);

for(intj=q[i-1].t;j>q[i].t;j--)

timeleap(c[j].x,c[j].pre);

move(q[i-1].x,q[i].x);

move(q[i-1].y,q[i].y);

t=lca(q[i].x,q[i].y);

rev(t);res[q[i].i]=ans;rev(t);

}

for(inti=1;i<=c2;i++)

printf("%lld\n",res[i]);

return0;

}

BZOJ 4129: Haruna’s Breakfast

树上求mex,不能再套路了吧。

/*

Author:Scarlet

*/

#include

#definemaxn50010

#definemaxm100010

#definemaxb250

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

#defineAE(u,v)to[Si]=v,nxt[Si]=idx[u],idx[u]=Si++

intidx[maxn],nxt[maxm],to[maxm],Si=1;

inta[maxn];

intbin[20],n,top,ind,blo,blonum;

intfa[maxn][17],dep[maxn],num[maxn];

intst[maxn],res[maxn],pre[maxn],dfn[maxn],bel[maxn];

boolvis[maxn];

structpoi{intx,y,t,i;}q[maxn];

structUUZ{intx,y,pre;}c[maxn];

inlineboolcmp(constpoi&a,constpoi&b)

{

if(bel[a.x]==bel[b.x]&&bel[a.y]==bel[b.y])returna.t

elseif(bel[a.x]==bel[b.x])returnbel[a.y]

elsereturnbel[a.x]

}

intdfs(intx)

{

intsize=0;

dfn[x]=++ind;

for(inti=1;i<=16;i++)

fa[x][i]=fa[fa[x][i-1]][i-1];

for(inti=idx[x];i;i=nxt[i])

if(to[i]!=fa[x][0])

{

dep[to[i]]=dep[x]+1;

fa[to[i]][0]=x;

size+=dfs(to[i]);

if(size>=blo)

{

blonum++;

for(intk=1;k<=size;k++)

bel[st[top--]]=blonum;

size=0;

}

}

st[++top]=x;

returnsize+1;

}

intlca(intx,inty)

{

if(dep[x]

for(inti=0,t=dep[x]-dep[y];bin[i]<=t;i++)

if(t&bin[i])x=fa[x][i];

if(x==y)returnx;

for(inti=16;i>=0;i--)

if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];

returnfa[x][0];

}

intf[maxn],ba[maxb],bb[maxn],SIZ,l[maxb],r[maxb];

voidrev(intx)

{

if(a[x]>n)return;

if(vis[x])

{

if(!--f[a[x]])ba[bb[a[x]]]--;

}

else

if(!f[a[x]]++)ba[bb[a[x]]]++;

vis[x]^=1;

}

voidtimeleap(intx,inty)

{

if(vis[x])rev(x),a[x]=y,rev(x);

elsea[x]=y;

}

voidmove(intu,intv)

{

for(;u^v;)

if(dep[u]>dep[v])rev(u),u=fa[u][0];

elserev(v),v=fa[v][0];

}

intqry()

{

if(!f[0])return0;

inti;

for(i=1;l[i];i++)if(ba[i]!=r[i]-l[i]+1)break;

for(intj=l[i];j<=r[i];j++)if(!f[j])returnj;

returnn;

}

intmain()

{

bin[0]=1;

for(inti=1;i<20;i++)bin[i]=bin[i-1]<<1;

n=read();intQ=read();

SIZ=(int)(sqrt(n)+1e-7);

blo=pow(n,2.0/3)*0.5;

for(inti=1;i<=n;i++)bb[i]=(i-1)/SIZ+1,pre[i]=a[i]=read();

for(inti=1;(i-1)*SIZ+1<=n;i++)

l[i]=(i-1)*SIZ+1,r[i]=min(i*SIZ,n);

for(inti=1,u,v;i

u=read(),v=read(),AE(u,v),AE(v,u);

dfs(1);

blonum++;

while(top)bel[st[top--]]=blonum;

intc1=0,c2=0;

for(inti=1;i<=Q;i++)

{

inttyp=read(),x=read(),y=read();

if(!typ)

c[++c1]=(UUZ){x,y,pre[x]},pre[x]=y;

else

{

if(dfn[x]>dfn[y])swap(x,y);

q[++c2]=(poi){x,y,c1,c2};

}

}

sort(q+1,q+1+c2,cmp);

for(inti=1;i<=q[1].t;i++)

timeleap(c[i].x,c[i].y);

move(q[1].x,q[1].y);

intt=lca(q[1].x,q[1].y);

rev(t);res[q[1].i]=qry();rev(t);

for(inti=2;i<=c2;i++)

{

for(intj=q[i-1].t+1;j<=q[i].t;j++)

timeleap(c[j].x,c[j].y);

for(intj=q[i-1].t;j>q[i].t;j--)

timeleap(c[j].x,c[j].pre);

move(q[i-1].x,q[i].x);

move(q[i-1].y,q[i].y);

t=lca(q[i].x,q[i].y);

rev(t);res[q[i].i]=qry();rev(t);

}

for(inti=1;i<=c2;i++)

printf("%d\n",res[i]);

return0;

}

数论加速

从丧心病狂的分块莫队过渡到了这儿。

没错,我只是想做几道数论题冷静一下。

分块计算

板子&原理

大家都知道最多有个取值。

那么只要把个取值出现了几次搞一搞就好了。

for(ans=0,i=1;i<=n&&i<=m;i=j+1)//单指标求和

{

j=n/(n/i);//到块尾

ans+=(j-i+1)*(n/i);

}

BZOJ 4407: 于神之怒加强版

题解:From Claris

设,则为和的狄利克雷卷积。

对于的计算,质数时直接快速幂,质数的幂递推计算,其它数可以通过线性筛得到。

对于每次询问,分块求和即可。

时间复杂度。

/*

Author:Scarlet

*/

#include

#defineN5000001

#definemod1000000007

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

inlineintPow(inta,intb){intt=1;for(;b;b>>=1,a=1LL*a*a%mod)if(b&1)t=1LL*t*a%mod;returnt;}

intT,n,m,k,tot,p[N],f[N],g[N],F[N],ans;boolv[N];

intmain()

{

T=read(),k=read();

F[1]=1;

for(inti=2;i

{

if(!v[i])f[i]=Pow(i,k),g[i]=i,F[i]=f[i]-1,p[tot++]=i;

for(intj=0;j

{

v[i*p[j]]=1;

if(i%p[j])

{

g[i*p[j]]=p[j];

F[i*p[j]]=1LL*F[i]*F[p[j]]%mod;

}

else

{

g[i*p[j]]=g[i]*p[j];

F[i*p[j]]=g[i]!=i?1LL*F[i/g[i]]*F[g[i]*p[j]]%mod:1LL*F[i]*f[p[j]]%mod;

break;

}

}

}

for(inti=2;i

for(inti,j;T--;)

{

n=read(),m=read();

for(ans=0,i=1;i<=n&&i<=m;i=j+1)

{

j=min(n/(n/i),m/(m/i));

ans=(1LL*(F[j]-F[i-1]+mod)*(n/i)%mod*(m/i)+ans)%mod;

}

printf("%d\n",ans);

}

return0;

}

分块打表

原理

没什么好说的,大块答案记录,边角料暴力

BZOJ 3798: 特殊的质数

题意:求中能被表示乘两数平方和的质数个数

POJ 2689: Prime Distance加强

题意:在中找出距离相距最近和最远的两个相邻质数,

先假设大家都会做原题..

好,那么大家都会做加强版了。

分块,每块大小用std跑出块内答案,记录首尾质数。边角料一样用std跑,块间XJB合并一下..

我TM就是个天才

询问分类

什么是询问分类?

就是把询问分成两类(或更多),由每一类的特性分别统计答案获得全局较低复杂度。

经典题 三元环的个数

题意:给定一个个点,条边的简单图,求三元环的个数,

当点的度不足时,称为轻点,否则为重点。

显然重点的数目不超过个,考虑枚举其中三个点直接统计,复杂度

又轻点的出边不足,可以枚举两条出边判断三个点是否为三元环,每条边被枚举了次。复杂度

总复杂度,十分优秀。

找不到OJ中有这道题啊。

BZOJ 2506: calc

题意:给一个长度为的非负整数序列。现有个询问,每次询问给出,问满足且的值的个数。

离线,询问拆分并分成两类

前者可以用f1[i][j]表示加入的元素对i取模余数为j的个数

后者用f2[i]表示大小为i的数的个数,因为只要将f[k],f[k+p],f[k+2*p]……最多个数相加即可

/*

Author:Scarlet

*/

#include

#definemaxn100010

#definemaxp10000

#definesqrp100

usingnamespacestd;

typedeflonglongLL;

#defineG c=getchar()

inlineintread()

{

intx=0,f=1;charG;

while(c>57||c<48){if(c=='-')f=-1;G;}

while(c>47&&c<58)x=x*10+c-48,G;

returnx*f;

}

intf1[10010],f2[101][101],a[maxn],ans[maxn],tot;

structpoi{inta,p,k,i;}q[maxn*2];

inlineboolcmp(constpoi&a,constpoi&b){returna.a

intmain()

{

intn=read(),m=read();

for(inti=1;i<=n;i++)a[i]=read();

for(inti=1,l,r,p,k;i<=m;i++)

{

l=read(),r=read(),p=read(),k=read();

q[tot]=(poi){r,p,k,tot},tot++;

q[tot]=(poi){l-1,p,k,tot},tot++;

}

sort(q,q+tot,cmp);intnow=0;

while(!q[now].a&&now

for(inti=1;i<=n;i++)

{

f1[a[i]]++;

for(intp=1;p<=sqrp;p++)

f2[p][a[i]%p]++;

for(;q[now].a==i&&now

{

poi&a=q[now];

intre=0;

if(a.p<=sqrp)re=f2[a.p][a.k];

else

for(intw=a.k;w<=maxp;w+=a.p)

re+=f1[w];

if(a.i&1)ans[a.i>>1]-=re;

elseans[a.i>>1]+=re;

}

}

for(inti=0;i

printf("%d\n",ans[i]);

return0;

}

HDU 4858: 项目管理

度大于的点叫重点,否则叫轻钦点。

把重点之间构苟一个“重图”。

轻点更新:更新邻居答案,

轻点查询:求所有邻居和,

重点更新:更新自己,

重点查询:把来自于轻点的答案加上“重图”上的邻居和,

完美解决

然而我这题模拟直接过我并没有写代码

结语

当我花一个星期写完这些文章的时候,发现分块和莫队都已经成为了时代的眼泪(HNOI:???)。

幸好数论求和这类JB玩意儿仍是现今的考点(但是你推不出公式并没有什么乱用)。

所以大家还是要从套路性根号算法中学到一些优化思想,再用到更加现代化的题目上去。

祝一题一题看到这里的选手省选暴力进队。

poi word转html 根号,根号算法 - 作业部落 Cmd Markdown 编辑阅读器相关推荐

  1. 作业部落 Cmd Markdown 编辑阅读器

    Cmd Markdown 编辑阅读器 Cmd Markdown 编辑阅读器 WindowsMacLinux 全平台客户端 什么是 Markdown 书写一个质能守恒公式1 高亮一段代码2 高效绘制 流 ...

  2. c语言编程实现二维数组的蛇形矩阵,蛇形矩阵 - 作业部落 Cmd Markdown 编辑阅读器...

    蛇形矩阵 C-study-code Erin最近学习了数组,她想通过数组实现一个蛇形方阵的打印,你可以帮她实现这个程序吗? input:整数n(2 output:n*n的方阵,从方阵右上角开始以顺时针 ...

  3. 判刑形状模型_主动形状模型 - 作业部落 Cmd Markdown 编辑阅读器

    主动形状模型 机器学习 常见使用场景 ASM 模型是一种基于统计形变模型的分割算法.在分割图像时,综合考虑了图像的大小.灰度.大致位置和图像形状等先验知识.它使用从训练样本得到的统计模型作为初始位置, ...

  4. 文档服务器搭建markdown,服务器部署 - 作业部落 Cmd Markdown 编辑阅读器

    1.整个项目重新部署: 删除原有程序 将打包好的ROOT.war包copy到服务器的webapps目录下,执行前需要配置好相关的适用服务器配置文件: WEB-INF下的web.xml文件 WEB-IN ...

  5. ppp协议提供服务器,ppp协议 - 作业部落 Cmd Markdown 编辑阅读器

    ppp协议 blog 归档 网络协议 ppp协议 ppp协议详解 1.概述 ppp协议分为几个部分:LCP(链路控制协议).NCP(网络控制协议).认证协议(包括PAP协议和CHAP协议).另外还有C ...

  6. Mq测试仪c语言版,mq? - 作业部落 Cmd Markdown 编辑阅读器

    mq? 翻阅了一些资料,目前市面上流行的消息队列大概有zeroMQ,robbitMQ, kafka, activeMQ. zeroMQ feature:可以使用任意语言,在任何平台上. 信息可以负载在 ...

  7. php根据阅读记录推荐内容,php记录 - 作业部落 Cmd Markdown 编辑阅读器

    php记录 20151209 联系人管理 获取列表,获取单个列表(查看详情),添加和移除分组 设置显示字段,编辑筛选条件 sbase 项目 protected - handler-account-ch ...

  8. 计算机ps计划,PS学习计划 - 作业部落 Cmd Markdown 编辑阅读器

    PS学习计划作者:汐夜 时间:2016/03/18 一.了解阶段 PS的定义:Adobe Photoshop,简称"PS",是由Adobe Systems开发和发行的图像处理软件. ...

  9. php文档阅读器,5.PHP - 作业部落 Cmd Markdown 编辑阅读器

    Apache-Ignite-1.9.0-中文开发手册 5.PHP 5.1.PHP PDO 5.1.1.摘要 PHP提供了一个轻量级.一致的接口来访问数据库,叫做PHP数据对象-PDO,这个扩展依赖于若 ...

最新文章

  1. 当有键盘时如何在开始编辑时使UITextField向上移动?
  2. eclipse 打开时候,弹出来 JVM terminated Exit code=2
  3. 懂得保持平衡的程序员
  4. VTK:几何对象之OpenVRFrustum
  5. spring @lazy_Spring @Lazy批注用例
  6. leetcode256. 粉刷房子
  7. SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例
  8. 2021牛气新年素材模板,你真的不来看一看吗?
  9. 问题处理:qt.qpa.plugin: Could not find the Qt platform plugin “cocoa“ in ““
  10. 计算机流水线作业员做什么,电子厂普通作业员的工作流程是什么
  11. 集成Slice2Java插件
  12. ARM芯片介绍(转贴)
  13. 关于一次性通过CISSP考试的一点经验分享
  14. java 64bit_java9 64位 官方最新版
  15. Windows注册表详解
  16. 【传感器大赏】3轴磁场传感器
  17. 视频编辑工具:添加水印、特效、音乐、导出视频、视频转gif
  18. A. Arena of Greed【贪心+特判】
  19. 我是如何管理我的团队的?
  20. 4年翻4倍年薪30W+的测试工程师个人成长之路

热门文章

  1. VC实现复制粘贴字符串
  2. windows 20008DHCP中继
  3. make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1
  4. Linux用户标识符UID与GID和用户账号
  5. MVC框架简易留言板实例
  6. 量子力学顺口溜_数学的幽默打油诗
  7. 基于51的双机通信系统
  8. 和异性合租是什么样的体验?
  9. 用php照片艺术化,Photoshop把人像照片转化为艺术格子效果图
  10. fceux源码解析_FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本