【前言】快要省选二试了。上次去被虐出翔了~~这次即便是打酱油。也要打出风採!于是暂停新东西的学习。然后開始复习曾经的知识,为骗分做准备。PS:区间翻转的临时跳过,就算学了也来不及巩固了。

【BZOJ3224】

3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 1477  Solved: 570

Description

您须要写一种数据结构(可參考题目标题)。来维护一些数,当中须要提供下面操作:

1. 插入x数

2. 删除x数(若有多个同样的数,因仅仅删除一个)

3. 查询x数的排名(若有多个同样的数。因输出最小的排名)

4. 查询排名为x的数

5. 求x的前驱(前驱定义为小于x,且最大的数)

6. 求x的后继(后继定义为大于x。且最小的数)

Input

第一行为n,表示操作的个数,以下n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示相应答案

Sample Input

10

1 106465

4 1

1 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

Sample Output

106465

84185

492737

【分析】写了半个下午。调了一个晚上,这是多么的壮烈啊。

splay的基本操作。由于刚開始复习,这一段的rotate和splay直接copy模板的咕~~(╯﹏╰)b。

对于同样的数。处理起来非常麻烦。YD表示能够用一个count[x]记录x出现的次数。

而我是傻的,直接插入进去。这种话,我还记录了num[i][w],表示以i节点的左右子树的大小。(仅仅需在rotate的时候改变一下就可以)

查询K的排名时,仅仅需把K再插入一遍(<=的形式插),再旋转至根,答案就是num[k][1]+1。

还有,有关前驱和后继真是烦人(万一有反复。)。对此,YY教了我一个乱使的方法。

每次对于K求出它的前驱(后继)P。假设P<K结束,输出P。否则把P提到根,再做类似的操作。

【代码】

  1. /**************************************************************
  2. Problem: 3224
  3. User: jiangshibiao
  4. Language: C++
  5. Result: Accepted
  6. Time:696 ms
  7. Memory:7080 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #define N 200005
  12. using namespace std;
  13. int son[N][3],num[N][3],f[N],a[N];
  14. int opt,n,i,root,x,node,ans,flag;
  15. inline void Rotate(int x,int w)//1:左旋;2:右旋
  16. {
  17. int y=f[x],z=f[y];
  18. son[y][3-w]=son[x][w];
  19. if (son[x][w]) f[son[x][w]]=y;
  20. f[x]=z;
  21. num[y][3-w]=num[x][w];
  22. num[x][w]+=num[y][w]+1;
  23. if (z)
  24. {
  25. if (y==son[z][1]) son[z][1]=x;
  26. else son[z][2]=x;
  27. }
  28. f[y]=x;son[x][w]=y;
  29. }
  30. inline void splay(int x)
  31. {
  32. int y;
  33. while (f[x])
  34. {
  35. y=f[x];
  36. if (!f[y])
  37. {
  38. if (x==son[y][1]) Rotate(x,2);else Rotate(x,1);
  39. continue;
  40. }
  41. if (y==son[f[y]][1])
  42. {
  43. if (x==son[y][1]) Rotate(y,2),Rotate(x,2);
  44. else Rotate(x,1),Rotate(x,2);
  45. }
  46. else
  47. {
  48. if (x==son[y][2]) Rotate(y,1),Rotate(x,1);
  49. else Rotate(x,2),Rotate(x,1);
  50. }
  51. }
  52. root=x;
  53. }
  54. inline void insert(int x,int add)
  55. {
  56. if (add<=a[x])
  57. {
  58. if (!son[x][1]) son[x][1]=++node,a[node]=add,f[node]=x;
  59. else insert(son[x][1],add);
  60. num[x][1]++;
  61. }
  62. else
  63. {
  64. if (!son[x][2]) son[x][2]=++node,a[node]=add,f[node]=x;
  65. else insert(son[x][2],add);
  66. num[x][2]++;
  67. }
  68. }
  69. inline void del(int x,int add)
  70. {
  71. if (!x) return;
  72. if (add==a[x])
  73. {
  74. splay(x);
  75. if (!son[x][1]&&!son[x][2]){root=0;return;}
  76. if (!son[x][1]) {root=son[x][2];f[son[x][2]]=0;return;}
  77. if (!son[x][2]) {root=son[x][1];f[son[x][1]]=0;return;}
  78. int find=son[x][1],temp=son[x][2];
  79. while (son[find][2]) find=son[find][2];
  80. splay(find);son[find][2]=temp;f[temp]=find;
  81. return;
  82. }
  83. if (add<a[x]) del(son[x][1],add);else del(son[x][2],add);
  84. }
  85. inline int Kth(int x,int add,int now)
  86. {
  87. insert(root,add);splay(node);
  88. int ans=num[node][1]+1;
  89. del(node,add);
  90. return ans;
  91. }
  92. inline int Ask(int x,int k)
  93. {
  94. if (k==num[x][1]+1) return a[x];
  95. if (k<=num[x][1]) return Ask(son[x][1],k);
  96. return Ask(son[x][2],k-num[x][1]-1);
  97. }
  98. inline int pred(int x,int k)
  99. {
  100. int find=son[x][1];if (!find) return 0;
  101. while (son[find][2]) find=son[find][2];
  102. if (a[find]!=k) flag=1;return find;
  103. }
  104. inline int succ(int x,int k)
  105. {
  106. int find=son[x][2];if (!find) return 0;
  107. while (son[find][1]) find=son[find][1];
  108. if (a[find]!=k) flag=1;return find;
  109. }
  110. int main()
  111. {
  112. scanf("%d",&n);root=0;
  113. for (i=1;i<=n;i++)
  114. {
  115. scanf("%d%d",&opt,&x);
  116. if (opt==1) insert(root,x),splay(node);
  117. if (opt==2) del(root,x);
  118. if (opt==3) printf("%d\n",Kth(root,x,0));
  119. if (opt==4) printf("%d\n",Ask(root,x));
  120. if (opt==5)
  121. {
  122. insert(root,x);splay(node);
  123. for (flag=0,ans=pred(root,x);!flag||!ans;splay(ans),ans=pred(root,x));
  124. del(root,x);printf("%d\n",a[ans]);
  125. }
  126. if (opt==6)
  127. {
  128. insert(root,x);splay(node);
  129. for (flag=0,ans=succ(root,x);!flag||!ans;splay(ans),ans=succ(root,x));
  130. del(root,x);printf("%d\n",a[ans]);
  131. }
  132. }
  133. return 0;
  134. }

【BZOJ1056/1862】

1862: [Zjoi2006]GameZ游戏排名系统

Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 554  Solved: 212

Description

GameZ为他们最新推出的游戏开通了一个站点。世界各地的玩家都能够将自己的游戏得分上传到站点上。这样就能够看到自己在世界上的排名。得分越高。排名就越靠前。

当两个玩家的名次同样时。先上传记录者优先。因为新游戏的火爆。站点server已经难堪重负。

为此GameZ雇用了你来帮他们又一次开发一套新的核心。排名系统通常要应付三种请求:上传一条新的得分记录、查询某个玩家的当前排名以及返回某个区段内的排名记录。

当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除。

为了减轻server负担。在返回某个区段内的排名记录时,最多返回10条记录。

Input

第一行是一个整数n(n>=10)表示请求总数目。接下来n行每行包括了一个请求。请求的详细格式例如以下: +Name Score 上传最新得分记录。Name表示玩家名字,由大写英文字母组成。不超过10个字符。Score为最多8位的正整数。

?Name 查询玩家排名。该玩家的得分记录必然已经在前面上传。

?Index 返回自第Index名開始的最多10名玩家名字。

Index必然合法。即不小于1,也不大于当前有记录的玩家总数。

输入文件总大小不超过2M。

NOTE:用C++的fstream读大规模数据的效率较低

Output

对于每条查询请求。输出对应结果。

对于?Name格式的请求。应输出一个整数表示该玩家当前的排名。对于?

Index格式的请求,应在一行中依次输出从第Index名開始的最多10名玩家姓名。用一个空格分隔。

Sample Input

20

+ADAM 1000000 增加ADAM的得分记录

+BOB 1000000 增加BOB的得分记录

+TOM 2000000 增加TOM的得分记录

+CATHY 10000000 增加CATHY的得分记录

?TOM 输出TOM眼下排名

?

1 眼下有记录的玩家总数为4,因此应输出第1名到第4名。

+DAM 100000 增加DAM的得分记录

+BOB 1200000 更新BOB的得分记录

+ADAM 900000 更新ADAM的得分记录(即使比原来的差)

+FRANK 12340000 增加FRANK的得分记录

+LEO 9000000 增加LEO的得分记录

+KAINE 9000000 增加KAINE的得分记录

+GRACE 8000000 增加GRACE的得分记录

+WALT 9000000 增加WALT的得分记录

+SANDY 8000000 增加SANDY的得分记录

+MICK 9000000 增加MICK的得分记录

+JACK 7320000 增加JACK的得分记录

?2 眼下有记录的玩家总数为12,因此应输出第2名到第11名。

?5 输出第5名到第13名。

?KAINE 输出KAINE的排名


Sample Output

2

CATHY TOM ADAM BOB

CATHY LEO KAINE WALT MICK GRACE SANDY JACK TOM BOB

WALT MICK GRACE SANDY JACK TOM BOB ADAM DAM

【分析】我就不吐槽HN抄袭浙江的题目了。。这道题的坑爹之处是字符串的处理。怎样推断一个字符串是否出现?哈希本来是个好选择,可是我生怕25万的数据会被卡,仅仅好硬生生地开了一棵字母树。。

为了巩固splay,全是手码的。于是乎调了半天,囧rz。

说一下怎样查询。他要找排名从K開始的10个人,我就设L=K,R=K+9。那么我们仅仅需在正常的查询(可參见之前的程序)里把一个固定的值改成一个范围~~

还有,開始我一直T,后来一气之下。在询问时也找了个点splay一下。然后瞬秒出解。没事多转转~~

【AC代码】

  1. /**************************************************************
  2. Problem: 1862
  3. User: jiangshibiao
  4. Language: C++
  5. Result: Accepted
  6. Time:1148 ms
  7. Memory:50828 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstring>
  12. #define N 300005
  13. using namespace std;
  14. int son[N][3],Num[N][3],f[N],a[N],b[N],trie[N][27],L[N],score[N],ans[N];
  15. char Str[N][12],opt[12];
  16. int k,i,num,add,now,flag,tree,root,node,left,right,tot,Q,l,n,j,PRE;
  17. void Rotate(int x,int w)
  18. {
  19. int y=f[x],z=f[y];
  20. son[y][3-w]=son[x][w];
  21. if (son[x][w]) f[son[x][w]]=y;
  22. f[x]=z;
  23. Num[y][3-w]=Num[x][w];
  24. Num[x][w]+=Num[y][w]+1;
  25. if (z)
  26. if (son[z][1]==y) son[z][1]=x;else son[z][2]=x;
  27. f[y]=x;son[x][w]=y;
  28. }
  29. inline void splay(int x)
  30. {
  31. int y;
  32. while (f[x])
  33. {
  34. y=f[x];
  35. if (!f[y])
  36. {
  37. if (x==son[y][1]) Rotate(x,2);else Rotate(x,1);continue;
  38. }
  39. if (y==son[f[y]][1])
  40. {
  41. if (x==son[y][1]) Rotate(y,2),Rotate(x,2);
  42. else Rotate(x,1),Rotate(x,2);
  43. }
  44. else
  45. {
  46. if (x==son[y][2]) Rotate(y,1),Rotate(x,1);
  47. else Rotate(x,2),Rotate(x,1);
  48. }
  49. }
  50. root=x;
  51. }
  52. inline void insert(int x,int num,int add)
  53. {
  54. if (!x)
  55. {
  56. root=++node;
  57. a[node]=add;
  58. b[node]=num;
  59. return;
  60. }
  61. if (add<a[x]||add==a[x]&&num>b[x])
  62. {
  63. if (!son[x][1]) son[x][1]=++node,a[node]=add,b[node]=num,f[node]=x;
  64. else insert(son[x][1],num,add);
  65. Num[x][1]++;
  66. }
  67. else
  68. {
  69. if (!son[x][2]) son[x][2]=++node,a[node]=add,b[node]=num,f[node]=x;
  70. else insert(son[x][2],num,add);
  71. Num[x][2]++;
  72. }
  73. }
  74. inline void del(int x,int num,int add)
  75. {
  76. if (!x) return;
  77. if (add==a[x]&&num==b[x])
  78. {
  79. splay(x);
  80. int find=son[x][1],temp=son[x][2];
  81. if (!find&&!temp){root=0;return;}
  82. if (!find) {root=son[x][2];f[son[x][2]]=0;return;}
  83. if (!temp) {root=son[x][1];f[son[x][1]]=0;return;}
  84. while (son[find][2]) find=son[find][2];
  85. f[son[x][1]]=0;splay(find);Num[find][2]+=Num[temp][1]+Num[temp][2]+1;
  86. son[find][2]=temp;
  87. f[temp]=find;root=find;
  88. return;
  89. }
  90. if (add<a[x]||add==a[x]&&num>b[x]) del(son[x][1],num,add);
  91. else del(son[x][2],num,add);
  92. }
  93. int walk(int k,int p)
  94. {
  95. if (p==l) {tree=k;return L[k]?L[k]:L[k]=i;}
  96. if (trie[k][opt[p]-65]) return walk(trie[k][opt[p]-65],p+1);
  97. trie[k][opt[p]-65]=++tot;flag=0;
  98. return walk(tot,p+1);
  99. }
  100. int Kth(int x,int now)
  101. {
  102. if (!x) return 0;
  103. if (add==a[x]&&num==b[x])
  104. {
  105. PRE=x;
  106. return now+1+Num[x][2];
  107. }
  108. if (add<a[x]||add==a[x]&&num>b[x]) return Kth(son[x][1],now+Num[x][2]+1);
  109. return Kth(son[x][2],now);
  110. }
  111. void Ask(int x,int now)
  112. {
  113. if (!x) return;
  114. int temp=Num[x][2]+now;
  115. if (temp>=left) Ask(son[x][2],now);
  116. if (temp+1>=left&&temp+1<=right)
  117. {
  118. ans[++n]=b[x];
  119. PRE=x;
  120. }
  121. if (temp+1<right) Ask(son[x][1],temp+1);
  122. }
  123. void P(int k)
  124. {
  125. for (int i=1;i<strlen(Str[k]);i++) putchar(Str[k][i]);
  126. }
  127. int main()
  128. {
  129. scanf("%d",&Q);tot=1;
  130. for (i=1;i<=Q;i++)
  131. {
  132. scanf("%s",opt);
  133. l=strlen(opt);
  134. if (opt[0]=='+')
  135. {
  136. scanf("%d",&k);
  137. flag=1;now=walk(1,1);
  138. if (flag)
  139. {
  140. del(root,now,score[now]);L[tree]=now=i;
  141. insert(root,now,k);splay(node);
  142. }
  143. else insert(root,now,k),splay(node);
  144. memcpy(Str[i],opt,sizeof(opt));
  145. score[now]=k;
  146. }
  147. else if (opt[0]=='?'&&opt[1]>='0'&&opt[1]<='9')
  148. {
  149. k=0;n=0;
  150. for (j=1;j<l;j++) k=k*10+opt[j]-48;
  151. left=k;right=k+9;
  152. Ask(root,0);
  153. for (j=1;j<n;j++) P(ans[j]),printf(" ");
  154. P(ans[n]);printf("\n");splay(PRE);
  155. }
  156. else
  157. {
  158. num=walk(1,1);add=score[num];
  159. printf("%d\n",Kth(root,0));splay(PRE);
  160. }
  161. }
  162. return 0;
  163. }

【BZOJ1503】

1503: [NOI2004]郁闷的出纳员

Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 5542  Solved: 1968

Description

OIER公司是一家大型专业化软件公司。有着数以万计的员工。

作为一名出纳员。我的任务之中的一个便是统计每位员工的工资。这本来是一份不错的工作,可是令人郁闷的是,我们的老板重复无常,常常调整员工的工资。假设他心情好,就可能把每位员工的工资加上一个同样的量。

反之,假设心情不好。就可能把他们的工资扣除一个同样的量。我真不知道除了调工资他还做什么其他事情。

工资的频繁调整非常让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立马气愤地离开公司。而且再也不会回来了。

每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工。我就得为他新建一个工资档案。

老板常常到我这边来询问工资情况,他并不问详细某位员工的工资情况。而是问如今工资第k多的员工拿多少工资。每当这时,我就不得不正确数万个员工进行一次漫长的排序。然后告诉他答案。好了。如今你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是非常困难吧?

Input

Output

输出文件的行数为F命令的条数加一。对于每条F命令,你的程序要输出一行,仅包括一个整数。为当前工资第k多的员工所拿的工资数,假设k大于眼下员工的数目,则输出-1。输出文件的最后一行包括一个整数,为离开公司的员工的总数。

Sample Input

9 10

I 60

I 70

S 50

F 2

I 30

S 15

A 5

F 1

F 2


Sample Output

10

20

-1

2


HINT

I命令的条数不超过100000 A命令和S命令的总条数不超过100 F命令的条数不超过100000 每次工资调整的调整量不超过1000 新员工的工资不超过100000

【分析】这道题说起来也是辛酸的历史。

首先谈谈怎样处理添加和降低工资的问题。

我傻叉地开了一个f数组。每次推断一个splay中的结点时。他的实际权值是a[x]+f[q]-f[b[x]-1]。当中a[x]是刚进来的工资。q是如今这个询问,b[x]是x刚进来的时候所在的询问。(有点类似于前缀和的思想)后来网上看了一下,能够直接开一个数组记录~~~

再说明一下怎样删除。(真是爽!

)如果要删除<K的全部结点。我就先插入一个k-1的权值。然后把它旋转到根节点。

如今。把根节点左边的东东全都咔嚓掉。做完后别忘了删除。

【代码】

  1. /**************************************************************
  2. Problem: 1503
  3. User: jiangshibiao
  4. Language: C++
  5. Result: Accepted
  6. Time:1372 ms
  7. Memory:16040 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #define N 300005
  12. using namespace std;
  13. int son[N][3],num[N][3],f[N],a[N],b[N],T[N];
  14. char Str[N][12],opt[12],s[5];
  15. int k,i,root,node,P,Min,q,Q,l,n,j,PRE,away;
  16. void Rotate(int x,int w)
  17. {
  18. int y=f[x],z=f[y];
  19. son[y][3-w]=son[x][w];
  20. if (son[x][w]) f[son[x][w]]=y;
  21. f[x]=z;
  22. num[y][3-w]=num[x][w];
  23. num[x][w]+=num[y][w]+1;
  24. if (z)
  25. if (son[z][1]==y) son[z][1]=x;else son[z][2]=x;
  26. f[y]=x;son[x][w]=y;
  27. }
  28. void splay(int x)
  29. {
  30. while (f[x])
  31. {
  32. int y=f[x],z=f[y];
  33. if (!z)
  34. {
  35. if (son[y][1]==x) Rotate(x,2);else Rotate(x,1);
  36. continue;
  37. }
  38. if (son[z][1]==y)
  39. {
  40. if (son[y][1]==x) Rotate(y,2),Rotate(x,2);
  41. else Rotate(x,1),Rotate(x,2);
  42. }
  43. else
  44. {
  45. if (son[y][2]==x) Rotate(y,1),Rotate(x,1);
  46. else Rotate(x,2),Rotate(x,1);
  47. }
  48. }
  49. root=x;
  50. }
  51. void insert(int x)
  52. {
  53. if (!x){a[++node]=P;b[node]=q;return;}
  54. if (P<a[x]+T[q]-T[b[x]-1])
  55. {
  56. if (son[x][1]) num[x][1]++,insert(son[x][1]);
  57. else son[x][1]=++node,a[node]=P,b[node]=q,f[node]=x;
  58. }
  59. else
  60. {
  61. if (son[x][2]) num[x][2]++,insert(son[x][2]);
  62. else son[x][2]=++node,a[node]=P,b[node]=q,f[node]=x;
  63. }
  64. }
  65. inline void del(int x)
  66. {
  67. int find=son[x][1],temp=son[x][2];
  68. if (!find&&!temp){root=0;return;}
  69. if (!find) {root=son[x][2];f[son[x][2]]=0;return;}
  70. if (!temp) {root=son[x][1];f[son[x][1]]=0;return;}
  71. while (son[find][2]) find=son[find][2];
  72. f[son[x][1]]=0;splay(find);
  73. num[find][2]+=num[root][2];
  74. son[find][2]=temp;f[temp]=find;root=find;
  75. }
  76. int Ask(int x,int now)
  77. {
  78. int temp=num[x][2]+now;
  79. if (temp+1==P){PRE=x;return a[x]+T[q]-T[b[x]-1];}
  80. if (temp>=P) return Ask(son[x][2],now);
  81. else return Ask(son[x][1],temp+1);
  82. }
  83. int main()
  84. {
  85. scanf("%d%d",&Q,&Min);
  86. for (q=1;q<=Q;q++)
  87. {
  88. scanf("%s%d",s,&P);T[q]=T[q-1];
  89. if (s[0]=='I')
  90. {
  91. if (P<Min) continue;
  92. insert(root);splay(node);
  93. }
  94. if (s[0]=='A') T[q]+=P;
  95. if (s[0]=='S')
  96. {
  97. T[q]-=P;P=Min-1;
  98. insert(root);splay(node);
  99. son[root][1]=f[son[root][1]]=0;
  100. away+=num[root][1];num[root][1]=0;
  101. del(root);
  102. }
  103. if (s[0]=='F')
  104. {
  105. if (num[root][1]+num[root][2]+1<P||!root) {printf("-1\n");continue;}
  106. printf("%d\n",Ask(root,0));splay(PRE);
  107. }
  108. }
  109. printf("%d",away);
  110. return 0;
  111. }

splay专题复习——bzoj 3224 &amp; 1862 &amp; 1503 题解的更多相关文章

  1. splay专题复习——bzoj 3224 & 1862 & 1503 题解

    [前言]快要省选二试了.上次去被虐出翔了~~这次即便是打酱油.也要打出风採! 于是暂停新东西的学习,然后開始复习曾经的知识.为骗分做准备.PS:区间翻转的临时跳过,就算学了也来不及巩固了. [BZOJ ...

  2. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  3. BZOJ 1003 物流运输 题解 【SPFA+DP】

    BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...

  4. BZOJ 1191 超级英雄 Hero 题解

    BZOJ 1191 超级英雄 Hero 题解 Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金 ...

  5. BZOJ 3224 普通平衡树(Treap模板题)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14301  Solved: 6208 [Submit][ ...

  6. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

  7. 状压dp专题复习

    状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...

  8. BZOJ 3224 - 普通平衡树 - [Treap][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  9. bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...

随机推荐

  1. HTML form without CSRF protection,HTML表单没有CSRF保护

    HTML form without CSRF protection =HTML表单没有CSRF保护 CSRF是伪造客户端请求的一种攻击,CSRF的英文全称是Cross Site Request For ...

  2. Java学习4_一些基础4_输入输出_16.5.7

    读取输入: 想从控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联. Scanner in=new Scanner(System.in); String na ...

  3. CLISTCTRL 获取点击列

    CListCtrl中的HitTest.SubItemHitTest的用法 2HitTest:得到当前鼠标位置的Item 其实关键是要有ScreenToClient这个函数的使用,我先前没有用这个函数, ...

  4. 计算机网络(四)--全世界最好的TCP基础知识讲解

    TCP传输的数据单元是报文段,报文段分为首部.数据两部分 TCP首部 首部的前20字节是固定长度,后面的4n字节根据需要增加的选项 字段解释:图中标示单位为bit,不是byte 1.源端口.目的端口: ...

  5. .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类

    引言 由公司需要使用dapper  同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions  并配套 生成实体类小工具的方 ...

  6. 团队一致性的PHP开发环境之Vagrant

    Vagrant 简介 Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 它的主要意义是让所有开发人员都使用和线上服务器一样的环境,本质上和你新建一个虚拟机 安装 # https: ...

  7. buf.readUInt8()

    buf.readUInt8(offset[, noAssert]) offset {Number} 0 <= offset <= buf.length - 1 noAssert {Bool ...

  8. python3连接mysql 稍微进阶 + 日期处理

    1.踩了个操作中文的坑,结果发现之前的文章中有强调了,在连接处加:charset="utf8" conn = pymysql.connect(host = '127.0.0.1', ...

  9. vim基础(一)

    今天看了下兄弟连的VIM讲解,又学了几个新命令,记录一下. 插入与删除 插入 首先还是插入,以前只知道i.今天发现原来还有a\A\i\I\o\O,下面具体说一下: 命令 含义 a 在光标后插入 A 在 ...

  10. sprintf用法

    函数简介 函数功能:把格式化的数据写入某个字符串 头文件:stdio.h 函数原型:int sprintf( char *buffer, const char *format [, argument] ...