這題用了一下午。。本來一直認為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]
zzu--2014年11月16日月賽 C題 123
hdu 3345 War Chess (bfs+優先隊列)
hdu 2348 Turn the corner(三分&am
POJ 2593&&2479:Max Seq
HDU 4414 Finding crosses(dfs)
LeetCode--Excel Sheet Column T