Queue Sequence HDU - 4441
码力不行啊。。。
错误记录:
171行后面对find2的使用错误,原来写的是p=find2(rt,p1),然后再加上一句能过样例但很假的特判
事实上,现在是要寻找最大的j,使得d2[1..j-1]=p1-1
而find2返回的是最大的j,使得d2[1..j]<=p1,因此要这么用
#pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
namespace S
{
const int N=;
int rand1()
{
static int x=;
return x=(48271LL*x+)%;
}
struct Node
{
Node *ch[],*fa;
int sz,d,r;
int d1,d2;ll sum;
}nds[N];
int gsz(Node *o) {return o?o->sz:;}
int gd1(Node *o) {return o?o->d1:;}
int gd2(Node *o) {return o?o->d2:;}
ll gsum(Node *o) {return o?o->sum:;}
void upd(Node *o)
{
o->sz=gsz(o->ch[])+gsz(o->ch[])+;
o->d1=gd1(o->ch[])+gd1(o->ch[])+(o->d>);
o->d2=gd2(o->ch[])+gd2(o->ch[])+(o->d<);
o->sum=ll(gsum(o->ch[]))+gsum(o->ch[])+o->d;
}
int mem;
Node *getnode()
{
Node *t=nds+(mem++);
t->ch[]=t->ch[]=t->fa=;
t->d1=t->d2=t->d=;t->sz=;t->r=rand1();
return t;
}
Node *merge(Node *a,Node *b)
{
if(!a) return b;
if(!b) return a;
if(a->r<b->r)
{
a->ch[]=merge(a->ch[],b);upd(a);
if(a->ch[]) a->ch[]->fa=a;
return a;
}
else
{
b->ch[]=merge(a,b->ch[]);upd(b);
if(b->ch[]) b->ch[]->fa=b;
return b;
}
}
typedef pair<Node*,Node*> pnn;
pnn split(Node *a,int k)
{
if(!a) return pnn(,);
if(!k) return pnn(,a);
int ls=gsz(a->ch[]);pnn y;
if(k<=ls)
{
//if(a->ch[0]) a->ch[0]->fa=0;
y=split(a->ch[],k);
a->ch[]=y.se;
if(a->ch[]) a->ch[]->fa=a;
upd(a);y.se=a;
}
else
{
//if(a->ch[1]) a->ch[1]->fa=0;
y=split(a->ch[],k-ls-);
a->ch[]=y.fi;
if(a->ch[]) a->ch[]->fa=a;
upd(a);y.fi=a;
}
return y;
}
void insert(Node *&a,int p,int x)
{
pnn t1=split(a,p-);Node *t=getnode();
t->d=x;upd(t);
a=merge(merge(t1.fi,t),t1.se);
}
void remove(Node *&a,int p)
{
pnn t1=split(a,p-),t2=split(t1.se,);
a=merge(t1.fi,t2.se);
}
int find1(Node *&a,int k)
{
pnn t1=split(a,k);int ans=t1.fi->d1;
a=merge(t1.fi,t1.se);
return ans;
}
int find2(Node *a,int k)
{
if(!a) return ;
int ls=gd2(a->ch[]);
if(k<ls) return find2(a->ch[],k);
else if(k<ls+(a->d<)) return gsz(a->ch[]);
else return gsz(a->ch[])++find2(a->ch[],k-ls-(a->d<));
}
int find3(Node *&a,int k)
{
pnn t1=split(a,k);int ans=t1.fi->d2;
a=merge(t1.fi,t1.se);
return ans;
}
ll qsum(Node *&a,int l,int r)
{if(l>r) swap(l,r);
pnn t1=split(a,l-),t2=split(t1.se,r-l+);
ll ans=t2.fi->sum;
a=merge(t1.fi,merge(t2.fi,t2.se));
return ans;
}
Node *rt;
Node *find(Node *a,int k)
{
if(!a) return ;
int ls=gsz(a->ch[]);
if(k<=ls) return find(a->ch[],k);
else if(k<=ls+) return a;
else return find(a->ch[],k-ls-);
}
bool gson(Node *a) {return a==a->fa->ch[];}
int findx(Node *a)
{
int ans=gsz(a->ch[])+;
for(;a!=rt;a=a->fa)
if(gson(a))
ans+=gsz(a->fa->ch[])+;
return ans;
}
}
set<int> s;
char tmp[];
int n;
using S::rt;
S::pnn ttt[];
int main()
{
int p,x,i,p1,TT=;
while(scanf("%d",&n)==)
{
S::mem=;
s.clear();rt=;
for(i=;i<=n;i++) s.insert(i);
++TT;
printf("Case #%d:\n",TT);
for(i=;i<=n;i++)
{
scanf("%s",tmp);
if(tmp[]=='i')
{
scanf("%d",&p);p++;
x=*s.begin();s.erase(x);
S::insert(rt,p,x);ttt[x].fi=S::find(rt,p);
//printf("a%d %d\n",p,x);
//printf("%d\n",S::findx(ttt[x].fi));
p1=S::find1(rt,p);p=S::find2(rt,p1-)+;
S::insert(rt,p,-x);ttt[x].se=S::find(rt,p);
//printf("a%d %d\n",p,-x);
}
else if(tmp[]=='r')
{
scanf("%d",&x);
//printf("b%d ",S::findx(ttt[x].fi));
S::remove(rt,S::findx(ttt[x].fi));
//printf("%d\n",S::findx(ttt[x].se));
S::remove(rt,S::findx(ttt[x].se));
s.insert(x);
}
else
{
scanf("%d",&x);
printf("%lld\n",S::qsum(rt,S::findx(ttt[x].fi),S::findx(ttt[x].se)));
}
}
}
return ;
}
Queue Sequence HDU - 4441的更多相关文章
- HDU 4441 Queue Sequence(优先队列+Treap树)(2012 Asia Tianjin Regional Contest)
Problem Description There's a queue obeying the first in first out rule. Each time you can either pu ...
- Q - Play With Sequence HDU - 3971 线段树 重新排序建树
Q - Play With Sequence HDU - 3971 这个题目是一个线段树,比较特别的线段树,就是c询问一定次数之后重新排序建树来优化减低复杂度. 第一次碰到这种题目有点迷. 这个题目写 ...
- HDU 4441 Queue Sequence(splay)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4441 题意:一个数列,三种操作:(1)插入:找到没在当前数列中的最小的正整数i,将其插在位置p之后,并 ...
- HDU 4441 Queue Sequence
http://acm.hdu.edu.cn/showproblem.php?pid=4441 题意:对于一个序列,每次有三种操作 insert pos 表示在pos插入一个数,这个数是最小的正数 ...
- DNA sequence HDU - 1560
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- (KMP 模板)Number Sequence -- Hdu -- 1711
http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/Other ...
- (模拟)Arithmetic Sequence -- HDU -- 5400
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5400 Time Limit: 4000/2000 MS (Java/Others) Memory ...
- Number Sequence HDU - 5014
There is a special number sequence which has n+1 integers. For each number in sequence, we have two ...
- AC日记——Number Sequence hdu 1711
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- mysql使用“.frm”文件恢复表结构
mysql创建每张表后都会在“mysql安装目录/data/数据库名/”目录下创建一个“表名.frm”文件. 该.frm文件并不能直接打开,但是它可以帮助你恢复你的表结构~~ 具体操作如下: 我现在准 ...
- 在vs2005中添加lib库的方法
方法一:在用到lib的地方加上 //强烈推荐这种方法.#pragma comment(lib,"libname.lib") 方法二: 点击菜单命令 “项目/属性”, ...
- BootStrap-DualListBox怎样改造成为双树
BootStrap-DualListBox能够实现将所选择的列表项显示到右边,未选的列表项显示到左边. 但是左右两边的下拉框中都是单级列表.如果要实现将两边都是树(缩进树),选择某个节点时,其子节点也 ...
- 微信小程序存放视频文件到阿里云用到算法js脚本文件
peterhuang007/weixinFileToaliyun: 微信小程序存放视频文件到阿里云用到算法js脚本文件 https://github.com/peterhuang007/ ...
- gcc 头文件是用户应用程序和函数库之间的桥梁和纽带 功能的真正逻辑实现是以硬件层为基础
gcc GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF) http://gcc.gnu.o ...
- 通达OA二次开发 工作流表单中关联查询另外一个工作流方法(源代码)
一个工作流表单中,怎样方便的查询相关的工作流表单内容.重复打开各个菜单必定须要造成多次点击浪费时间,切换也会带来思路的中断.这里通过js代码的方式把这个问题进行了解决. <style>&l ...
- redis06----消息订阅
使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 r1:>publish news "aaaaaa" "" ...
- spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)
在spring的配置文件增加 <context:component-scan base-package="com.jmu.ccjoin.service"/> <c ...
- 北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?
作者:知乎用户链接:https://www.zhihu.com/question/21092045/answer/17164418来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- java面试题基础
hashMap原理 hashMap是数组+链表的数据结构 每一个数组元素中都是一个链表 通过记录的关键字key.hashCode()%数组的长度 来决定记录在数组中的存储位置 对于数组的同一个存储位置 ...