定義:
struct segmenttree
tree[maxn<<2];
建樹:void build(int p, int l, int r)
int mid = (l + r) >> 1;
build(lson, l, mid);
build(rson, mid+1, r);
//pushup()
}
單點更新:void change(int p, int x)
int mid = (l(p) + r(p)) >> 1;
if(x <= mid) change(lson, x);
else change(rson, x);
//pushup()
}
詢問整體第\(k\)小://詢問整個區間第k小
//s(p)代表l(p)到r(p)值域中樹的個數總和
int query(int p, int k)
鏈結
思路:**:
#include#includeusing namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int a[maxn], num[maxn], u[maxn];
int n, m, len;
struct segmenttree
tree[maxn<<2];
void build(int p, int l, int r)
void change(int p, int x)
int mid = (l(p) + r(p)) >> 1;
if(x <= mid) change(lson, x);
else change(rson, x);
s(p) = s(lson) + s(rson);
}//詢問整個區間第k大
//s(p)代表l(p)到r(p)值域中樹的個數總和
int query(int p, int k)
int main()
for(int i = 1; i <= n; i++)
scanf("%d", &u[i]);
sort(num + 1, num + 1 + m);
len = unique(num + 1, num + 1 + m) - num - 1;
build(1, 1, len);
int cnt = 0, k = 0;
while(n != cnt)
cout << num[query(1, ++k)] << endl;
}return 0;
}
鏈結
題意描述:
思路:**:
#includeusing namespace std;
typedef long long ll;
const int maxn = 5e5 + 10;
ll ans;
int n, a[maxn], num[maxn], len;
struct segmenttree
tree[maxn<<2];
inline void pushup(int p)
inline void build(int p, int l, int r)
inline void change(int p, int x)
int mid = (l(p) + r(p)) >> 1;
if(x <= mid) change(lson, x);
else change(rson, x);
pushup(p);
}ll query(int p, int x)
int main()
build(1, 1, n);
sort(num + 1, num + 1 + n);
len = unique(num + 1, num + 1 + n) - num - 1;
for(int i = 1; i <= n; i++)
for(int i = 1; i <= n; i++) //列舉每個a(i)作為右端點
cout << ans << endl;
return 0;
}
鏈結
題意描述:
#includeusing namespace std;
const int maxn = 3e5 + 10;
int t, n, m, k, cas;
struct segmenttree
tree[maxn<<2];
void pushup(int p)
void build(int p, int l, int r)
int mid = (l + r) >> 1;
build(lson, l, mid);
build(rson, mid+1, r);
pushup(p);
}int query(int p, int k)
void change(int p, int x, int val)
int mid = (l(p) + r(p)) >> 1;
if(x <= mid) change(lson, x, val);
else change(rson, x, val);
pushup(p);
}int main()
printf("case %d: %lld\n", ++cas, ans);
}return 0;
}
學習筆記 權值線段樹
雖然題解很多,也有權值線段樹,但我的和他們似乎不盡相同,跑的也挺快。所謂權值線段樹,就是用線段樹來儲存權值。那什麼是權值呢?似乎小學初中學統計的時候了解到,他是描述數在資料中比例大小的量,這裡用作此數出現的次數。做法顯然。我們用 cnt i 表示第 i 個數出現的次數,那麼可以這樣 void upd...
權值線段樹
維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...
權值線段樹
include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...