题意:有1到n的数组,每次删除第k小的值,并求和

题解:splay基本操作,删除+合并

坑点:由于不会c++指针操作,sb的只删除了头指针导致一直mle

#include<bits/stdc++.h>
#include<ext/rope>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std;
using namespace __gnu_cxx; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; struct Node{
Node* ch[];
int v;
int s;
int cmp(int x)const{
int d = x - ch[]->s;
if(d==)return -;
return d<= ? :;
}
void maintain()
{
s = + ch[]->s + ch[]->s;
}
};
Node* null;
void Rotate(Node* &o,int d)
{
Node* k = o->ch[d^];
o->ch[d^] = k->ch[d];
k->ch[d] = o;
o->maintain();k->maintain();
o = k;
}
void splay(Node* &o,int k)
{
int d = o->cmp(k);
if(d==)k -= o->ch[]->s + ;//利用二叉树性质
if(d!=-)
{
Node* p = o->ch[d];
int d2 = p->cmp(k);
int k2 = (d2== ? k:k-p->ch[]->s-);
if(d2!=-)
{
splay(p->ch[d2],k2);
if(d==d2)Rotate(o,d^);
else Rotate(o->ch[d],d);
}
Rotate(o,d^);
}
}
Node* Merge(Node* left,Node* right)
{
splay(left,left->s);//把排名最大的数splay到根
left->ch[] = right;
left->maintain();
return left;
}
void split(Node* o,int k,Node* &left,Node* &right)
{
splay(o,k);//把排名为k的节点splay到根,右侧子树所有节点排名比k大,左侧小
right = o->ch[];
o->ch[] = null;
left = o;
left->maintain();
}
Node *root;
void init(int sz)
{
null=new Node;
null->s=;
root=new Node;
root->v=;
root->ch[]=root->ch[]=null;
root->maintain();
Node* p;
for(int i=;i<=sz;i++)
{
p=new Node;
p->v=i;p->s=;
p->ch[]=root,p->ch[]=null;
root=p;
root->maintain();
}
}
void deletetree(Node* &o)
{
if(o!=null)
{
deletetree(o->ch[]);
deletetree(o->ch[]);
delete o;
}
}
int main()
{
int t,cnt=;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
init(n+);
ll ans=;
while(m--)
{
int a;
scanf("%d",&a);
Node *o,*left,*mid,*right;
split(root,a,left,o);
split(o,,mid,right);
ans+=mid->v-;
root = Merge(Merge(left,right),mid);
}
printf("Case %d: %lld\n",++cnt,ans);
deletetree(root);
delete null;
}
return ;
}
/************ ************/

最新文章

  1. Paypal支付接口
  2. IO流04--毕向东JAVA基础教程视频学习笔记
  3. HackerRank &quot;Vertical Rooks&quot;
  4. Windows消息初探(1)
  5. Java基础:三步学会Java Socket编程
  6. BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)
  7. 构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)
  8. 来晚了--SALTSTACK要弄起
  9. [区块链] 拜占庭将军问题 [BFT]
  10. Linux 下操作Mysql指令的总结 远程连接的设置
  11. Python开发【第一篇】基础题目一
  12. C# 按不同的字节编码,通过字节数去截取字符串
  13. ES6 中 Promise
  14. vue组件自定义属性命名
  15. Go语言复制文件
  16. Map集合——双列集合
  17. linux:根据名称杀死进程
  18. Tomcat 基本配置
  19. C#中关于增强类功能的几种方式
  20. binutils工具集之---addr2line

热门文章

  1. PHP查看目录下的所有文件
  2. Js用户引导插件bootstrap-tour
  3. vue.js 拦截器
  4. app开发公司排名哪家强?看App Annie给出的答案
  5. tfboys——tensorflow模块学习(四)
  6. boost之操作系统相关
  7. LeetCode:对角线遍历【498】
  8. 17 南宁区域赛 F - The Chosen One 【规律】
  9. 【Head First Servlets and JSP】笔记12:URL重写
  10. 【鸟哥的Linux私房菜】笔记1