1984: 月下“毛景树”

Time Limit: 20 Sec  Memory Limit: 64 MB
Submit: 713  Solved: 245
[Submit][Status]

Description

毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园。 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里。爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树”下面,发现树上长着他最爱吃的毛毛果~~~ “毛景树”上有N个节点和N-1条树枝,但节点上是没有毛毛果的,毛毛果都是长在树枝上的。但是这棵“毛景树”有着神奇的魔力,他能改变树枝上毛毛果的个数:  Change k w:将第k条树枝上毛毛果的个数改变为w个。  Cover u v w:将节点u与节点v之间的树枝上毛毛果的个数都改变为w个。  Add u v w:将节点u与节点v之间的树枝上毛毛果的个数都增加w个。 由于毛毛虫很贪,于是他会有如下询问:  Max u v:询问节点u与节点v之间树枝上毛毛果个数最多有多少个。

Input

第一行一个正整数N。 接下来N-1行,每行三个正整数Ui,Vi和Wi,第i+1行描述第i条树枝。表示第i条树枝连接节点Ui和节点Vi,树枝上有Wi个毛毛果。 接下来是操作和询问,以“Stop”结束。

Output

对于毛毛虫的每个询问操作,输出一个答案。

Sample Input

4
1 2 8
1 3 7
3 4 9
Max 2 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 2 4
Stop

Sample Output

9
16

【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。

HINT

 

Source

树的分治

题解:

先说点儿题外话

从8点钟开始我打算写树链剖分,因为转c++以来还没有写过。

抱着不好写、写完不好调、线段树不知能不能写对的心态开始写。

写了大概1个多小时写完。

然后就交bzoj,TLE,于是我把hzwer的程序拿过来对拍,写数据生成器又写了20分钟

第一组数据就发现我的程序死循环了,我就一直debug,而我又不会用gdb,

只能输中间结果来看看哪出错了,找到出错的位置又查哪儿导致的出错,调了差不多2个小时竟然发现是dfs1写错了

卧槽!更新fa[x]我竟然写到遍历节点后去了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

改了之后交上去就A了

我以为这题线段树是重点!!!

我以为写完代码读一遍就不会犯sb错误!!!

我以为树链剖分写过好几次了不会写错!!!

我的人生就浪费在debug上了嘛。。。。。。。。。

。。。。。。

题解就不说了,就是因为把边权捆到了点上所以我不得不写LCA,造成一堆麻烦

线段树大概想一想两种运算的优先级和pushdown、pushup放对位置就可以

代码:

1.伤痕累累的代码

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define inf 1000000000
#define maxn 100000+1000
#define maxm 500+100
#define eps 1e-10
#define ll long long
using namespace std;
struct edge{int go,next,w;}e[*maxn];
struct seg{int l,r,tag,add,mx;}t[*maxn];
int n,tot,cnt=,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn];
int fa[maxn][],dep[maxn],head[maxn],son[maxn],s[maxn];
void ins(int x,int y,int z)
{
e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
}
void insert(int x,int y,int z)
{
ins(x,y,z);ins(y,x,z);
}
void dfs(int x)
{
s[x]=;
for(int i=;i<=;i++)
if((<<i)<=dep[x])
fa[x][i]=fa[fa[x][i-]][i-];
else break;
for(int y=son[x]=,i=head[x];i;i=e[i].next)
if(dep[y=e[i].go]==)
{
dep[y]=dep[x]+;fa[y][]=x;dfs(y);
s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y;
}
}
void dfs2(int x,int chain)
{
p[x]=++cnt;top[x]=chain;
if(son[x])dfs2(son[x],chain);
for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
if(y!=fa[x][]&&y!=son[x])dfs2(y,y);
}
void pushup(int k)
{
t[k].mx=max(t[k<<].mx,t[k<<|].mx);
}
void update1(int k,int x)
{
t[k].tag=x;t[k].add=;t[k].mx=x;
}
void update2(int k,int x)
{
t[k].add+=x;t[k].mx+=x;
}
void pushdown(int k)
{
if(t[k].tag!=-)
{
int x=t[k].tag;
update1(k<<,x);update1(k<<|,x);
t[k].tag=-;
}
if(t[k].add)
{
int x=t[k].add;
update2(k<<,x);update2(k<<|,x);
t[k].add=;
}
}
void build(int k,int x,int y)
{
int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>;
t[k].tag=-;t[k].add=;
if(l==r){t[k].mx=v[l];return;}
build(k<<,l,mid);build(k<<|,mid+,r);
pushup(k);
}
void cover(int k,int x,int y,int z)
{
//cout<<k<<' '<<x<<' '<<y<<' '<<z<<endl;
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update1(k,z);return;}
pushdown(k);
if(y<=mid)cover(k<<,x,y,z);
else if(x>mid)cover(k<<|,x,y,z);
else cover(k<<,x,mid,z),cover(k<<|,mid+,y,z);
pushup(k);
}
void addd(int k,int x,int y,int z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update2(k,z);return;}
pushdown(k);
if(y<=mid)addd(k<<,x,y,z);
else if(x>mid)addd(k<<|,x,y,z);
else addd(k<<,x,mid,z),addd(k<<|,mid+,y,z);
pushup(k);
}
int query(int k,int x,int y)
{
//cout<<k<<' '<<x<<' '<<y<<endl;
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y)return t[k].mx;
pushdown(k);
if(y<=mid)return query(k<<,x,y);
else if(x>mid)return query(k<<|,x,y);
else return max(query(k<<,x,mid),query(k<<|,mid+,y));
}
int lca(int x,int y)
{
//cout<<"!!!!!!!"<<endl;
if(dep[x]<dep[y])swap(x,y);//cout<<"!!!!!!!"<<endl;
int t=dep[x]-dep[y];
for(int i=;i<=;i++)
if(t&(<<i))x=fa[x][i];//cout<<"!!!!!!!"<<endl;
if(x==y)return x;
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i])
{x=fa[x][i];y=fa[y][i];}; //cout<<"!!!!!!!"<<endl;
return fa[x][];
}
void solveadd(int x,int f,int z)
{
while(top[x]!=top[f])
{
addd(,p[top[x]],p[x],z);
x=fa[top[x]][];
}
if(f!=x)addd(,p[f]+,p[x],z);
}
void solvecover(int x,int f,int z)
{
while(top[x]!=top[f])
{
cover(,p[top[x]],p[x],z);
x=fa[top[x]][];
//cout<<"!!!!!"<<endl;
}
// cout<<"!!!!!!"<<endl;
// cout<<f<<' '<<x<<' '<<p[f]<<' '<<p[x]<<endl;
if(f!=x)cover(,p[f]+,p[x],z);
}
int solveask(int x,int f)
{
int ans=;
while(top[x]!=top[f])
{
//cout<<x<<' '<<top[x]<<' '<<p[x]<<' '<<p[top[x]]<<endl;
ans=max(ans,query(,p[top[x]],p[x]));
x=fa[top[x]][];
}
if(f!=x)ans=max(ans,query(,p[f]+,p[x]));
return ans;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
insert(a[i],b[i],c[i]);
}
dep[]=;
dfs();
// for(int i=1;i<=n;i++)cout<<i<<' '<<dep[i]<<endl;
dfs2(,);
for(int i=;i<=n;i++)
// for(int j=0;j<=16;j++)cout<<i<<' '<<j<<' '<<fa[i][j]<<endl;
// for(int i=0;i<=n;i++)cout<<i<<' '<<top[i]<<' '<<p[i]<<' '<<son[i]<<endl;
v[]=;
for(int i=;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i];
for(int i=;i<n;i++)v[p[id[i]]]=c[i];
//for(int i=1;i<=n;i++)cout<<i<<' '<<v[i]<<' '<<id[i]<<' '<<p[i]<<endl; build(,,n);
//for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].tag<<' '<<t[k].add<<' '<<t[k].mx<<endl;
char s[];
int x,y,z,f;
while()
{
//cout<<"!!!!!!!"<<endl;
//for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].tag<<' '<<t[k].add<<' '<<t[k].mx<<endl;
scanf("%s",s);//cout<<s<<endl;
switch(s[])
{
case 't':return ;break;
case 'd':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
solveadd(x,f,z);solveadd(y,f,z);break;
case 'o':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
solvecover(x,f,z);solvecover(y,f,z);
break;
case 'h':scanf("%d%d",&x,&z);cover(,p[id[x]],p[id[x]],z);break;
case 'a':scanf("%d%d",&x,&y);f=lca(x,y);
printf("%d\n",max(solveask(x,f),solveask(y,f)));
//cout<<solveask(x,f)<<' '<<solveask(y,f)<<endl;
break;
}
}
}

2.去掉调试

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define inf 1000000000
#define maxn 100000+1000
#define maxm 500+100
#define eps 1e-10
#define ll long long
using namespace std;
struct edge{int go,next,w;}e[*maxn];
struct seg{int l,r,tag,add,mx;}t[*maxn];
int n,tot,cnt=,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn];
int fa[maxn][],dep[maxn],head[maxn],son[maxn],s[maxn];
void ins(int x,int y,int z)
{
e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
}
void insert(int x,int y,int z)
{
ins(x,y,z);ins(y,x,z);
}
void dfs(int x)
{
s[x]=;
for(int i=;i<=;i++)
if((<<i)<=dep[x])
fa[x][i]=fa[fa[x][i-]][i-];
else break;
for(int y=son[x]=,i=head[x];i;i=e[i].next)
if(dep[y=e[i].go]==)
{
dep[y]=dep[x]+;fa[y][]=x;dfs(y);
s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y;
}
}
void dfs2(int x,int chain)
{
p[x]=++cnt;top[x]=chain;
if(son[x])dfs2(son[x],chain);
for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
if(y!=fa[x][]&&y!=son[x])dfs2(y,y);
}
void pushup(int k)
{
t[k].mx=max(t[k<<].mx,t[k<<|].mx);
}
void update1(int k,int x)
{
t[k].tag=x;t[k].add=;t[k].mx=x;
}
void update2(int k,int x)
{
t[k].add+=x;t[k].mx+=x;
}
void pushdown(int k)
{
if(t[k].tag!=-)
{
int x=t[k].tag;
update1(k<<,x);update1(k<<|,x);
t[k].tag=-;
}
if(t[k].add)
{
int x=t[k].add;
update2(k<<,x);update2(k<<|,x);
t[k].add=;
}
}
void build(int k,int x,int y)
{
int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>;
t[k].tag=-;t[k].add=;
if(l==r){t[k].mx=v[l];return;}
build(k<<,l,mid);build(k<<|,mid+,r);
pushup(k);
}
void cover(int k,int x,int y,int z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update1(k,z);return;}
pushdown(k);
if(y<=mid)cover(k<<,x,y,z);
else if(x>mid)cover(k<<|,x,y,z);
else cover(k<<,x,mid,z),cover(k<<|,mid+,y,z);
pushup(k);
}
void addd(int k,int x,int y,int z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update2(k,z);return;}
pushdown(k);
if(y<=mid)addd(k<<,x,y,z);
else if(x>mid)addd(k<<|,x,y,z);
else addd(k<<,x,mid,z),addd(k<<|,mid+,y,z);
pushup(k);
}
int query(int k,int x,int y)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y)return t[k].mx;
pushdown(k);
if(y<=mid)return query(k<<,x,y);
else if(x>mid)return query(k<<|,x,y);
else return max(query(k<<,x,mid),query(k<<|,mid+,y));
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
int t=dep[x]-dep[y];
for(int i=;i<=;i++)
if(t&(<<i))x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i])
{x=fa[x][i];y=fa[y][i];};
return fa[x][];
}
void solveadd(int x,int f,int z)
{
while(top[x]!=top[f])
{
addd(,p[top[x]],p[x],z);
x=fa[top[x]][];
}
if(f!=x)addd(,p[f]+,p[x],z);
}
void solvecover(int x,int f,int z)
{
while(top[x]!=top[f])
{
cover(,p[top[x]],p[x],z);
x=fa[top[x]][];
}
if(f!=x)cover(,p[f]+,p[x],z);
}
int solveask(int x,int f)
{
int ans=;
while(top[x]!=top[f])
{
ans=max(ans,query(,p[top[x]],p[x]));
x=fa[top[x]][];
}
if(f!=x)ans=max(ans,query(,p[f]+,p[x]));
return ans;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
insert(a[i],b[i],c[i]);
}
dep[]=;
dfs();
dfs2(,);
for(int i=;i<=n;i++)
v[]=;
for(int i=;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i];
for(int i=;i<n;i++)v[p[id[i]]]=c[i];
build(,,n);
char s[];
int x,y,z,f;
while()
{
scanf("%s",s);
switch(s[])
{
case 't':return ;break;
case 'd':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
solveadd(x,f,z);solveadd(y,f,z);break;
case 'o':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
solvecover(x,f,z);solvecover(y,f,z);
break;
case 'h':scanf("%d%d",&x,&z);cover(,p[id[x]],p[id[x]],z);break;
case 'a':scanf("%d%d",&x,&y);f=lca(x,y);
printf("%d\n",max(solveask(x,f),solveask(y,f)));
break;
}
}
}

3.不求LCA也过了,哈哈。不过竟然只快了不到1秒钟QAQ

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define inf 1000000000
#define maxn 100000+1000
#define maxm 500+100
#define eps 1e-10
#define ll long long
using namespace std;
struct edge{int go,next,w;}e[*maxn];
struct seg{int l,r,tag,add,mx;}t[*maxn];
int n,tot,cnt=,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn];
int fa[maxn],dep[maxn],head[maxn],son[maxn],s[maxn];
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
void ins(int x,int y,int z)
{
e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
}
void insert(int x,int y,int z)
{
ins(x,y,z);ins(y,x,z);
}
void dfs(int x)
{
s[x]=;
for(int y=son[x]=,i=head[x];i;i=e[i].next)
if(dep[y=e[i].go]==)
{
dep[y]=dep[x]+;fa[y]=x;dfs(y);
s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y;
}
}
void dfs2(int x,int chain)
{
p[x]=++cnt;top[x]=chain;
if(son[x])dfs2(son[x],chain);
for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
if(y!=fa[x]&&y!=son[x])dfs2(y,y);
}
void pushup(int k)
{
t[k].mx=max(t[k<<].mx,t[k<<|].mx);
}
void update1(int k,int x)
{
t[k].tag=x;t[k].add=;t[k].mx=x;
}
void update2(int k,int x)
{
t[k].add+=x;t[k].mx+=x;
}
void pushdown(int k)
{
if(t[k].tag!=-)
{
int x=t[k].tag;
update1(k<<,x);update1(k<<|,x);
t[k].tag=-;
}
if(t[k].add)
{
int x=t[k].add;
update2(k<<,x);update2(k<<|,x);
t[k].add=;
}
}
void build(int k,int x,int y)
{
int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>;
t[k].tag=-;t[k].add=;
if(l==r){t[k].mx=v[l];return;}
build(k<<,l,mid);build(k<<|,mid+,r);
pushup(k);
}
void cover(int k,int x,int y,int z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update1(k,z);return;}
pushdown(k);
if(y<=mid)cover(k<<,x,y,z);
else if(x>mid)cover(k<<|,x,y,z);
else cover(k<<,x,mid,z),cover(k<<|,mid+,y,z);
pushup(k);
}
void addd(int k,int x,int y,int z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update2(k,z);return;}
pushdown(k);
if(y<=mid)addd(k<<,x,y,z);
else if(x>mid)addd(k<<|,x,y,z);
else addd(k<<,x,mid,z),addd(k<<|,mid+,y,z);
pushup(k);
}
int query(int k,int x,int y)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y)return t[k].mx;
pushdown(k);
if(y<=mid)return query(k<<,x,y);
else if(x>mid)return query(k<<|,x,y);
else return max(query(k<<,x,mid),query(k<<|,mid+,y));
}
void solveadd(int x,int y,int z)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
addd(,p[top[x]],p[x],z);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
if(x!=y)addd(,p[x]+,p[y],z);
}
void solvecover(int x,int y,int z)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
cover(,p[top[x]],p[x],z);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
if(x!=y)cover(,p[x]+,p[y],z);
}
int solveask(int x,int y)
{
int ans=;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,query(,p[top[x]],p[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
if(x!=y)ans=max(ans,query(,p[x]+,p[y]));
return ans;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();
for(int i=;i<n;i++)
{
a[i]=read();b[i]=read();c[i]=read();
insert(a[i],b[i],c[i]);
}
dep[]=;
dfs();
dfs2(,);
for(int i=;i<=n;i++)
v[]=;
for(int i=;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i];
for(int i=;i<n;i++)v[p[id[i]]]=c[i];
build(,,n);
char s[];
int x,y,z,f;
while()
{
scanf("%s",s);
switch(s[])
{
case 't':return ;break;
case 'd':x=read();y=read();z=read();
solveadd(x,y,z);break;
case 'o':x=read();y=read();z=read();
solvecover(x,y,z);
break;
case 'h':x=read();z=read();cover(,p[id[x]],p[id[x]],z);break;
case 'a':x=read();y=read();
printf("%d\n",solveask(x,y));
break;
}
}
}

BZOJ1984: 月下“毛景树”的更多相关文章

  1. [BZOJ1984]月下“毛景树”解题报告|树链剖分

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...

  2. [bzoj1984]月下“毛景树”

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园.毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的" ...

  3. 【树链剖分】【分块】【最近公共祖先】【块状树】bzoj1984 月下“毛景树”

    裸题,但是因为权在边上,所以要先把边权放到这条边的子节点上,然后进行链更新/查询的时候不能更新/查询其lca. #include<cstdio> #include<cmath> ...

  4. 2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)

    传送门 唉蒟蒻又退化了,这道sb题居然做了20min,最后发现是updcovupdcovupdcov写成了updaddupdaddupdadd我还能说什么233233233 就是让你转边权为点权之后, ...

  5. 【BZOJ1984】月下“毛景树” 树链剖分+线段树

    [BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...

  6. 【BZOJ-1984】月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1314  Solved: 416[Submit][Status][Discu ...

  7. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下“毛景树” 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来,可以发现a到b节点间 ...

  8. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  9. Bzoj 1984: 月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1282  Solved: 410[Submit][Status][Discu ...

随机推荐

  1. 【Java规划】DOM XML Parser分解、遍历、创XML

    1.前言 DOM XML Parser简介 DOM 它是 W3C 处理 XML 规范 API,这是很多其他的 XML 地基处理相关标准,不仅是 Java,其他的,如 Javascript,PHP.MS ...

  2. 安全框架Shiro和Spring Security比较

    Shiro 首先Shiro较之 Spring Security,Shiro在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势. Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证. ...

  3. [转] 深度解剖DIV+CSS工作原理

    本文和大家重点讨论一下DIV+CSS工作原理,在一般情况的DIV+CSS开发静态html网页时,我们把html和CSS是分开的,形成html页面和CSS文件. DIV+CSS原理解剖 在一般情况的DI ...

  4. Android 系统移植与驱动开发--第二章搭建Android环境核心步骤及心得

    第二章 搭建Android 开发环境 虽然在这一章中讲的是Android底层开发环境,但是相应伴随的还有Android NDK程序来测试Linux驱动,HAL程序库.底层开发不仅需要交叉编译环境,还要 ...

  5. 使用ef code first模式,在部署后服务器端把数据库同步到最新版本的方法

    共有两种方法: 1.使用migrate.exe 具体使用方法请参考 msdn migrate使用方法,这里只做介绍 复制migrate.exe 在使用 NuGet 安装实体框架时,migrate.ex ...

  6. gridview动态添加列的问题

    相信大家也和我一样遇到过这种问题,gridview在生成列的时候当列不确定怎么办?下面分享一下自己的解决方法. 举个列子说明一下. 普通列的添加比较简单. BoundField bf = new Bo ...

  7. mvc存储Cookie和读取Cookie方法

    mvc存储Cookie和读取Cookie方法: //存储 HttpCookie cookie = new HttpCookie("User"); System.Text.Encod ...

  8. 获取外网IP地址

    public static string GetRealIP(){            string result = String.Empty;            result = HttpC ...

  9. 修改DeDe标签Pagelist分页样式

    我们在用dede仿站的时候,调用文章列表页的分页时,我们会用到: {dede:pagelist listitem=”info,index,end,pre,next,pageno” listsize=” ...

  10. ANSI escape code

    最近在做iOS上的SSH终端项目,主要是在手机上远程连接Unix系统,并进行一些简单的指令操作,类似于SecureCRT:今天想总结一下这个项目中遇到的新东西----ANSI escape code. ...