设为首页 加入收藏

TOP

POJ 3237 Tree (树链剖分)
2015-11-21 01:03:05 来源: 作者: 【 】 浏览:1
Tags:POJ 3237 Tree

?
这题用了一下午。。本来一直认为max和min两个数组是不用改的,只需要改lazy数组,然后在查询的时候利用lazy标记来返回max或-min,后来发现错的很严重。。
这题要在pushdown中修改max和min数组,从而实现最大值取反。
代码如下:

#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include
          #include 
          
            #include 
           
             using namespace std; #define LL long long #define pi acos(-1.0) #pragma comment(linker, /STACK:1024000000,1024000000) const int mod=1e9+7; const int INF=0x3f3f3f3f; const double eqs=1e-3; const int MAXN=10000+10; #define root 1, tot, 1 #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 int head[MAXN], cnt, tot; int siz[MAXN], w[MAXN], top[MAXN], son[MAXN], dep[MAXN], fa[MAXN]; int Max[MAXN<<2], Min[MAXN<<2], lazy[MAXN<<2]; struct node { int u, v, w, next; }edge[MAXN<<1]; void add(int u, int v, int w) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } void init() { memset(head,-1,sizeof(head)); cnt=tot=0; memset(son,0,sizeof(son)); memset(dep,0,sizeof(dep)); memset(lazy,0,sizeof(lazy)); memset(Max,-INF,sizeof(Max)); memset(Min,INF,sizeof(Min)); } void dfs1(int u, int p) { siz[u]=1; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(v==p) continue ; dep[v]=dep[u]+1; fa[v]=u; dfs1(v,u); if(siz[son[u]]
            
             >1; PushDown(rt); if(p<=mid) Update(p,x,lson); else Update(p,x,rson); PushUp(rt); } void Negate(int ll, int rr, int l, int r, int rt) { if(ll<=l&&rr>=r){ lazy[rt]=1-lazy[rt]; UpdateNode(rt); return ; } int mid=l+r>>1; PushDown(rt); if(ll<=mid) Negate(ll,rr,lson); if(rr>mid) Negate(ll,rr,rson); PushUp(rt); } int Query(int ll, int rr, int l, int r, int rt) { if(ll<=l&&rr>=r){ return Max[rt]; } int mid=l+r>>1, ans=-INF; PushDown(rt); if(ll<=mid) ans=max(ans,Query(ll,rr,lson)); if(rr>mid) ans=max(ans,Query(ll,rr,rson)); return ans; } }lt; void change(int u, int v) { int f1=top[u], f2=top[v]; while(f1!=f2){ if(dep[f1]
             
            
           
          
        
       
      
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++访问私有(private)成员变量的.. 下一篇UVALive6814 Lexicography

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: