取板粗   好东西来的

1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665

(POJ2104)http://poj.org/problem?id=2104

(POJ2761)http://poj.org/problem?id=2761

题意:求区间第K大,主席树模板题

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn=;
  7. int tot,n,q,nowm;
  8. int a[maxn],t[maxn];
  9. int c[maxn<<],lson[maxn<<],rson[maxn<<];
  10. int T[maxn];
  11.  
  12. void init_hash()
  13. {
  14. for ( int i=;i<=n;i++ ) t[i]=a[i];
  15. sort(t+,t++n);
  16. nowm=unique(t+,t++n)-(t+);
  17. }
  18.  
  19. int hash_(int x)
  20. {
  21. return lower_bound(t+,t++nowm,x)-t;
  22. }
  23.  
  24. void build(int &root,int l,int r)
  25. {
  26. root=++tot;
  27. if ( l==r ) return;
  28. int mid=(l+r)/;
  29. build(lson[root],l,mid);
  30. build(rson[root],mid+,r);
  31. }
  32.  
  33. void update(int root,int &rt,int p,int val,int l,int r)
  34. {
  35. rt=++tot;
  36. lson[rt]=lson[root],rson[rt]=rson[root];
  37. c[rt]=c[root]+val;
  38. if ( l==r ) return;
  39. int mid=(l+r)/;
  40. if ( p<=mid ) update(lson[rt],lson[rt],p,val,l,mid);
  41. else update(rson[rt],rson[rt],p,val,mid+,r);
  42. }
  43.  
  44. int query(int rt_,int rt,int l,int r,int k)
  45. {
  46. if ( l==r ) return l;
  47. int mid=(l+r)/;
  48. int sum=c[lson[rt_]]-c[lson[rt]];
  49. if ( sum>=k ) return query(lson[rt_],lson[rt],l,mid,k);
  50. else return query(rson[rt_],rson[rt],mid+,r,k-sum);
  51. }
  52.  
  53. int main()
  54. {
  55. int Case;
  56. scanf("%d",&Case);
  57. while(Case++){
  58. scanf("%d%d",&n,&q);
  59. tot=;
  60. for ( int i=;i<=n;i++ ) scanf("%d",&a[i]);
  61. init_hash();
  62. build(T[],,nowm);
  63. for ( int i=;i<=n;i++ )
  64. {
  65. int pos=hash_(a[i]);
  66. update(T[i-],T[i],pos,,,nowm);
  67. }
  68. while ( q-- )
  69. {
  70. int l,r,k;
  71. scanf("%d%d%d",&l,&r,&k);
  72. printf("%d\n",t[query(T[r],T[l-],,nowm,k)]);
  73. }
  74. }
  75. return ;
  76. }

2.(HDOJ4417)http://acm.hdu.edu.cn/showproblem.php?pid=4417

题意:求给定区间<=k的数有多少

分析:在模板上将query部分修改一下即可,对于区间[L,R]来说,只需要将第R颗线段树上的[0,k]区间内的值减去第L-1颗线段树上对应区间即可。离线在线都行,离线做法需要将每次访问的k也添加进入hash数组,而对于在线来说转化后的数转化前相对于给定的k来说只能变小不能变大即可

注意:题目给的区间范围从0开始,要将其转化成从1开始

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. const int maxn=1e5+;
  7. const int maxm=3e6+;
  8. int n,q,m,tot;
  9. int a[maxn],t[maxn];
  10. int T[maxn],lson[maxm],rson[maxm],c[maxm];
  11.  
  12. void init_hash()
  13. {
  14. for ( int i=;i<=n;i++ ) t[i]=a[i];
  15. sort(t+,t++n);
  16. m=unique(t+,t++n)-(t+);
  17. }
  18.  
  19. int build(int l,int r)
  20. {
  21. int root=tot++;
  22. c[root]=;
  23. if ( l!=r )
  24. {
  25. int mid=(l+r)/;
  26. lson[root]=build(l,mid);
  27. rson[root]=build(mid+,r);
  28. }
  29. return root;
  30. }
  31.  
  32. int hash_(int x)
  33. {
  34. return lower_bound(t+,t++m,x)-t;
  35. }
  36.  
  37. int update(int root,int pos,int val)
  38. {
  39. int rt=tot++,tmp=rt;
  40. c[rt]=c[root]+val;
  41. int l=,r=m;
  42. while ( l<r )
  43. {
  44. int mid=(l+r)/;
  45. if ( pos<=mid )
  46. {
  47. lson[rt]=tot++;rson[rt]=rson[root];
  48. rt=lson[rt];root=lson[root];
  49. r=mid;
  50. }
  51. else
  52. {
  53. rson[rt]=tot++;lson[rt]=lson[root];
  54. rt=rson[rt];root=rson[root];
  55. l=mid+;
  56. }
  57. c[rt]=c[root]+val;
  58. }
  59. return tmp;
  60. }
  61.  
  62. int query(int lrt,int rrt,int k)
  63. {
  64. int ret=;
  65. int l=,r=m;
  66. while ( l<r )
  67. {
  68. int mid=(l+r)/;
  69. if ( k<=mid )
  70. {
  71. r=mid;
  72. lrt=lson[lrt];
  73. rrt=lson[rrt];
  74. }
  75. else
  76. {
  77. ret+=c[lson[rrt]]-c[lson[lrt]];
  78. l=mid+;
  79. lrt=rson[lrt];
  80. rrt=rson[rrt];
  81. }
  82. }
  83. ret+=c[rrt]-c[lrt];
  84. return ret;
  85. }
  86.  
  87. int main()
  88. {
  89. int Case,h;
  90. scanf("%d",&Case);
  91. for ( h=;h<=Case;h++ )
  92. {
  93. scanf("%d%d",&n,&q);
  94. tot=;
  95. for ( int i=;i<=n;i++ )
  96. {
  97. scanf("%d",&a[i]);
  98. a[i]++;
  99. }
  100. init_hash();
  101. T[]=build(,m);
  102. for ( int i=;i<=n;i++ )
  103. {
  104. int pos=hash_(a[i]);
  105. T[i]=update(T[i-],pos,);
  106. }
  107. printf("Case %d:\n",h);
  108. while ( q-- )
  109. {
  110. int l,r,k,p;
  111. scanf("%d%d%d",&l,&r,&k);
  112. l++,r++,k++;
  113. p=hash_(k);
  114. if ( t[p]>k ) p--;
  115. if ( p== ) printf("0\n");
  116. else printf("%d\n",query(T[l-],T[r],p));
  117. }
  118. }
  119. return ;
  120. }
  121.  
  122. HDOJ4417(在线)

在线

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. const int maxn=1e5+;
  7. const int maxm=3e6+;
  8. int n,q,m,tot;
  9. int a[maxn],t[maxn*],l[maxn],r[maxn],val[maxn];
  10. int T[maxn],lson[maxm],rson[maxm],c[maxm];
  11.  
  12. void init_hash()
  13. {
  14. for ( int i=;i<=n;i++ ) t[i]=a[i];
  15. for ( int i=;i<=q;i++ ) t[i+n]=val[i];
  16. sort(t+,t++n+q);
  17. m=unique(t+,t++n+q)-(t+);
  18. }
  19.  
  20. int build(int l,int r)
  21. {
  22. int root=tot++;
  23. c[root]=;
  24. if ( l!=r )
  25. {
  26. int mid=(l+r)/;
  27. lson[root]=build(l,mid);
  28. rson[root]=build(mid+,r);
  29. }
  30. return root;
  31. }
  32.  
  33. int hash_(int x)
  34. {
  35. return lower_bound(t+,t++m,x)-t;
  36. }
  37.  
  38. int update(int root,int pos,int val)
  39. {
  40. int rt=tot++,tmp=rt;
  41. c[rt]=c[root]+val;
  42. int l=,r=m;
  43. while ( l<r )
  44. {
  45. int mid=(l+r)/;
  46. if ( pos<=mid )
  47. {
  48. lson[rt]=tot++;rson[rt]=rson[root];
  49. rt=lson[rt];root=lson[root];
  50. r=mid;
  51. }
  52. else
  53. {
  54. rson[rt]=tot++;lson[rt]=lson[root];
  55. rt=rson[rt];root=rson[root];
  56. l=mid+;
  57. }
  58. c[rt]=c[root]+val;
  59. }
  60. return tmp;
  61. }
  62.  
  63. int query(int lrt,int rrt,int k)
  64. {
  65. int ret=;
  66. int l=,r=m;
  67. while ( l<r )
  68. {
  69. int mid=(l+r)/;
  70. if ( k<=mid )
  71. {
  72. r=mid;
  73. lrt=lson[lrt];
  74. rrt=lson[rrt];
  75. }
  76. else
  77. {
  78. ret+=c[lson[rrt]]-c[lson[lrt]];
  79. l=mid+;
  80. lrt=rson[lrt];
  81. rrt=rson[rrt];
  82. }
  83. }
  84. ret+=c[rrt]-c[lrt];
  85. return ret;
  86. }
  87.  
  88. int main()
  89. {
  90. int Case,h;
  91. scanf("%d",&Case);
  92. for ( h=;h<=Case;h++ )
  93. {
  94. scanf("%d%d",&n,&q);
  95. tot=;
  96. for ( int i=;i<=n;i++ )
  97. {
  98. scanf("%d",&a[i]);
  99. a[i]++;
  100. }
  101. for ( int i=;i<=q;i++ ) {
  102. scanf("%d%d%d",&l[i],&r[i],&val[i]);
  103. l[i]++,r[i]++,val[i]++;
  104. }
  105. init_hash();
  106. T[]=build(,m);
  107. for ( int i=;i<=n;i++ )
  108. {
  109. int pos=hash_(a[i]);
  110. T[i]=update(T[i-],pos,);
  111. }
  112. printf("Case %d:\n",h);
  113. for ( int i=;i<=q;i++ )
  114. {
  115. int L,R,k;
  116. L=l[i],R=r[i],k=val[i];
  117. k=hash_(k);
  118. printf("%d\n",query(T[L-],T[R],k));
  119. }
  120. }
  121. return ;
  122. }
  123.  
  124. HDOJ4417(离线)

离线

3.(SPOJ3267)http://www.spoj.com/problems/DQUERY/

题意:给出一个长度为n 的数列,有q 个询问,每个询问给出数对 [i,j],需要你给出这一段中有多少不同的数字

分析:利用map记录每个数的位置,主席树建新树的时候,如果当前元素出现过,那么把这个元素上次出现的位置减一,然后当前位置加一,如果没出现过就是普通的建树操作。

对于查询[l, r]我们只需要取出第r棵树,然后输出这棵树[l,r]之间的和,因为是按从1到n的顺序插入的,所以每次只需要求>=l的个数即可

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<map>
  6. using namespace std;
  7. const int maxn=3e4+;
  8. const int maxm=3e6+;
  9. int n,q,tot;
  10. int a[maxn];
  11. int T[maxn],lson[maxm],rson[maxm],c[maxm];
  12.  
  13. int build(int l,int r)
  14. {
  15. int root=tot++;
  16. c[root]=;
  17. if ( l!=r )
  18. {
  19. int mid=(l+r)/;
  20. lson[root]=build(l,mid);
  21. rson[root]=build(mid+,r);
  22. }
  23. return root;
  24. }
  25.  
  26. int update(int root,int pos,int val)
  27. {
  28. int rt=tot++,tmp=rt;
  29. c[rt]=c[root]+val;
  30. int l=,r=n;
  31. while ( l<r )
  32. {
  33. int mid=(l+r)/;
  34. if ( pos<=mid )
  35. {
  36. lson[rt]=tot++;rson[rt]=rson[root];
  37. rt=lson[rt];root=lson[root];
  38. r=mid;
  39. }
  40. else
  41. {
  42. rson[rt]=tot++;lson[rt]=lson[root];
  43. rt=rson[rt];root=rson[root];
  44. l=mid+;
  45. }
  46. c[rt]=c[root]+val;
  47. }
  48. return tmp;
  49. }
  50.  
  51. int query(int rt,int lpos)
  52. {
  53. int ret=;
  54. int l=,r=n;
  55. while ( lpos>l )
  56. {
  57. int mid=(l+r)/;
  58. if ( lpos<=mid )
  59. {
  60. r=mid;
  61. ret+=c[rson[rt]];
  62. rt=lson[rt];
  63. }
  64. else
  65. {
  66. rt=rson[rt];
  67. l=mid+;
  68. }
  69. }
  70. return ret+c[rt];
  71. }
  72.  
  73. int main()
  74. {
  75. int Case;
  76. while ( scanf("%d",&n)!=EOF )
  77. {
  78. tot=;
  79. for ( int i=;i<=n;i++ ) scanf("%d",&a[i]);
  80. T[]=build(,n);
  81. map<int,int>mp;
  82. for ( int i=;i<=n;i++ )
  83. {
  84. if ( mp.find(a[i])!=mp.end() )
  85. {
  86. int tmp=update(T[i-],mp[a[i]],-);
  87. T[i]=update(tmp,i,);
  88. }
  89. else T[i]=update(T[i-],i,);
  90. mp[a[i]]=i;
  91. }
  92. scanf("%d",&q);
  93. while ( q-- )
  94. {
  95. int l,r;
  96. scanf("%d%d",&l,&r);
  97. printf("%d\n",query(T[r],l));
  98. }
  99. }
  100. return ;
  101. }
  102.  
  103. SPOJ3267

4.(ZOJ2112)http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112

题意:给定一串序列,有两种操作,一种是求区间[l,r]第k大,另外一种是将a[i]=t

带修改的主席树

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. const int maxn=;
  7. const int maxm=;
  8. int n,q,m,tot;
  9. int a[maxn],t[maxn];
  10. int T[maxn],lson[maxm],rson[maxm],c[maxm];
  11. int S[maxn];
  12. struct Query{
  13. int kind;
  14. int l,r,k;
  15. }query[];
  16.  
  17. void init_hash(int k)
  18. {
  19. sort(t+,t+k+);
  20. m=unique(t+,t+k+)-(t+);
  21. }
  22.  
  23. int hash_(int x)
  24. {
  25. return lower_bound(t+,t+m+,x)-t;
  26. }
  27.  
  28. int build(int l,int r)
  29. {
  30. int root=tot++;
  31. c[root]=;
  32. if ( l!=r )
  33. {
  34. int mid=(l+r)/;
  35. lson[root]=build(l,mid);
  36. rson[root]=build(mid+,r);
  37. }
  38. return root;
  39. }
  40.  
  41. int update(int root,int pos,int val)
  42. {
  43. int rt=tot++,tmp=rt;
  44. c[rt]=c[root]+val;
  45. int l=,r=m;
  46. while ( l<r )
  47. {
  48. int mid=(l+r)/;
  49. if ( pos<=mid )
  50. {
  51. lson[rt]=tot++;rson[rt]=rson[root];
  52. rt=lson[rt];root=lson[root];
  53. r=mid;
  54. }
  55. else
  56. {
  57. rson[rt]=tot++;lson[rt]=lson[root];
  58. rt=rson[rt];root=rson[root];
  59. l=mid+;
  60. }
  61. c[rt]=c[root]+val;
  62. }
  63. return tmp;
  64. }
  65.  
  66. int lowbit(int x)
  67. {
  68. return x&(-x);
  69. }
  70.  
  71. int used[maxn];
  72. void add(int x,int pos,int val)
  73. {
  74. while ( x<=n )
  75. {
  76. S[x]=update(S[x],pos,val);
  77. x+=lowbit(x);
  78. }
  79. }
  80.  
  81. int sum(int x)
  82. {
  83. int ret=;
  84. while ( x> )
  85. {
  86. ret+=c[lson[used[x]]];
  87. x-=lowbit(x);
  88. }
  89. return ret;
  90. }
  91.  
  92. int Q(int left,int right,int k)
  93. {
  94. int lrt=T[left];
  95. int rrt=T[right];
  96. int l=,r=m;
  97. for ( int i=left;i>;i-=lowbit(i)) used[i]=S[i];
  98. for ( int i=right;i>;i-=lowbit(i)) used[i]=S[i];
  99. while ( l<r )
  100. {
  101. int mid=(l+r)/;
  102. int tmp=sum(right)-sum(left)+c[lson[rrt]]-c[lson[lrt]];
  103. if ( tmp>=k )
  104. {
  105. r=mid;
  106. for ( int i=left;i>;i-=lowbit(i)) used[i]=lson[used[i]];
  107. for ( int i=right;i>;i-=lowbit(i)) used[i]=lson[used[i]];
  108. lrt=lson[lrt];
  109. rrt=lson[rrt];
  110. }
  111. else
  112. {
  113. l=mid+;
  114. k-=tmp;
  115. for ( int i=left;i>;i-=lowbit(i)) used[i]=rson[used[i]];
  116. for ( int i=right;i>;i-=lowbit(i)) used[i]=rson[used[i]];
  117. lrt=rson[lrt];
  118. rrt=rson[rrt];
  119. }
  120. }
  121. return l;
  122. }
  123.  
  124. int main()
  125. {
  126. int Case;
  127. scanf("%d",&Case);
  128. while ( Case-- )
  129. {
  130. scanf("%d%d",&n,&q);
  131. tot=;
  132. m=;
  133. for ( int i=;i<=n;i++ )
  134. {
  135. scanf("%d",&a[i]);
  136. t[++m]=a[i];
  137. }
  138. char op[];
  139. for ( int i=;i<q;i++ )
  140. {
  141. scanf("%s",op);
  142. if ( op[]=='Q' )
  143. {
  144. query[i].kind=;
  145. scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].k);
  146. }
  147. else
  148. {
  149. query[i].kind=;
  150. scanf("%d%d",&query[i].l,&query[i].r);
  151. t[++m]=query[i].r;
  152. }
  153. }
  154. init_hash(m);
  155. T[]=build(,m);
  156. for ( int i=;i<=n;i++ )
  157. {
  158. int pos=hash_(a[i]);
  159. T[i]=update(T[i-],pos,);
  160. }
  161. for ( int i=;i<=n;i++ ) S[i]=T[];
  162. for ( int i=;i<q;i++ )
  163. {
  164. if ( query[i].kind== ) printf("%d\n",t[Q(query[i].l-,query[i].r,query[i].k)]);
  165. else
  166. {
  167. add(query[i].l,hash_(a[query[i].l]),-);
  168. add(query[i].l,hash_(query[i].r),);
  169. a[query[i].l]=query[i].r;
  170. }
  171. }
  172. }
  173. return ;
  174. }
  175.  
  176. ZOJ2112

5.(HDOJ4348)http://acm.hdu.edu.cn/showproblem.php?pid=4348

题意:给出一段长度为n的序列,有4种操作。初始时,时间戳=0

a.C l r d [l,r]区间内的数+d,时间戳++

b.Q l r 求当前时间戳下[l,r]区间的和

c.H l r t 求时间戳=t下[l,r]区间的和

d.B t  时间戳=t

分析:推荐两个讲解较为详细的博客https://blog.csdn.net/glqac/article/details/45103859

https://blog.csdn.net/kirito16/article/details/47266801

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. typedef long long ll;
  7. const int maxn=1e5+;
  8. const int maxm=3e6+;
  9. int n,q,tot;
  10. int a[maxn];
  11. int T[maxn],lson[maxm],rson[maxm];
  12. ll sum[maxm],add[maxm];
  13.  
  14. int build(int l,int r)
  15. {
  16. int root=tot++;
  17. add[root]=;
  18. if ( l!=r )
  19. {
  20. int mid=(l+r)/;
  21. lson[root]=build(l,mid);
  22. rson[root]=build(mid+,r);
  23. }
  24. else
  25. {
  26. scanf("%lld",&sum[root]);
  27. return root;
  28. }
  29. sum[root]=sum[lson[root]]+sum[rson[root]];
  30. return root;
  31. }
  32.  
  33. void pushup(int rt,int len)
  34. {
  35. sum[rt]=sum[lson[rt]]+sum[rson[rt]]+add[lson[rt]]*(len-len/)+add[rson[rt]]*(len/);
  36. }
  37.  
  38. int A,B;
  39. ll val;
  40.  
  41. int update(int root,int l,int r)
  42. {
  43. int rt=tot++;
  44. add[rt]=add[root];
  45. if ( A<=l && r<=B )
  46. {
  47. sum[rt]=sum[root];
  48. add[rt]=add[root]+val;
  49. lson[rt]=lson[root];
  50. rson[rt]=rson[root];
  51. return rt;
  52. }
  53. int mid=(l+r)/;
  54. if ( A<=mid ) lson[rt]=update(lson[root],l,mid);
  55. else lson[rt]=lson[root];
  56. if ( B>mid ) rson[rt]=update(rson[root],mid+,r);
  57. else rson[rt]=rson[root];
  58. pushup(rt,r-l+);
  59. return rt;
  60. }
  61.  
  62. ll query(int root,int l,int r,ll add_)
  63. {
  64. if ( A<=l && r<=B ) return sum[root]+(add_+add[root])*(r-l+);
  65. ll ans=;
  66. int mid=(l+r)/;
  67. if ( A<=mid ) ans+=query(lson[root],l,mid,add[root]+add_);
  68. if ( B>mid ) ans+=query(rson[root],mid+,r,add[root]+add_);
  69. return ans;
  70. }
  71.  
  72. int main()
  73. {
  74. char op[];
  75. int now,Case=;
  76. while ( scanf("%d%d",&n,&q)!=EOF )
  77. {
  78. if ( Case!= ) printf("\n");
  79. Case++;
  80. tot=;
  81. T[]=build(,n);
  82. now=;
  83. while ( q-- )
  84. {
  85. ll ans;
  86. int k;
  87. scanf("%s",op);
  88. if ( op[]=='C' )
  89. {
  90. scanf("%d%d%lld",&A,&B,&val);
  91. T[now+]=update(T[now],,n);
  92. now++;
  93. }
  94. else if ( op[]=='Q' )
  95. {
  96. scanf("%d%d",&A,&B);
  97. ans=query(T[now],,n,);
  98. printf("%lld\n",ans);
  99. }
  100. else if ( op[]=='H' )
  101. {
  102. scanf("%d%d%d",&A,&B,&k);
  103. ans=query(T[k],,n,);
  104. printf("%lld\n",ans);
  105. }
  106. else if ( op[]=='B' )
  107. {
  108. scanf("%d",&k);
  109. now=k;
  110. tot=T[now+];
  111. }
  112. }
  113. }
  114. return ;
  115. }
  116.  
  117. HDOJ4348

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)的更多相关文章

  1. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

  2. SPOJ_10628_Count_on_a_Tree_(主席树+Tarjan)

    描述 http://www.spoj.com/problems/COT/ 给出一棵n个节点的树,树上每一个节点有权值.m次询问,求书上u,v路径中第k小的权值. COT - Count on a tr ...

  3. 【洛谷 P3168】 [CQOI2015]任务查询系统(主席树)

    题目链接 被自己的sb错误调到自闭.. 主席树的进阶应用. 把\(P_i\)离散化一下,得到每个\(P_i\)的排名,然后建一棵维护\(m\)个位置的主席树,每个结点记录区间总和和正在进行的任务数. ...

  4. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  5. 【STSRM12】夏令营(分治决策单调+主席树)

    [题意]n个数字分成k段,每一段的价值是段内不同数字的个数,求最大价值.n<=35000,k<=50. [算法]分治决策单调+主席树(可持久化线段树) [题解] f[i][j]表示前i天分 ...

  6. 【bzoj4408】[Fjoi 2016]神秘数 主席树

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 = 4+1+1 ...

  7. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  8. 【BZOJ2588】Count on a tree 题解(主席树+LCA)

    前言:其实就是主席树板子啦……只不过变成了树上的查询 -------------------------- 题目链接 题目大意:求树上$u$到$v$路径第$k$大数. 查询静态区间第$k$大肯定是用主 ...

  9. 220722 T4 求和 /P4587 [FJOI2016]神秘数 (主席树)

    好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于 ...

随机推荐

  1. 虚拟机VMware的安装以及指南

    VMware是一个非常强大的虚拟软件,它的更新速度非常的快,随着软件的更新速度的加快,它的大小会越来越大,但是新的版本大多数会是给企业使用的,对于我们而言,不那么的需要,所以,我们只需要使用一些差不多 ...

  2. php5.6,curl上传的变化

    $ch = curl_init ();curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false); //php5.6要加上这个 $fields = array(); ...

  3. javascript作用域原理

    问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...

  4. 数据库开源框架ormlite

    今天听说了ORM框架ORMLITE,特地去了解了一下. 该框架可以使用注解方式来生成数据库表,还封装了常用的数据库操作. 类似J2EE的HIBERNATE框架对数据库的处理. 省去了书写建表语句的麻烦 ...

  5. cocos2d-x坐标系详解

    cocos2d-x官方文档 笛卡尔坐标系 不同坐标系简介 笛卡尔坐标系 你可能上学的时候就已经知道“笛卡尔坐标系”了,它在几何课本里经常用到.如果你已经忘得差不多了,下面这些图片可以很快唤起你的记忆: ...

  6. Java C++ Socket通讯

    import java.net.*; import javax.swing.plaf.SliderUI; /** * 与c语言通信(java做client,c/c++做server,传送一个结构) * ...

  7. CF 671D Roads in Yusland

    弄完之后点进去一看,竟然是div1的D题……最近真是天天被题虐哭 推荐这一篇博客 https://www.cnblogs.com/Sakits/p/8085598.html 感觉讲清楚了,也是基本照着 ...

  8. Luogu 4323 [JSOI2016]独特的树叶

    新技能get 树哈希,考虑到两棵树相同的条件,把每一个结点的哈希值和树的siz写进哈希值里去. 做出A树每一个结点为根时的树的哈希值丢进set中,然后暴力枚举B树中度数为1的点,求出删掉这个点之后的哈 ...

  9. Node.js 介绍及学习

    Node.js => 简单来理解,就是指运行在服务器端的JavaScript.  Node.js 是一个基于Chrome JavaScript运行时建立的一个平台 Node.js是一个事件驱动I ...

  10. ISE 14.7 XST.exe stop working

    http://www.xilinx.com/support/answers/59851.html Description XST completes but then instead of retur ...