hdu 1166
單點更新,求區間和
第一次寫線段樹,照著大神的抄了一遍
#include #include #include #define max 50100
#define mid (l+r)>>1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int sum[max<<2];
void pushup(int rt)
void build(int l,int r,int rt)
int m=mid;
build(lson);
build(rson);
pushup(rt);
}void updata(int s,int add,int l,int r,int rt)
int m=mid;
if(s<=m) updata(s,add,lson);
else updata(s,add,rson);
pushup(rt);
}int query(int l,int r,int l,int r,int rt)
int m=mid;
int ret=0;
if(l<=m) ret+=query(l,r,lson);
if(r>m) ret+=query(l,r,rson);
return ret;
}int main()
} }return 0;
}
hdu 1754 i hate it
單點更新,求區間最值
#include #include #include #define max 200100
#define mid (l+r)>>1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int num[max<<2];
int n,m;
int max(int a,int b)
void build(int l,int r,int rt)
int m=mid;
build(lson);
build(rson);
num[rt]=max(num[rt<<1],num[rt<<1|1]);
}int query(int l,int r,int l,int r,int rt)
int m=mid;
int ret=-0x3f3f3f3f;
if(l<=m) ret=max(ret,query(l,r,lson));
if(r>m) ret=max(ret,query(l,r,rson));
return ret;
}void updata(int p,int add,int l,int r,int rt)
int m=mid;
if(p<=m) updata(p,add,lson);
else updata(p,add,rson);
num[rt]=max(num[rt<<1],num[rt<<1|1]);
}int main()
} return 0;
}
poj 2828
向序列內部插入數字,求最後的序列
#include #include #include #define max 200100
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid (l+r)>>1
using namespace std;
int num[max<<2],n;
int pos[max],value[max];
int id;
int ans[max];
void build(int l,int r,int rt)
int m=mid;
build(lson);
build(rson);
}void updata(int p,int l,int r,int rt)
int m=mid;
if(num[rt<<1]>=p) updata(p,lson); //當左子樹有充足空位時,插在左子樹
else }
int main()
for(int i=n; i>=1; i--)
for(int i=1; i<=n; i++)
}return 0;
}
hdu 1556
每次更新只需要更新到子樹的根節點,然後在最後求的時候從根節點加到葉節點,即為葉節點被染色的次數
#include #include #include using namespace std;
#define max 100100
#define mid (l+r)>>1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int num[max<<2];
int n;
void updata(int l,int r,int l,int r,int rt)
int m=mid;
if(l<=m) updata(l,r,lson);
if(r>m) updata(l,r,rson);
}void query(int l,int r,int rt,int sum)
int m=mid;
sum+=num[rt];
query(lson,sum);
query(rson,sum);
}int main()
query(1,n,1,0);
} return 0;
}
線段樹(單點更新)
1.hdu 1166 敵兵布陣 單點更新,區間求和,最裸的線段樹 include include include using namespace std define maxn 50010 define lson l,m,rt 1 define rson m 1,r,rt 1 1 struct tr...
線段樹單點更新
g 梔子花開 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 1921 description 這是乙個梔子花開的季節,也是乙個離別的季節,四年一千多個日日夜夜,那校園...
線段樹單點更新 求和
第一行乙個整數t,表示有t組資料。每組資料第一行乙個正整數n n 50000 表示敵人有n個工兵營地,接下來有n個正整數,第i個正整數ai代表第i個工兵營地里開始時有ai個人 1 ai 50 接下來每行有一條命令,命令有4種形式 1 add i j,i和j為正整數,表示第i個營地增加j個人 j不超過...