Day2:线段树(可持久化),平衡树(splay,treap),并查集,树链剖分,动态树,树状数组,点分治(可持久)。

  • 线段树模板

  1. //区间最大,and,or
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. inline void read(int &x){
  7. x=0;static char ch;static bool flag;flag = false;
  8. while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
  9. while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
  10. }
  11. #define rg register int
  12. #define rep(i,a,b) for(rg i=(a);i<=(b);++i)
  13. #define per(i,a,b) for(rg i=(a);i>=(b);++i)
  14. const int maxn = 100010;
  15. const int bas = 0x7fffffff;
  16. int T[maxn<<2],lazy[maxn<<2],sam[maxn<<2];
  17. int a[maxn];
  18. inline void update(int rt){
  19. T[rt] = max(T[rt<<1],T[rt<<1|1]);
  20. sam[rt] = (sam[rt<<1]&sam[rt<<1|1]) & (~(T[rt<<1]^T[rt<<1|1]));
  21. }
  22. inline void pushdown(int rt){
  23. if(lazy[rt] == 0) return ;
  24. T[rt<<1] += lazy[rt];lazy[rt<<1] += lazy[rt];
  25. T[rt<<1|1] += lazy[rt];lazy[rt<<1|1] += lazy[rt];
  26. lazy[rt] = 0;
  27. }
  28. void build(int rt,int l,int r){
  29. if(l == r){
  30. T[rt] = a[l];
  31. sam[rt] = bas;
  32. return ;
  33. }int mid = l+r >> 1;
  34. build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
  35. update(rt);
  36. }
  37. int L,R,val,tmp;
  38. inline bool check_a(int rt){
  39. tmp = (val^bas);
  40. return (tmp & sam[rt]) == tmp;
  41. }
  42. void modify_a(int rt,int l,int r){
  43. if(L <= l && r <= R && check_a(rt)){
  44. tmp = (T[rt] & val) - T[rt];
  45. lazy[rt] += tmp;T[rt] += tmp;
  46. return ;
  47. }int mid = l+r >> 1;pushdown(rt);
  48. if(L <= mid) modify_a(rt<<1,l,mid);
  49. if(R > mid) modify_a(rt<<1|1,mid+1,r);
  50. update(rt);
  51. }
  52. void modify_o(int rt,int l,int r){
  53. if(L <= l && r <= R && (sam[rt] & val) == val){
  54. tmp = (T[rt] | val) - T[rt];
  55. lazy[rt] += tmp;T[rt] += tmp;
  56. return ;
  57. }int mid = l+r >> 1;pushdown(rt);
  58. if(L <= mid) modify_o(rt<<1,l,mid);
  59. if(R > mid) modify_o(rt<<1|1,mid+1,r);
  60. update(rt);
  61. }
  62. int query(int rt,int l,int r){
  63. if(L <= l && r <= R) return T[rt];
  64. int mid = l+r >> 1;pushdown(rt);
  65. if(R <= mid) return query(rt<<1,l,mid);
  66. if(L > mid) return query(rt<<1|1,mid+1,r);
  67. return max(query(rt<<1,l,mid),query(rt<<1|1,mid+1,r));
  68. }
  69. int main(){
  70. //freopen("series_wei.in","r",stdin);
  71. //freopen("series_wei.out","w",stdout);
  72. int n,m;read(n);read(m);
  73. rep(i,1,n) read(a[i]);
  74. build(1,1,n);int opt;
  75. int cnt = 0 ;
  76. while(m--){
  77. read(opt);read(L);read(R);
  78. if(opt == 1) read(val),modify_a(1,1,n);
  79. else if(opt == 2) read(val),modify_o(1,1,n);
  80. else printf("%d\n",query(1,1,n));
  81. }
  82. return 0;
  83. }
  1. //poj 3225 线段树成段替换与异或
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cctype>
  5. #include <algorithm>
  6. using namespace std;
  7. #define lson l , m , rt << 1
  8. #define rson m + 1 , r , rt << 1 | 1
  9. const int maxn = 131072;
  10. bool hash[maxn];
  11. int cover[maxn<<2];
  12. int XOR[maxn<<2];
  13. void FXOR(int rt) {
  14. if (cover[rt] != -1) cover[rt] ^= 1;
  15. else XOR[rt] ^= 1;
  16. }
  17. void PushDown(int rt) {
  18. if (cover[rt] != -1) {
  19. cover[rt<<1] = cover[rt<<1|1] = cover[rt];
  20. XOR[rt<<1] = XOR[rt<<1|1] = 0;
  21. cover[rt] = -1;
  22. }
  23. if (XOR[rt]) {
  24. FXOR(rt<<1);
  25. FXOR(rt<<1|1);
  26. XOR[rt] = 0;
  27. }
  28. }
  29. void update(char op,int L,int R,int l,int r,int rt) {
  30. if (L <= l && r <= R) {
  31. if (op == 'U') {
  32. cover[rt] = 1;
  33. XOR[rt] = 0;
  34. } else if (op == 'D') {
  35. cover[rt] = 0;
  36. XOR[rt] = 0;
  37. } else if (op == 'C' || op == 'S') {
  38. FXOR(rt);
  39. }
  40. return ;
  41. }
  42. PushDown(rt);
  43. int m = (l + r) >> 1;
  44. if (L <= m) update(op , L , R , lson);
  45. else if (op == 'I' || op == 'C') {
  46. XOR[rt<<1] = cover[rt<<1] = 0;
  47. }
  48. if (m < R) update(op , L , R , rson);
  49. else if (op == 'I' || op == 'C') {
  50. XOR[rt<<1|1] = cover[rt<<1|1] = 0;
  51. }
  52. }
  53. void query(int l,int r,int rt) {
  54. if (cover[rt] == 1) {
  55. for (int it = l ; it <= r ; it ++) {
  56. hash[it] = true;
  57. }
  58. return ;
  59. } else if (cover[rt] == 0) return ;
  60. if (l == r) return ;
  61. PushDown(rt);
  62. int m = (l + r) >> 1;
  63. query(lson);
  64. query(rson);
  65. }
  66. int main() {
  67. cover[1] = XOR[1] = 0;
  68. char op , l , r;
  69. int a , b;
  70. while ( ~scanf("%c %c%d,%d%c\n",&op , &l , &a , &b , &r) ) {
  71. a <<= 1 , b <<= 1;
  72. if (l == '(') a ++;
  73. if (r == ')') b --;
  74. if (a > b) {
  75. if (op == 'C' || op == 'I') {
  76. cover[1] = XOR[1] = 0;
  77. }
  78. } else update(op , a , b , 0 , maxn , 1);
  79. }
  80. query(0 , maxn , 1);
  81. bool flag = false;
  82. int s = -1 , e;
  83. for (int i = 0 ; i <= maxn ; i ++) {
  84. if (hash[i]) {
  85. if (s == -1) s = i;
  86. e = i;
  87. } else {
  88. if (s != -1) {
  89. if (flag) printf(" ");
  90. flag = true;
  91. printf("%c%d,%d%c",s&1?'(':'[' , s>>1 , (e+1)>>1 , e&1?')':']');
  92. s = -1;
  93. }
  94. }
  95. }
  96. if (!flag) printf("empty set");
  97. puts("");
  98. return 0;
  99. }
  1. //树状数组扫描线
  2. #include<vector>
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. const int Maxn=4005;
  8. const int Maxp=1e5+5;
  9. struct node{
  10. int up,low,v;
  11. };
  12. struct node2{
  13. int p,id;
  14. };
  15. int n,m,p,q;
  16. int ans[Maxp],tr[4*Maxn];
  17. vector<node> lne[Maxn];
  18. vector<node2> ask[Maxn];
  19. inline int lowbit(int x){
  20. return x&(-x);
  21. }
  22. inline void read(int &x){
  23. x=0; int f=1; char ch;
  24. do{ch=getchar(); if(ch=='-') f=-1;}while(ch<'0'||ch>'9');
  25. do{x=x*10+ch-'0'; ch=getchar();} while(ch>='0'&&ch<='9');
  26. x*=f;
  27. }
  28. void add(int x,int v){
  29. for(int i=x;i<=n;i+=lowbit(i))
  30. tr[i]+=v;
  31. }
  32. int srch(int x){
  33. int sum=0;
  34. for(int i=x;i;i-=lowbit(i))
  35. sum+=tr[i];
  36. return sum;
  37. }
  38. int main(){
  39. read(n),read(m),read(p),read(q);
  40. for(int i=1;i<=p;i++){
  41. int a,b,c,d;
  42. read(a),read(b),read(c),read(d);
  43. node stp;
  44. stp.up=a,stp.low=c,stp.v=1;
  45. lne[b].push_back(stp);
  46. stp.v=-1;
  47. lne[d+1].push_back(stp);
  48. }
  49. for(int i=1;i<=q;i++){
  50. int a,b; node2 stp;
  51. read(a),read(b);
  52. stp.p=a,stp.id=i;
  53. ask[b].push_back(stp);
  54. }
  55. for(int i=1;i<=m;i++){
  56. int len=lne[i].size();
  57. for(int j=0;j<len;j++)
  58. add(lne[i][j].up , lne[i][j].v),
  59. add(lne[i][j].low+1,-lne[i][j].v);
  60. len=ask[i].size();
  61. for(int j=0;j<len;j++)
  62. ans[ask[i][j].id]=srch(ask[i][j].p);
  63. }
  64. for(int i=1;i<=q;i++)
  65. printf("%d\n",ans[i]);
  66. return 0;
  67. }
  1. //可持久线段树k小
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. const int maxn = 3000010;
  5. struct node{
  6. int l;
  7. int r;
  8. int sum;
  9. }t[maxn<<2];
  10. struct Node{
  11. int p;
  12. int id;
  13. }Nod[maxn<<2];
  14. int n;
  15. int rt[maxn];
  16. int a[maxn];
  17. int v[maxn];
  18. int m;
  19. int cnt;
  20. inline bool cmp(const Node &x,const Node &y) {
  21. return x.p < y.p;
  22. }
  23. inline void build(int l,int r,int &p,int pos) {
  24. ++cnt;
  25. t[cnt] = t[p];
  26. p = cnt;
  27. ++t[p].sum;
  28. if(l == r) return;
  29. int mid = (l + r) >> 1;
  30. if(pos <= mid) {
  31. build(l,mid,t[p].l,pos);
  32. }
  33. else {
  34. build(mid+1,r,t[p].r,pos);
  35. }
  36. return;
  37. }
  38. inline int query(int l,int r,int L,int R,int k) {
  39. if(l == r) return l;
  40. int c = t[t[R].l].sum - t[t[L].l].sum;
  41. int mid = (l + r) >> 1;
  42. if(c >= k) {
  43. return query(l,mid,t[L].l,t[R].l,k);
  44. }
  45. else {
  46. return query(mid +1 ,r,t[L].r,t[R].r,k - c);
  47. }
  48. }
  49. int l,r,k;
  50. int main (){
  51. cin >> n >> m;
  52. for(int i = 1;i <= n; ++i) {
  53. cin >> Nod[i].p;
  54. Nod[i].id = i;
  55. }
  56. sort(Nod+1,Nod+n+1,cmp);
  57. for(int i = 1;i <= n; ++i) {
  58. a[Nod[i].id] = i;
  59. v[i] = Nod[i].p;
  60. }
  61. for(int i = 1;i <= m; ++i) {
  62. rt[i] = rt[i - 1];
  63. build(1,n,rt[i],a[i]);
  64. }
  65. while(m--) {
  66. cin >> l >> r >> k;
  67. cout<<v[query(1,n,rt[l-1],rt[r],k)]<<endl;
  68. }
  69. return 0;
  70. }
  1. //可持久线段树历史区间最大,历史单点修改
  2. #include<cstdio>
  3. const int maxn=1e4+10;
  4. const int maxq=1e5+10;
  5. int n,q,ts,ks;
  6. int a,b,c,d;
  7. int tt[maxq];
  8. struct tree{int s,l,r,mid,lp,rp;}t[maxq<<4];
  9. inline int min_(int x,int y){return x<y?x:y;}
  10. inline int max_(int x,int y){return x>y?x:y;}
  11. void build(int l,int r,int k){
  12. t[k].l=l,t[k].r=r;
  13. if(l==r){scanf("%d",&t[k].s);return;}
  14. t[k].mid=l+r>>1,t[k].lp=++ts,t[k].rp=++ts;
  15. build(l,t[k].mid,t[k].lp);
  16. build(t[k].mid+1,r,t[k].rp);
  17. t[k].s=max_(t[t[k].lp].s,t[t[k].rp].s);
  18. }
  19. void change(int k,int nk){
  20. t[nk].l=t[k].l,t[nk].r=t[k].r;
  21. if(t[k].l==t[k].r){t[nk].s=d;return;}
  22. t[nk].mid=t[k].mid;
  23. if(c<=t[k].mid){
  24. t[nk].lp=++ts,t[nk].rp=t[k].rp;
  25. change(t[k].lp,t[nk].lp);
  26. }
  27. else{
  28. t[nk].rp=++ts,t[nk].lp=t[k].lp;
  29. change(t[k].rp,t[nk].rp);
  30. }
  31. t[nk].s=max_(t[t[nk].lp].s,t[t[nk].rp].s);
  32. }
  33. int search(int k,int l,int r){
  34. if(t[k].l==l&&t[k].r==r) return t[k].s;
  35. int ans=0;
  36. if(l<=t[k].mid) ans=search(t[k].lp,l,min_(r,t[k].mid));
  37. if(r>t[k].mid) ans=max_(ans,search(t[k].rp,max_(l,t[k].mid+1),r));
  38. return ans;
  39. }
  40. int main(){
  41. scanf("%d%d",&n,&q);
  42. build(1,n,tt[++ks]);
  43. while(q--){
  44. scanf("%d%d%d%d",&a,&b,&c,&d);
  45. if(a){
  46. tt[++ks]=++ts;
  47. change(tt[b],tt[ks]);
  48. }
  49. else printf("%d\n",search(tt[b],c,d));
  50. }
  51. return 0;
  52. }
  1. //线段树扫描线
  2. // luogu-judger-enable-o2
  3. #include<vector>
  4. #include<cstdio>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define getchar() getchar()_locked
  8. #define getchar() (S==T&&(T=(S=BB)+fread(BB,1,1<<15,stdin),S==T)?EOF:*S++)
  9. char BB[1<<15];
  10. char *S=BB;
  11. char *T=BB;
  12. using namespace std;
  13. const int Maxn=4005;
  14. const int Maxp=1e5+5;
  15. struct node{
  16. int up,low,v;
  17. };
  18. struct node2{
  19. int p,id;
  20. };
  21. struct node3{
  22. int l,r,sum,lazy;
  23. }tr[4*Maxn];
  24. int ans[Maxp];
  25. vector<node> lne[Maxn];
  26. vector<node2> ask[Maxn];
  27. inline void read(int &x){
  28. x=0; int f=1; char ch;
  29. do{ch=getchar(); if(ch=='-') f=-1;}while(ch<'0'||ch>'9');
  30. do{x=x*10+ch-'0'; ch=getchar();} while(ch>='0'&&ch<='9');
  31. x*=f;
  32. }
  33. void build(int p,int x,int y){
  34. tr[p].l=x,tr[p].r=y,tr[p].sum=0,tr[p].lazy=0;
  35. if(x==y) return ;
  36. int mid=(x+y)/2;
  37. build(p*2,x,mid),build(p*2+1,mid+1,y);
  38. }
  39. void push_down(int p){
  40. if(!tr[p].lazy) return ;
  41. tr[p * 2].sum+=(tr[p * 2].r-tr[p * 2].l+1)*tr[p].lazy;
  42. tr[p*2+1].sum+=(tr[p*2+1].r-tr[p*2+1].l+1)*tr[p].lazy;
  43. tr[p * 2].lazy+=tr[p].lazy;
  44. tr[p*2+1].lazy+=tr[p].lazy;
  45. tr[p].lazy=0;
  46. }
  47. void add(int p,int x,int y,int v){
  48. int nl=tr[p].l,nr=tr[p].r;
  49. if(nl==nr){
  50. tr[p].sum+=(nr-nl+1)*v;
  51. tr[p].lazy+=v;
  52. return ;
  53. }
  54. push_down(p);
  55. int mid=(nl+nr)/2;
  56. if(y<=mid) add(p*2,x,y,v);
  57. else if(x>mid) add(p*2+1,x,y,v);
  58. else add(p*2,x,mid,v),add(p*2+1,mid+1,y,v);
  59. tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
  60. return ;
  61. }
  62. int srch(int p,int x){
  63. int nl=tr[p].l,nr=tr[p].r;
  64. if(nl==nr)
  65. return tr[p].sum;
  66. push_down(p);
  67. int mid=(nl+nr)/2;
  68. if(x<=mid) return srch(p*2,x);
  69. else return srch(p*2+1,x);
  70. }
  71. int main(){
  72. int n,m,p,q;
  73. read(n),read(m),read(p),read(q);
  74. build(1,1,n);
  75. for(int i=1;i<=p;i++){
  76. int a,b,c,d;
  77. read(a),read(b),read(c),read(d);
  78. node stp;
  79. stp.up=a,stp.low=c,stp.v=1;
  80. lne[b].push_back(stp);
  81. stp.v=-1;
  82. lne[d+1].push_back(stp);
  83. }
  84. for(int i=1;i<=q;i++){
  85. int a,b; node2 stp;
  86. read(a),read(b);
  87. stp.p=a,stp.id=i;
  88. ask[b].push_back(stp);
  89. }
  90. for(int i=1;i<=m;i++){
  91. int len=lne[i].size();
  92. for(int j=0;j<len;j++)
  93. add(1,lne[i][j].up,lne[i][j].low,lne[i][j].v);
  94. len=ask[i].size();
  95. for(int j=0;j<len;j++)
  96. ans[ask[i][j].id]=srch(1,ask[i][j].p);
  97. }
  98. for(int i=1;i<=q;i++)
  99. printf("%d\n",ans[i]);
  100. return 0;
  101. }
  1. //待修改k小
  2. // luogu-judger-enable-o2
  3. //bzoj 3065
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. #define MAXN 700005
  7. #define MAXV 700005
  8. #define MAXP 20009999
  9. #define ALPHA 0.68
  10. template <typename T> void read(T &x) {
  11. x = 0; int f = 1;
  12. char c = getchar();
  13. for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
  14. for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  15. x *= f;
  16. }
  17. void getopt(char &c) {
  18. c = getchar();
  19. while (c != 'Q' && c != 'I' && c != 'M')
  20. c = getchar();
  21. }
  22. struct Segment_Tree {
  23. int now, root[MAXN];
  24. int top, mem[MAXP];
  25. int lc[MAXP], rc[MAXP], sum[MAXP];
  26. void init(int n) {
  27. for (int i = 1; i <= n; i++)
  28. mem[i] = n - i + 1;
  29. top = n;
  30. }
  31. int new_node() {
  32. int tmp = mem[top--];
  33. lc[tmp] = rc[tmp] = 0;
  34. sum[tmp] = 0;
  35. return tmp;
  36. }
  37. void recycle(int x) {
  38. mem[++top] = x;
  39. }
  40. void dfs(int x) {
  41. if (lc[x]) dfs(lc[x]);
  42. if (rc[x]) dfs(rc[x]);
  43. recycle(x);
  44. }
  45. void clear(int x) {
  46. if (root[x]) dfs(root[x]);
  47. root[x] = 0;
  48. }
  49. void modify(int &root, int l, int r, int pos, int delta) {
  50. if (root == 0) root = new_node();
  51. sum[root] += delta;
  52. if (l == r) return;
  53. int mid = (l + r) / 2;
  54. if (mid >= pos) modify(lc[root], l, mid, pos, delta);
  55. else modify(rc[root], mid + 1, r, pos, delta);
  56. }
  57. void modify(int x, int v, int d) {
  58. modify(root[x], 0, MAXV, v, d);
  59. }
  60. int query(int k, int len, int *type, int *home) {
  61. int l = 0, r = MAXV;
  62. for (int i = 1; i <= len; i++)
  63. home[i] = root[home[i]];
  64. while (l < r) {
  65. int mid = (l + r) / 2;
  66. int tsum = 0;
  67. for (int i = 1; i <= len; i++)
  68. tsum += type[i] * sum[lc[home[i]]];
  69. if (tsum >= k) {
  70. r = mid;
  71. for (int i = 1; i <= len; i++)
  72. home[i] = lc[home[i]];
  73. } else {
  74. l = mid + 1;
  75. k -= tsum;
  76. for (int i = 1; i <= len; i++)
  77. home[i] = rc[home[i]];
  78. }
  79. }
  80. return l;
  81. }
  82. } SMT;
  83. struct Scapegoat_Tree {
  84. int root, reroot;
  85. int len, tindex[MAXN];
  86. int type[MAXN], home[MAXN];
  87. int top, mem[MAXN];
  88. int lc[MAXN], rc[MAXN];
  89. int index[MAXN], size[MAXN];
  90. void init(int n) {
  91. for (int i = 1; i <= n; i++)
  92. mem[i] = n - i + 1;
  93. top = n;
  94. }
  95. int new_node() {
  96. int tmp = mem[top--];
  97. lc[tmp] = rc[tmp] = 0;
  98. index[tmp] = 0;
  99. size[tmp] = 0;
  100. SMT.clear(tmp);
  101. return tmp;
  102. }
  103. void recycle(int x) {
  104. mem[++top] = x;
  105. }
  106. void update(int x) {
  107. size[x] = 1;
  108. size[x] += size[lc[x]];
  109. size[x] += size[rc[x]];
  110. }
  111. void dfs(int root) {
  112. if (root != reroot) recycle(root);
  113. if (lc[root]) dfs(lc[root]);
  114. tindex[++len] = index[root];
  115. if (rc[root]) dfs(rc[root]);
  116. }
  117. void rebuild(int root, int l, int r) {
  118. for (int i = l; i <= r; i++)
  119. SMT.modify(root, tindex[i], 1);
  120. int mid = (l + r) / 2;
  121. index[root] = tindex[mid];
  122. if (mid > l) {
  123. lc[root] = new_node();
  124. rebuild(lc[root], l, mid - 1);
  125. }
  126. if (mid < r) {
  127. rc[root] = new_node();
  128. rebuild(rc[root], mid + 1, r);
  129. }
  130. update(root);
  131. }
  132. void rebuild(int root) {
  133. len = 0;
  134. dfs(root);
  135. lc[root] = rc[root] = 0;
  136. index[root] = size[root] = 0;
  137. SMT.clear(root);
  138. rebuild(root, 1, len);
  139. }
  140. void index_init(int n, int *a) {
  141. for (int i = 1; i <= n; i++)
  142. tindex[i] = a[i];
  143. root = new_node();
  144. rebuild(root, 1, n);
  145. }
  146. bool unbalance(int root) {
  147. return max(size[lc[root]], size[rc[root]]) > size[root] * ALPHA + 1;
  148. }
  149. void insert(int &root, int pos, int value) {
  150. if (root == 0) {
  151. root = new_node();
  152. index[root] = value;
  153. size[root] = 1;
  154. SMT.modify(root, value, 1);
  155. return;
  156. }
  157. SMT.modify(root, value, 1); size[root]++;
  158. if (pos <= size[lc[root]] + 1) insert(lc[root], pos, value);
  159. else insert(rc[root], pos - size[lc[root]] - 1, value);
  160. if (unbalance(root)) reroot = root;
  161. }
  162. void insert(int pos, int value) {
  163. reroot = 0;
  164. insert(root, pos, value);
  165. if (reroot) rebuild(reroot);
  166. }
  167. int modify(int root, int pos, int value) { /*Return Value: Old Index*/
  168. SMT.modify(root, value, 1);
  169. if (pos <= size[lc[root]]) {
  170. int tmp = modify(lc[root], pos, value);
  171. SMT.modify(root, tmp, -1);
  172. return tmp;
  173. } else {
  174. pos -= size[lc[root]];
  175. if (pos == 1) {
  176. int tmp = index[root];
  177. index[root] = value;
  178. SMT.modify(root, tmp, -1);
  179. return tmp;
  180. }
  181. int tmp = modify(rc[root], pos - 1, value);
  182. SMT.modify(root, tmp, -1);
  183. return tmp;
  184. }
  185. }
  186. void modify(int pos, int value) {
  187. modify(root, pos, value);
  188. }
  189. void getquery(int root, int l, int r, int t) {
  190. int mid = size[lc[root]] + 1;
  191. if (mid > r) getquery(lc[root], l, r, t);
  192. else if (mid < l) getquery(rc[root], l - mid, r - mid, t);
  193. else {
  194. len++; home[len] = root; type[len] = t;
  195. if (l != 1) getquery(lc[root], 1, l - 1, -t);
  196. if (r != size[root]) getquery(rc[root], r - size[lc[root]], size[root] - size[lc[root]] - 1, -t);
  197. }
  198. }
  199. int query(int l, int r, int k) {
  200. len = 0;
  201. getquery(root, l, r, 1);
  202. return SMT.query(k, len, type, home);
  203. }
  204. } SGT;
  205. int num[MAXN];
  206. int main() {
  207. SMT.init(MAXP - 1);
  208. SGT.init(MAXN - 1);
  209. int lastans = 0;
  210. int n; read(n);
  211. for (int i = 1; i <= n; i++)
  212. read(num[i]);
  213. SGT.index_init(n, num);
  214. int m; read(m);
  215. for (int i = 1; i <= m; i++) {
  216. char opt; int l, r, v;
  217. getopt(opt);
  218. if (opt == 'I') {
  219. read(l), read(v);
  220. l ^= lastans;
  221. v ^= lastans;
  222. SGT.insert(l, v);
  223. }
  224. if (opt == 'Q') {
  225. read(l), read(r), read(v);
  226. l ^= lastans;
  227. r ^= lastans;
  228. v ^= lastans;
  229. printf("%d\n", lastans = SGT.query(l, r, v));
  230. }
  231. if (opt == 'M') {
  232. read(l), read(v);
  233. l ^= lastans;
  234. v ^= lastans;
  235. SGT.modify(l, v);
  236. }
  237. }
  238. return 0;
  239. }
  • 平衡树

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #define N 500005
  5. using namespace std;
  6. int inline read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  11. return x*f;
  12. }
  13. int ch[N][2],val[N],pri[N],siz[N],sz;
  14. void update(int x){siz[x]=1+siz[ch[x][0]]+siz[ch[x][1]];}
  15. int new_node(int v)
  16. {
  17. siz[++sz]=1;
  18. val[sz]=v;
  19. pri[sz]=rand();
  20. return sz;
  21. }
  22. int merge(int x,int y)
  23. {
  24. if (!x || !y) return x+y;
  25. if (pri[x]<pri[y])
  26. {
  27. ch[x][1]=merge(ch[x][1],y);
  28. update(x);
  29. return x;
  30. }
  31. else
  32. {
  33. ch[y][0]=merge(x,ch[y][0]);
  34. update(y);
  35. return y;
  36. }
  37. }
  38. void split(int now,int k,int &x,int &y)
  39. {
  40. if (!now) x=y=0;
  41. else
  42. {
  43. if (val[now]<=k)
  44. x=now,split(ch[now][1],k,ch[now][1],y);
  45. else
  46. y=now,split(ch[now][0],k,x,ch[now][0]);
  47. update(now);
  48. }
  49. }
  50. int kth(int now,int k)
  51. {
  52. while(1)
  53. {
  54. if (k<=siz[ch[now][0]])
  55. now=ch[now][0];
  56. else
  57. if (k==siz[ch[now][0]]+1)
  58. return now;
  59. else
  60. k-=siz[ch[now][0]]+1,now=ch[now][1];
  61. }
  62. }
  63. main()
  64. {
  65. srand((unsigned)time(NULL));
  66. int T,com,x,y,z,a,b,root=0;
  67. scanf("%d",&T);
  68. while(T--)
  69. {
  70. com=read(),a=read();
  71. if (com==1)
  72. {
  73. split(root,a,x,y);
  74. root=merge(merge(x,new_node(a)),y);
  75. }
  76. else
  77. if (com==2)
  78. {
  79. split(root,a,x,z);
  80. split(x,a-1,x,y);
  81. y=merge(ch[y][0],ch[y][1]);
  82. root=merge(merge(x,y),z);
  83. }
  84. else
  85. if (com==3)
  86. {
  87. split(root,a-1,x,y);
  88. printf("%d\n",siz[x]+1);
  89. root=merge(x,y);
  90. }
  91. else
  92. if (com==4)
  93. printf("%d\n",val[kth(root,a)]);
  94. else
  95. if (com==5)
  96. {
  97. split(root,a-1,x,y);
  98. printf("%d\n",val[kth(x,siz[x])]);
  99. root=merge(x,y);
  100. }
  101. else
  102. {
  103. split(root,a,x,y);
  104. printf("%d\n",val[kth(y,1)]);
  105. root=merge(x,y);
  106. }
  107. }
  108. }
  109. //fhq treap
  1. // luogu-judger-enable-o2
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<ctime>
  5. #include<algorithm>
  6. using namespace std;
  7. int root,n,a,b,tmp;
  8. int sz;
  9. struct treap {
  10. int sz,tot,w,rnd,ch[2];
  11. int lc,rc;
  12. } t[1000500];
  13. void update(int x) {
  14. t[x].sz=t[t[x].ch[0]].sz+t[t[x].ch[1]].sz+t[x].tot;
  15. }
  16. void turn(int &x,int k) {
  17. int y=t[x].ch[k^1];
  18. t[x].ch[k^1]=t[y].ch[k];
  19. t[y].ch[k]=x;
  20. update(x);
  21. update(y);
  22. x=y;
  23. }
  24. void insert(int &x,int w) {
  25. if(!x) {
  26. t[++sz].w=w;
  27. t[sz].rnd=rand();
  28. t[sz].tot=t[sz].sz=1;
  29. x=sz;
  30. } else {
  31. if(t[x].sz++,t[x].w==w)t[x].tot++;
  32. else if(insert(t[x].ch[tmp=w>t[x].w],w),t[t[x].ch[tmp]].rnd>t[x].rnd) {
  33. turn(x,tmp^1);
  34. }
  35. }
  36. }
  37. void del(int &x,int w) {
  38. if(!x)return;
  39. if(t[x].w==w) {
  40. if(t[x].tot>1)t[x].tot--,t[x].sz--;
  41. else {
  42. if(!(t[x].ch[0]&&t[x].ch[1]))x=t[x].ch[0]|t[x].ch[1];
  43. else
  44. turn(x,tmp=t[t[x].ch[0]].rnd>t[t[x].ch[1]].rnd),t[x].sz--,del(t[x].ch[tmp],w);
  45. }
  46. } else t[x].sz--,del(t[x].ch[w>t[x].w],w);
  47. }
  48. int rank1(int x,int w) {
  49. if(t[x].w==w)return t[t[x].ch[0]].sz+1;
  50. if(t[x].w<w)return t[t[x].ch[0]].sz+t[x].tot+rank1(t[x].ch[1],w);
  51. else return rank1(t[x].ch[0],w);
  52. }
  53. int kth(int x,int w) {
  54. if(!x)return 0;
  55. if(w<=t[t[x].ch[0]].sz)return kth(t[x].ch[0],w);
  56. else if(w>t[t[x].ch[0]].sz+t[x].tot)return kth(t[x].ch[1],w-t[t[x].ch[0]].sz-t[x].tot);
  57. else return t[x].w;
  58. }
  59. int pre(int v) {
  60. insert(root,v);
  61. tmp=kth(root,rank1(root,v)-1);
  62. del(root,v);
  63. return tmp;
  64. }
  65. int find(int x,int v) {
  66. return t[x].w==v?x:find(t[x].ch[t[x].w<v],v);
  67. }
  68. int sub(int v) {
  69. insert(root,v);
  70. tmp=kth(root,rank1(root,v)+t[find(root,v)].tot);
  71. del(root,v);
  72. return tmp;
  73. }
  74. int main() {
  75. scanf("%d",&n);
  76. for(int i=1; i<=n; i++) {
  77. scanf("%d%d",&a,&b);
  78. if(a==1)insert(root,b);
  79. if(a==2)del(root,b);
  80. if(a==3)printf("%d\n",rank1(root,b));
  81. if(a==4)printf("%d\n",kth(root,b));
  82. if(a==5)printf("%d\n",pre(b));
  83. if(a==6)printf("%d\n",sub(b));
  84. }
  85. }
  86. //treap
  1. #include<cstdio>
  2. struct SBT {
  3. int v, sz, ch[2], cnt;
  4. } t[300005];
  5. int n, cnt, root;
  6. #define Upd(k) {\
  7. t[k].sz = t[t[k].ch[0]].sz + t[t[k].ch[1]].sz + t[k].cnt;\
  8. }
  9. void rot(int &k, bool f) {
  10. int p = t[k].ch[f]; t[k].ch[f] = t[p].ch[!f]; t[p].ch[!f] = k;
  11. Upd(k); Upd(p); k = p;
  12. }
  13. inline void mt(int &k,bool f)
  14. {
  15. if(!k) return;
  16. if(t[t[k].ch[f^1]].sz < t[t[t[k].ch[f]].ch[f]].sz) rot(k, f);
  17. else if(t[t[k].ch[f^1]].sz < t[t[t[k].ch[f]].ch[f^1]].sz) { rot(t[k].ch[f], f^1); rot(k, f); }
  18. else return;
  19. mt(t[k].ch[f],f);
  20. mt(k,f);
  21. }
  22. void Ins(int &k, int x) {
  23. if(!k) {k = ++ cnt; t[k].sz = t[k].cnt = 1; t[k].v = x; return; }
  24. ++ t[k].sz;
  25. if(t[k].v == x) {++ t[k].cnt; return;}
  26. Ins(t[k].ch[t[k].v < x], x);
  27. mt(k, t[k].v < x);
  28. }
  29. int Del(int &k, int x) {
  30. if(!k) return k;
  31. int tmp;
  32. if(t[k].v == x) {
  33. if(t[k].cnt > 1) {-- t[k].cnt; --t[k].sz; return k;}
  34. else if(!(t[k].ch[0]*t[k].ch[1])) {k = t[k].ch[0]+t[k].ch[1];}
  35. else { tmp = Del(t[k].ch[0], x+1); t[k].cnt = t[tmp].cnt; t[k].v = t[tmp].v; Upd(k); return k; }
  36. }
  37. else if((t[k].v < x && !t[k].ch[1]) || (t[k].v > x && ! t[k].ch[0])) { tmp = k; k = t[k].ch[0]; Upd(k); return tmp; }
  38. else tmp = Del(t[k].ch[t[k].v < x], x);
  39. Upd(k); return tmp;
  40. }
  41. int Ran(int k,int x) {
  42. if(k==0)return 0;
  43. if(t[k].v==x)return t[t[k].ch[0]].sz+1;
  44. else if(x>t[k].v)
  45. return t[t[k].ch[0]].sz+t[k].cnt+Ran(t[k].ch[1],x);
  46. else return Ran(t[k].ch[0],x);
  47. }
  48. int Kth(int k,int x) {
  49. if(k==0)return 0;
  50. if(x<=t[t[k].ch[0]].sz)
  51. return Kth(t[k].ch[0],x);
  52. else if(x>t[t[k].ch[0]].sz+t[k].cnt)
  53. return Kth(t[k].ch[1],x-t[t[k].ch[0]].sz-t[k].cnt);
  54. else return t[k].v;
  55. }
  56. int ans;
  57. void pred(int k,int x) {
  58. if(k==0)return;
  59. if(t[k].v<x) {
  60. ans=k;
  61. pred(t[k].ch[1],x);
  62. } else pred(t[k].ch[0],x);
  63. }
  64. void succ(int k,int x) {
  65. if(k==0)return;
  66. if(t[k].v>x) {
  67. ans=k;
  68. succ(t[k].ch[0],x);
  69. } else succ(t[k].ch[1],x);
  70. }
  71. char c, f;
  72. inline void GET(int &n) {
  73. n = 0; f = 1;
  74. do {c = getchar(); if(c == '-') f = -1;} while(c > '9' || c < '0');
  75. while(c >= '0' && c <= '9') {n=n*10+c-'0';c=getchar();}
  76. n *= f;
  77. }
  78. int main() {
  79. GET(n);
  80. int opt,x;
  81. for(int i=1; i<=n; i++) {
  82. GET(opt); GET(x);
  83. switch(opt) {
  84. case 1: Ins(root,x); break;
  85. case 2: Del(root,x); break;
  86. case 3: printf("%d\n",Ran(root,x)); break;
  87. case 4: printf("%d\n",Kth(root,x)); break;
  88. case 5: ans=0; pred(root,x); printf("%d\n",t[ans].v); break;
  89. case 6: ans=0; succ(root,x); printf("%d\n",t[ans].v); break;
  90. }
  91. }
  92. return 0;
  93. }
  94. //SBT
  1. #include <cstdio>
  2. #define Maxn 1000000
  3. using namespace std;
  4. int f[Maxn];//father
  5. int ch[Maxn][2];//child ; 0 for left ; 1 for right
  6. int key[Maxn];//key
  7. int cnt[Maxn];//value
  8. int siz[Maxn];//size of subtree
  9. int sz,root;//size of tree and root
  10. //clear the ndoe
  11. void clear(int x)
  12. {
  13. ch[x][0]=ch[x][1]=f[x]=cnt[x]=key[x]=siz[x]=0;
  14. }
  15. //rightson return 1;left son return 0
  16. int getson(int x)
  17. {
  18. return ch[f[x]][1]==x;
  19. }
  20. //update the size
  21. void update(int x)
  22. {
  23. siz[x]=cnt[x];
  24. if (ch[x][0]) siz[x]+=siz[ch[x][0]];
  25. if (ch[x][1]) siz[x]+=siz[ch[x][1]];
  26. }
  27. //retation
  28. int rotate(int x)
  29. {
  30. int fa=f[x],fafa=f[fa],k=getson(x);
  31. ch[fa][k]=ch[x][k^1];f[ch[fa][k]]=fa;
  32. ch[x][k^1]=fa;f[fa]=x;
  33. f[x]=fafa;
  34. if (fafa)
  35. ch[fafa][ch[fafa][1]==fa]=x;
  36. update(fa);update(x);
  37. }
  38. //rotate until x is the root
  39. void splay(int x)
  40. {
  41. for (int fa;fa=f[x];rotate(x))
  42. if (f[fa])
  43. rotate(getson(x)==getson(fa) ? fa : x);
  44. root=x;
  45. }
  46. int pre()
  47. {
  48. int now=ch[root][0];
  49. while(ch[now][1])
  50. now=ch[now][1];
  51. return now;
  52. }
  53. int nex()
  54. {
  55. int now=ch[root][1];
  56. while(ch[now][0])
  57. now=ch[now][0];
  58. return now;
  59. }
  60. //find x's pos
  61. int findpos(int v)
  62. {
  63. int now=root,ans=0;
  64. while(1)
  65. {
  66. if (v<key[now])
  67. now=ch[now][0];
  68. else
  69. {
  70. ans+=ch[now][0]?siz[ch[now][0]]:0;
  71. if (v==key[now])
  72. {
  73. splay(now);
  74. return ans+1;
  75. }
  76. ans+=cnt[now];
  77. now=ch[now][1];
  78. }
  79. }
  80. }
  81. //find pos's x
  82. int findx(int x)
  83. {
  84. int now=root;
  85. while(1)
  86. {
  87. if (ch[now][0] && x<=siz[ch[now][0]])
  88. now=ch[now][0];
  89. else
  90. {
  91. int temp=(ch[now][0]?siz[ch[now][0]]:0)+cnt[now];
  92. if (x<=temp)
  93. return key[now];
  94. x-=temp;
  95. now=ch[now][1];
  96. }
  97. }
  98. }
  99. //ceate a new splay node
  100. void create(int v)
  101. {
  102. sz++;
  103. ch[sz][0]=ch[sz][1]=f[sz]=0;
  104. key[sz]=v;
  105. cnt[sz]=1;
  106. siz[sz]=1;
  107. //root=sz;
  108. }
  109. //insert a node
  110. void insert(int v)
  111. {
  112. if (!root)
  113. create(v),root=sz;
  114. else
  115. {
  116. int now=root,fa=0;
  117. while(1)
  118. {
  119. if (key[now]==v)
  120. {
  121. cnt[now]++;
  122. update(now);update(fa);
  123. splay(now);
  124. break;
  125. }
  126. fa=now;
  127. now=ch[fa][v>key[fa]];
  128. if (!now)
  129. {
  130. create(v);
  131. f[sz]=fa;
  132. ch[fa][v>key[fa]]=sz;
  133. update(fa);
  134. splay(sz);
  135. break;
  136. }
  137. }
  138. }
  139. }
  140. void del(int x)
  141. {
  142. int t=findpos(x);
  143. if (cnt[root]>1)
  144. {
  145. cnt[root]--;
  146. update(root);
  147. return;
  148. }
  149. //none
  150. if (!ch[root][0] && !ch[root][1])
  151. {
  152. clear(root);
  153. root=0;
  154. return;
  155. }
  156. //one
  157. if (!ch[root][1])
  158. {
  159. int temp=root;
  160. root=ch[root][0];
  161. f[root]=0;
  162. clear(temp);
  163. return;
  164. }
  165. else
  166. if (!ch[root][0])
  167. {
  168. int temp=root;
  169. root=ch[root][1];
  170. f[root]=0;
  171. clear(temp);
  172. return;
  173. }
  174. //two
  175. int pre1=pre(),temp=root;
  176. splay(pre1);
  177. f[ch[temp][1]]=root;
  178. ch[root][1]=ch[temp][1];
  179. clear(temp);
  180. update(root);
  181. }
  182. int main()
  183. {
  184. int n,opt,x;
  185. scanf("%d",&n);
  186. for (int i=1;i<=n;++i)
  187. {
  188. scanf("%d%d",&opt,&x);
  189. switch(opt)
  190. {
  191. case 1: insert(x); break;
  192. case 2: del(x); break;
  193. case 3: printf("%d\n",findpos(x)); break;
  194. case 4: printf("%d\n",findx(x)); break;
  195. case 5: insert(x); printf("%d\n",key[pre()]); del(x); break;
  196. case 6: insert(x); printf("%d\n",key[nex()]); del(x); break;
  197. }
  198. }
  199. }
  200. //splay
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const double r=0.78;
  5. const int maxn=100010,oo=0x3f3f3f3f;
  6. int rd()
  7. {
  8. int x=0,f=1;
  9. char c=getchar();
  10. while (c<'0'||c>'9')
  11. {
  12. if (c=='-') f=-1;
  13. c=getchar();
  14. }
  15. while (c>='0'&&c<='9')
  16. {
  17. x=x*10+c-'0';
  18. c=getchar();
  19. }
  20. return x*f;
  21. }
  22. int son[maxn][2],siz[maxn],num[maxn],w[maxn],cnt[maxn],
  23. fid[maxn],fw[maxn],fcnt[maxn],sta[maxn],
  24. tot,clo,rt,id,fa,b;
  25. void pause()
  26. {
  27. int x;
  28. x=1;
  29. }
  30. void upd(int u)
  31. {
  32. if (!u) return;
  33. siz[u]=siz[son[u][0]]+siz[son[u][1]]+1;
  34. num[u]=num[son[u][0]]+num[son[u][1]]+cnt[u];
  35. }
  36. void check(int u)
  37. {
  38. if (!u) return;
  39. if (siz[son[u][0]]>siz[u]*r||siz[son[u][1]]>siz[u]*r)
  40. id=u,fa=-1;
  41. if (son[u][0]==id)
  42. {
  43. fa=u;
  44. b=0;
  45. }
  46. if (son[u][1]==id)
  47. {
  48. fa=u;
  49. b=1;
  50. }
  51. }
  52. void dfs(int u)
  53. {
  54. if (!u) return;
  55. dfs(son[u][0]);
  56. clo++;
  57. fid[clo]=u;
  58. fw[clo]=w[u];
  59. fcnt[clo]=cnt[u];
  60. dfs(son[u][1]);
  61. }
  62. int build(int L,int R)
  63. {
  64. if (L>R) return 0;
  65. int mid=L+R>>1,u;
  66. u=fid[mid];
  67. w[u]=fw[mid];
  68. cnt[u]=fcnt[mid];
  69. son[u][0]=build(L,mid-1);
  70. son[u][1]=build(mid+1,R);
  71. upd(u);
  72. return u;
  73. }
  74. int solve(int u)
  75. {
  76. /*if (siz[son[u][0]]==-1) pause();
  77. printf("%d:%dvs%d\n",siz[u],siz[son[u][0]],siz[son[u][1]]);*/
  78. clo=0;
  79. dfs(u);
  80. return build(1,clo);
  81. }
  82. int ins(int u,int x)
  83. {
  84. if (!u)
  85. {
  86. u=++tot;
  87. w[u]=x;
  88. cnt[u]=siz[u]=num[u]=1;
  89. return u;
  90. }
  91. if (w[u]==x)
  92. {
  93. cnt[u]++;
  94. num[u]++;
  95. return u;
  96. }
  97. son[u][x>w[u]]=ins(son[u][x>w[u]],x);
  98. upd(u);
  99. check(u);
  100. return u;
  101. }
  102. int del(int u,int x)
  103. {
  104. //if (x==-8195776) pause();
  105. if (x==w[u])
  106. {
  107. cnt[u]--;
  108. if (!cnt[u])
  109. {
  110. if (son[u][0]*son[u][1]==0) u=son[u][0]+son[u][1];
  111. else
  112. {
  113. int fl=siz[son[u][0]]<siz[son[u][1]];
  114. int p=son[u][fl],top=0;
  115. while (son[p][fl^1]) sta[++top]=p,p=son[p][fl^1];
  116. if (top)
  117. {
  118. son[sta[top]][fl^1]=son[p][fl];
  119. son[p][0]=son[u][0];
  120. son[p][1]=son[u][1];
  121. for (;top;top--) upd(sta[top]);
  122. }
  123. else son[p][fl^1]=son[u][fl^1];
  124. u=p;
  125. }
  126. }
  127. upd(u);
  128. check(u);
  129. return u;
  130. }
  131. son[u][x>w[u]]=del(son[u][x>w[u]],x);
  132. upd(u);
  133. check(u);
  134. return u;
  135. }
  136. int get_rank(int u,int x)
  137. {
  138. if (!u) return 0;
  139. if (x==w[u]) return num[son[u][0]]+1;
  140. if (x<w[u]) return get_rank(son[u][0],x);
  141. return cnt[u]+num[son[u][0]]+get_rank(son[u][1],x);
  142. }
  143. int qry(int u,int x)
  144. {
  145. if (x<=num[son[u][0]]) return qry(son[u][0],x);
  146. if (x<=cnt[u]+num[son[u][0]]) return w[u];
  147. return qry(son[u][1],x-(cnt[u]+num[son[u][0]]));
  148. }
  149. int pre(int u,int x)
  150. {
  151. if (!u) return -oo;
  152. if (w[u]>=x) return pre(son[u][0],x);
  153. return max(w[u],pre(son[u][1],x));
  154. }
  155. int succ(int u,int x)
  156. {
  157. if (!u) return oo;
  158. if (w[u]<=x) return succ(son[u][1],x);
  159. return min(w[u],succ(son[u][0],x));
  160. }
  161. int main()
  162. {
  163. /*freopen("phs.in","r",stdin);
  164. freopen("phs.out","w",stdout);*/
  165. int n,opt;
  166. n=rd();
  167. while (n--)
  168. {
  169. /*if (n%3000==0) printf("%d\n",n);
  170. if (n%5000==0) pause();*/
  171. opt=rd();
  172. switch (opt)
  173. {
  174. case 1:
  175. id=-1;
  176. rt=ins(rt,rd());
  177. if (id>0)
  178. {
  179. if (fa==-1) rt=solve(id);
  180. else son[fa][b]=solve(id);
  181. }
  182. break;
  183. case 2:
  184. id=-1;
  185. rt=del(rt,rd());
  186. if (id>0)
  187. {
  188. if (fa==-1) rt=solve(id);
  189. else son[fa][b]=solve(id);
  190. }
  191. break;
  192. //default:rd();break;
  193. case 3:printf("%d\n",get_rank(rt,rd()));break;
  194. case 4:printf("%d\n",qry(rt,rd()));break;
  195. case 5:printf("%d\n",pre(rt,rd()));break;
  196. case 6:printf("%d\n",succ(rt,rd()));break;
  197. /*case 3:get_rank8(rt,rd());break;
  198. case 4:qry(rt,rd());break;
  199. case 5:pre(rt,rd());break;
  200. case 6:succ(rt,rd());break;*/
  201. }
  202. }
  203. }
  204. //SGT
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. using namespace std;
  7. const int N=5e5+10;
  8. int n,rt[N],cnt;
  9. struct Node{
  10. int ch[2];
  11. int rnd,sz,v;
  12. }t[N*50];
  13. inline int read()
  14. {
  15. int x=0,t=1;
  16. char ch=getchar();
  17. while(ch<'0'||ch>'9') {if(ch=='-') t=-1;ch=getchar();}
  18. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  19. return x*t;
  20. }
  21. inline int copynode(int x)
  22. {
  23. t[++cnt]=t[x];
  24. return cnt;
  25. }
  26. inline int newnode(int x)
  27. {
  28. t[++cnt].v=x;t[cnt].sz=1;t[cnt].rnd=rand();
  29. return cnt;
  30. }
  31. inline void update(int k)
  32. {
  33. if(k)
  34. t[k].sz=t[t[k].ch[0]].sz+t[t[k].ch[1]].sz+1;
  35. }
  36. inline void split(int now,int k,int &x,int &y)
  37. {
  38. if(!now) {x=0;y=0;return;}
  39. if(t[now].v<=k){
  40. x=copynode(now);
  41. split(t[x].ch[1],k,t[x].ch[1],y);
  42. }else{
  43. y=copynode(now);
  44. split(t[y].ch[0],k,x,t[y].ch[0]);
  45. }
  46. update(x);update(y);
  47. }
  48. inline int merge(int x,int y)
  49. {
  50. if(!x || !y) return x+y;
  51. if(t[x].rnd<t[y].rnd){
  52. int z=copynode(x);
  53. t[z].ch[1]=merge(t[z].ch[1],y);
  54. update(z);
  55. return z;
  56. }else{
  57. int z=copynode(y);
  58. t[z].ch[0]=merge(x,t[z].ch[0]);
  59. update(z);
  60. return z;
  61. }
  62. }
  63. inline void insert(int now,int k)
  64. {
  65. int x=0,y=0,z=0;
  66. split(rt[now],k,x,y);
  67. z=newnode(k);
  68. rt[now]=merge(merge(x,z),y);
  69. }
  70. inline void del(int now,int k)
  71. {
  72. int x=0,y=0,z=0;
  73. split(rt[now],k,x,y);
  74. split(x,k-1,x,z);
  75. z=merge(t[z].ch[0],t[z].ch[1]);
  76. rt[now]=merge(merge(x,z),y);
  77. }
  78. inline int rnk(int now,int k)
  79. {
  80. int x=0,y=0;
  81. split(rt[now],k-1,x,y);
  82. return t[x].sz+1;
  83. }
  84. inline int kth(int x,int k)
  85. {
  86. while(1){
  87. if(t[t[x].ch[0]].sz+1 ==k) return t[x].v;
  88. else if(t[t[x].ch[0]].sz>=k) x=t[x].ch[0];
  89. else {k-=(t[t[x].ch[0]].sz+1);x=t[x].ch[1];}
  90. //1-> cause the same are not on the same
  91. }
  92. }
  93. inline int pre(int now,int k)
  94. {
  95. int x=0,y=0,z=0;
  96. split(rt[now],k-1,x,y);
  97. if(!x) return -2147483647;
  98. return kth(x,t[x].sz);
  99. }
  100. inline int suf(int now,int k)
  101. {
  102. int x=0,y=0,z=0;
  103. split(rt[now],k,x,y);
  104. if(!y) return 2147483647;
  105. return kth(y,1);
  106. }
  107. int main(){
  108. srand(time(0));
  109. n=read();
  110. for(int i=1;i<=n;i++){
  111. int in=read(),op=read();
  112. rt[i]=rt[in];
  113. if(op==1) insert(i,read());
  114. else
  115. if(op==2) del(i,read());
  116. else
  117. if(op==3) printf("%d\n",rnk(i,read()));
  118. else
  119. if(op==4) printf("%d\n",kth(rt[i],read()));
  120. else
  121. if(op==5) printf("%d\n",pre(i,read()));
  122. else
  123. printf("%d\n",suf(i,read()));
  124. }
  125. return 0;
  126. }
  127. //可持久化平衡树
  • 并查集

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int f[2000010];
  5. int find(int x)
  6. {
  7. return x==f[x]?x:f[x]=find(f[x]);
  8. }
  9. void merge(int a,int b){
  10. int f1=find(a),f2=find(b);
  11. if(f1!=f2){
  12. f[f2]=f1;
  13. }
  14. }
  15. int main(){
  16. int n,m;
  17. cin>>n>>m;
  18. for(int i=1;i<=n;i++) f[i]=i;
  19. while(m--){
  20. int opt;
  21. cin>>opt;
  22. switch(opt){
  23. case(1):{
  24. int a,b;
  25. cin>>a>>b;
  26. merge(a,b);
  27. break;
  28. }
  29. case(2):{
  30. int a,b;
  31. cin>>a>>b;
  32. if(find(a)==find(b)){
  33. cout<<"Y"<<endl;
  34. }
  35. else cout<<"N"<<endl;
  36. }
  37. }
  38. }
  39. }
  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0;char ch=getchar();
  7. while(ch>'9'||ch<'0')ch=getchar();
  8. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  9. return x;
  10. }
  11. int n,m,sz,last;
  12. int root[200005],ls[10000005],rs[10000005],v[10000005],deep[10000005];
  13. void build(int &k,int l,int r)
  14. {
  15. if(!k)k=++sz;
  16. if(l==r){v[k]=l;return;}
  17. int mid=(l+r)>>1;
  18. build(ls[k],l,mid);
  19. build(rs[k],mid+1,r);
  20. }
  21. void modify(int l,int r,int x,int &y,int pos,int val)
  22. {
  23. y=++sz;
  24. if(l==r){v[y]=val;return;}
  25. ls[y]=ls[x];rs[y]=rs[x];
  26. int mid=(l+r)>>1;
  27. if(pos<=mid)
  28. modify(l,mid,ls[x],ls[y],pos,val);
  29. else modify(mid+1,r,rs[x],rs[y],pos,val);
  30. }
  31. int query(int k,int l,int r,int pos)
  32. {
  33. if(l==r)return k;
  34. int mid=(l+r)>>1;
  35. if(pos<=mid)return query(ls[k],l,mid,pos);
  36. else return query(rs[k],mid+1,r,pos);
  37. }
  38. void add(int k,int l,int r,int pos)
  39. {
  40. if(l==r){deep[k]++;return;}
  41. int mid=(l+r)>>1;
  42. if(pos<=mid)add(ls[k],l,mid,pos);
  43. else add(rs[k],mid+1,r,pos);
  44. }
  45. int find(int k,int x)
  46. {
  47. int p=query(k,1,n,x);
  48. if(x==v[p])return p;
  49. return find(k,v[p]);
  50. }
  51. int main()
  52. {
  53. n=read();m=read();
  54. build(root[0],1,n);
  55. int f,k,a,b;
  56. for(int i=1;i<=m;i++)
  57. {
  58. f=read();
  59. if(f==1)
  60. {
  61. root[i]=root[i-1];
  62. a=read();b=read();a=a^last;b=b^last;
  63. int p=find(root[i],a),q=find(root[i],b);
  64. if(v[p]==v[q])continue;
  65. if(deep[p]>deep[q])swap(p,q);
  66. modify(1,n,root[i-1],root[i],v[p],v[q]);
  67. if(deep[p]==deep[q])add(root[i],1,n,v[q]);
  68. }
  69. if(f==2)
  70. {k=read();k=k^last;root[i]=root[k];}
  71. if(f==3)
  72. {
  73. root[i]=root[i-1];
  74. a=read();b=read();a=a^last;b=b^last;
  75. int p=find(root[i],a),q=find(root[i],b);
  76. if(v[p]==v[q])last=1;
  77. else last=0;
  78. printf("%d\n",last);
  79. }
  80. }
  81. return 0;
  82. }
  83. //好吧其实可持久并查集和并查集并没什么太大关系,主席树维护持久数组
  1. //留坑二维并查集
  • 树链剖分

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. struct tree{int l,r,sum,book;}tr[400005];
  7. struct edge{int to,nxt;}e[200005];
  8. int head[100005],tot,cnt;
  9. int p[100005],y[100005],x[100005],si[100005];
  10. int dep[100005],fa[100005],bl[100005];
  11. int n,m,ans,mod,root;
  12. void add(int u,int v){e[++tot].to=v;e[tot].nxt=head[u];head[u]=tot;}
  13. void dfs(int u){
  14. si[u]=1;
  15. for(int v,c=head[u];c;c=e[c].nxt){
  16. v=e[c].to;
  17. if(v==fa[u])continue;
  18. dep[v]=dep[u]+1;fa[v]=u;
  19. dfs(v);
  20. si[u]+=si[v];
  21. }
  22. }
  23. void dfs2(int u,int blo){
  24. p[u]=++cnt;bl[u]=blo;y[p[u]]=x[u];
  25. int k=0;
  26. for(int v,c=head[u];c;c=e[c].nxt){
  27. v=e[c].to;
  28. if(dep[v]!=dep[u]+1)continue;
  29. if(si[v]>si[k])k=v;
  30. }
  31. if(k==0)return;
  32. dfs2(k,blo);
  33. for(int v,c=head[u];c;c=e[c].nxt){
  34. if(e[c].to==k)continue;
  35. v=e[c].to;
  36. if(dep[v]!=dep[u]+1)continue;
  37. dfs2(v,v);
  38. }
  39. }
  40. void pushdown(int now){
  41. tr[now*2].book=(tr[now].book+tr[now*2].book)%mod;
  42. tr[now*2+1].book=(tr[now].book+tr[now*2+1].book)%mod;
  43. tr[now].sum=(tr[now].sum+(tr[now].r-tr[now].l+1)*tr[now].book%mod)%mod;
  44. tr[now].book=0;
  45. }
  46. void tr_build(int l,int r,int now){
  47. tr[now].l=l;tr[now].r=r;
  48. if(l==r){
  49. tr[now].sum=y[l];
  50. return ;
  51. }
  52. else{
  53. int mid=(l+r)/2;
  54. tr_build(l,mid,now*2);
  55. tr_build(mid+1,r,now*2+1);
  56. tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;
  57. }
  58. }
  59. void bt_add(int l,int r,int c,int now){
  60. if(l==tr[now].l&&r==tr[now].r){
  61. if(l==r)tr[now].sum=(tr[now].sum+c)%mod;
  62. else tr[now].book=(tr[now].book+c)%mod;
  63. return;
  64. }
  65. tr[now].sum=(tr[now].sum+(r-l+1)*c%mod)%mod;
  66. int mid=(tr[now].l+tr[now].r)/2;
  67. if(l>mid)bt_add(l,r,c,now*2+1);
  68. else if(r<=mid)bt_add(l,r,c,now*2);
  69. else{
  70. bt_add(l,mid,c,now*2);
  71. bt_add(mid+1,r,c,now*2+1);
  72. }
  73. }
  74. void bt_ser(int l,int r,int now){
  75. if(l==tr[now].l&&r==tr[now].r){
  76. ans=(ans+tr[now].sum+(r-l+1)*tr[now].book%mod)%mod;
  77. return;
  78. }
  79. pushdown(now);
  80. int mid=(tr[now].l+tr[now].r)/2;
  81. if(l>mid)bt_ser(l,r,now*2+1);
  82. else if(r<=mid)bt_ser(l,r,now*2);
  83. else{
  84. bt_ser(l,mid,now*2);
  85. bt_ser(mid+1,r,now*2+1);
  86. }
  87. }
  88. void si_add(int u,int v,int s){
  89. while(bl[u]!=bl[v]){
  90. if(dep[bl[u]]>dep[bl[v]])swap(u,v);
  91. bt_add(p[bl[v]],p[v],s,1);
  92. v=fa[bl[v]];
  93. }
  94. if(dep[u]>dep[v])swap(u,v);
  95. bt_add(p[u],p[v],s,1);
  96. }
  97. void si_sum(int u,int v){
  98. ans=0;
  99. while(bl[u]!=bl[v]){
  100. if(dep[bl[u]]>dep[bl[v]])swap(u,v);
  101. bt_ser(p[bl[v]],p[v],1);
  102. v=fa[bl[v]];
  103. }
  104. if(dep[u]>dep[v])swap(u,v);
  105. bt_ser(p[u],p[v],1);
  106. printf("%d\n",ans);
  107. }
  108. void tr_add(int u,int s){bt_add(p[u],p[u]+si[u]-1,s,1);}
  109. void tr_sum(int u){
  110. ans=0;
  111. bt_ser(p[u],p[u]+si[u]-1,1);
  112. printf("%d\n",ans);
  113. }
  114. int main(){
  115. scanf("%d%d%d%d",&n,&m,&root,&mod);
  116. for(int i=1;i<=n;++i)scanf("%d",&x[i]);
  117. for(int i=1,u,v;i<n;++i){
  118. scanf("%d%d",&u,&v);
  119. add(u,v);add(v,u);
  120. }
  121. dfs(root);dfs2(root,root);
  122. tr_build(1,n,1);
  123. for(int i=1,opt,u,v,s;i<=m;++i){
  124. scanf("%d%d",&opt,&u);
  125. if(opt==1){
  126. scanf("%d%d",&v,&s);
  127. si_add(u,v,s%mod);
  128. }
  129. else if(opt==2){
  130. scanf("%d",&v);
  131. si_sum(u,v);
  132. }
  133. else if(opt==3){
  134. scanf("%d",&s);
  135. tr_add(u,s%mod);
  136. }
  137. else {tr_sum(u);}
  138. }
  139. return 0;
  140. }
  • 树状数组

懒得写了

  • 动态树

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=300005;
  7. int n,m,top;
  8. int ch[maxn][2],rev[maxn],que[maxn];
  9. int fa[maxn],val[maxn],sum[maxn];
  10. bool isroot(int x){
  11. return ch[fa[x]][0]!=x && ch[fa[x]][1]!=x;
  12. }
  13. void pushup(int x){
  14. sum[x]=sum[ch[x][0]]^val[x]^sum[ch[x][1]];
  15. }
  16. void pushdown(int x){
  17. if(rev[x]){
  18. rev[ch[x][0]]^=1;rev[ch[x][1]]^=1;
  19. swap(ch[x][0],ch[x][1]);
  20. rev[x]=0;
  21. }
  22. }
  23. void rotat(int x){
  24. int y=fa[x],z=fa[y],l,r;
  25. if(ch[y][0]==x)l=0;else l=1;r=l^1;
  26. if(!isroot(y)){
  27. ch[z][ch[z][1]==y]=x;
  28. }
  29. fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
  30. ch[y][l]=ch[x][r];ch[x][r]=y;
  31. pushup(y);pushup(x);
  32. }
  33. void splay(int x){
  34. int i;
  35. for(i=x;!isroot(i);i=fa[i]){
  36. que[++top]=i;
  37. }
  38. que[++top]=i;
  39. while(top)pushdown(que[top--]);
  40. while(!isroot(x)){
  41. int y=fa[x],z=fa[y];
  42. if(!isroot(y)){
  43. if((ch[z][0]==y)^(ch[y][0]==x))rotat(x);
  44. else rotat(y);
  45. }
  46. rotat(x);
  47. }
  48. }
  49. void access(int x){
  50. int lst=0;
  51. while(x){
  52. splay(x);ch[x][1]=lst;pushup(x);lst=x;x=fa[x];
  53. }
  54. }
  55. void makeroot(int x){
  56. access(x);splay(x);rev[x]^=1;
  57. }
  58. void link(int x,int y){
  59. makeroot(x);fa[x]=y;pushup(y);
  60. }
  61. void cut(int x,int y){
  62. makeroot(x);access(y);splay(y);
  63. if(ch[y][0]==x){
  64. ch[y][0]=fa[x]=0;pushup(y);
  65. }
  66. }
  67. void change(int x,int y){
  68. access(x);splay(x);val[x]=y;pushup(x);
  69. }
  70. int LCT_query(int x,int y){
  71. makeroot(x);access(y);splay(y);
  72. return sum[y];
  73. }
  74. int findroot(int x){
  75. access(x);splay(x);
  76. while(ch[x][0])x=ch[x][0];
  77. return x;
  78. }
  79. int main(){
  80. scanf("%d%d",&n,&m);
  81. for(int i=1;i<=n;++i)
  82. scanf("%d",&val[i]);
  83. int opt,x,y;
  84. for(int i=1;i<=m;++i){
  85. scanf("%d%d%d",&opt,&x,&y);
  86. switch(opt){
  87. case 0:{
  88. printf("%d\n",LCT_query(x,y));
  89. break;
  90. }
  91. case 1:{
  92. if(findroot(x)!=findroot(y))
  93. link(x,y);
  94. break;
  95. }
  96. case 2:{
  97. cut(x,y);
  98. break;
  99. }
  100. case 3:{
  101. change(x,y);
  102. break;
  103. }
  104. }
  105. }
  106. return 0;
  107. }
  • 点分治

  1. //IOI2011Race
  2. // luogu-judger-enable-o2
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cstdio>
  6. #include<cstring>
  7. using namespace std;
  8. #define maxn 200010
  9. #define maxk 1000010
  10. #define INF 1000000009
  11. struct edge{
  12. int to,nxt,w;
  13. }e[maxn<<1];
  14. int n,root,k,sum,head[maxn],tot,tmp[maxk],dis[maxn],dep[maxn],ans=INF,vis[maxn],siz[maxn],g[maxn];
  15. void add(int u,int v,int w){
  16. e[++tot].to=v;
  17. e[tot].w=w;
  18. e[tot].nxt=head[u];
  19. head[u]=tot;
  20. }
  21. void getroot(int u,int fa){
  22. siz[u]=1;
  23. g[u]=0;
  24. for(int i=head[u];i;i=e[i].nxt){
  25. int v=e[i].to;
  26. if(vis[v]||v==fa) continue;
  27. getroot(v,u);
  28. siz[u]+=siz[v];
  29. g[u]=max(g[u],siz[v]);
  30. }
  31. g[u]=max(g[u],sum-siz[u]);
  32. if(g[u]<g[root]) root=u;
  33. }
  34. void dfsdis(int u,int fa){
  35. if(dis[u]<=k) ans=min(ans,tmp[k-dis[u]]+dep[u]);
  36. for(int i=head[u];i;i=e[i].nxt){
  37. int v=e[i].to;
  38. if(vis[v]||v==fa) continue;
  39. dis[v]=dis[u]+e[i].w;
  40. dep[v]=dep[u]+1;
  41. dfsdis(v,u);
  42. }
  43. }
  44. void calc(int u,int fa,int p){
  45. if(dis[u]<=k){
  46. if(p) tmp[dis[u]]=min(tmp[dis[u]],dep[u]);
  47. else tmp[dis[u]]=INF;
  48. }
  49. for(int i=head[u];i;i=e[i].nxt){
  50. int v=e[i].to;
  51. if(vis[v]||v==fa) continue;
  52. calc(v,u,p);
  53. }
  54. }
  55. void dfs(int u){
  56. vis[u]=1; tmp[0]=0;
  57. for(int i=head[u];i;i=e[i].nxt){
  58. int v=e[i].to;
  59. if(vis[v]) continue;
  60. dis[v]=e[i].w; dep[v]=1;
  61. dfsdis(v,0);
  62. calc(v,0,1);
  63. }
  64. for(int i=head[u];i;i=e[i].nxt){
  65. int v=e[i].to;
  66. if(vis[v]) continue;
  67. calc(v,0,0);
  68. }
  69. for(int i=head[u];i;i=e[i].nxt){
  70. int v=e[i].to;
  71. if(vis[v]) continue;
  72. root=0;
  73. sum=siz[v];
  74. getroot(v,0);
  75. dfs(root);
  76. }
  77. }
  78. int main(){
  79. scanf("%d %d",&n,&k);
  80. for(int i=1;i<=k;++i) tmp[i]=INF;
  81. for(int i=1;i<n;++i){
  82. int u,v,w;
  83. scanf("%d %d %d",&u,&v,&w);
  84. ++u;
  85. ++v;
  86. add(u,v,w);
  87. add(v,u,w);
  88. }
  89. root=0;
  90. sum=g[0]=n;
  91. getroot(1,0);
  92. dfs(root);
  93. if(ans!=INF) printf("%d",ans);
  94. else printf("-1");
  95. return 0;
  96. }
  1. 点分树比点分治就多一个记录重心父亲

Day2结束,华丽的分割线


训练计划Day2的更多相关文章

  1. 【从零开始学BPM,Day2】默认表单开发

    [课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...

  2. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  3. day2

    三级菜单: ))))))))))] last_levels.pop() ]]]]]]]]:] information = : ch = msvcrt.getch() ][][: : password= ...

  4. java day2一个模拟双色球的代码

    package day2; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...

  5. Python基础-day2

    1.Python模块python 中导入模块使用import语法格式:import module_name示例1: 导入os模块system('dir')列出当前目录下的所有文件 # _*_ codi ...

  6. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  7. ACM训练计划建议(写给本校acmer,欢迎围观和指正)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

  8. 冲刺阶段 day2

    day2 项目进展 今天本组五位同学聚在一起将项目启动,首先我们对项目进行了规划,分工,明确指出每个人负责哪些项目.由负责第一部分的组员开始编程,在已经搭建好的窗体内,对系部设置进行了编写,本校共六个 ...

  9. 2015寒假ACM训练计划

    1月26号至3月4号 每天给自己一个计划.做有意义的事情,不要浪费时间. 8:00——11:30 acm训练 11:30——13:00 午休 13:00——17:30  acm训练 17:30——18 ...

随机推荐

  1. vim - Vi IMproved, 一个程序员的文本编辑器

    总览 (SYNOPSIS) vim [options] [file ..] vim [options] - vim [options] -t tag vim [options] -q [errorfi ...

  2. yum处理损坏的包依赖关系

    有时在安装多个软件包时,某个包的软件依赖关系可能会被另外一个包的安装覆盖掉.这叫做损坏的包依赖关系(broken dependency). 如果系统出现问题,可以先尝试: yum clean all ...

  3. 随笔记录 重置root密码 2019.8.7

    方法1:进入单用户模式 1.开机进入以下界面选择要启动的系统按e 2.找到星号行在后面添加上init=/bin/sh 3.按住Ctrl+x执行 4.进入单用户模式 5.如果passwd命令失败,可以直 ...

  4. SQL Server 中根据字段值查询其所在的表、字段

    DECLARE @what varchar(800)SET @what='123456' --要搜索的字符串   DECLARE @sql varchar(8000)   DECLARE TableC ...

  5. thinkphp 模板文件

    因为模板文件中可能会泄露数据表的字段信息,有两种方法可以保护你的模板文件不被访问到: 第一种方式是配置.htaccess文件,针对Apache服务器而言. 大理石平台厂家 把以下代码保存在模块的模板目 ...

  6. 模拟字典序排序——hdu6034

    #include <bits/stdc++.h> #include <iostream> using namespace std; ; ; int n; int maxj; s ...

  7. Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标

    http://terony.blog.sohu.com/71347192.html‍ Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标 标签: Delphi2007 SetW ...

  8. NX二次开发-设置WCS位置UF_CSYS_set_wcs

    NX9+VS2012 UF_initialize(); //输入X向量Y向量输出一个3*3矩阵 ] = {0.0, 0.0, 1.0}; ] = {0.0, 1.0, 0.0}; ]; UF_MTX3 ...

  9. Java-Class-@I:org.springframework.web.bind.annotation.RestController

    ylbtech-Java-Class-@I:org.springframework.web.bind.annotation.RestController 1.返回顶部   2.返回顶部 1. pack ...

  10. Java-Class-C:com.alibaba.fastjosn.JSON

    ylbtech-Java-Class-C:com.alibaba.fastjosn.JSON 1.返回顶部 1.1.import com.alibaba.fastjson.JSON;import co ...