【bzoj2141】排队 [国家集训队2011]排队(魏铭) 树套树 线段树套替罪羊树
这个题就是动态偏序对,每次操作做两个删除两个插入就好了。
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- #define MAXN 100010
- using namespace std;
- typedef long long LL;
- typedef double D;
- const D a=0.756;
- LL ans;
- struct ScapeGoat_Tree
- {
- ScapeGoat_Tree *ch[];
- int key,size,cover,ex;
- bool bad()
- {
- return cover*a+<ch[]->cover||cover*a+<ch[]->cover;
- }
- void pushup()
- {
- size=ch[]->size+ch[]->size+ex;
- cover=ch[]->cover+ch[]->cover+;
- }
- }*null,*stack[(MAXN<<)+],pool[(MAXN<<)+],*lst[(MAXN<<)+];
- int top,len;
- inline void Init()
- {
- null=pool;
- null->ch[]=null->ch[]=null;
- null->key=null->size=null->cover=null->ex=;
- for(int i=;i<(MAXN<<);i++)stack[++top]=pool+i;
- }
- inline ScapeGoat_Tree *New(int key)
- {
- ScapeGoat_Tree *p=stack[top--];
- p->ch[]=p->ch[]=null;
- p->key=key;
- p->size=p->ex=p->cover=;
- return p;
- }
- struct Tree
- {
- Tree *ch[];
- int mid,l,r;
- ScapeGoat_Tree *root;
- Tree(){ch[]=ch[]=NULL;mid=l=r=;root=null;}
- void* operator new(size_t size);
- }*root,*C,*mempool;
- void* Tree :: operator new(size_t size)
- {
- if(C==mempool)
- {
- C=new Tree[(<<)+];
- mempool=C+(<<)+;
- }
- C->root=null;
- return C++;
- }
- void travel(ScapeGoat_Tree *p)
- {
- if(p==null)return;
- travel(p->ch[]);
- if(p->ex)lst[++len]=p;
- else stack[++top]=p;
- travel(p->ch[]);
- }
- ScapeGoat_Tree *divide(int l,int r)
- {
- if(l>r)return null;
- int mid=(l+r)>>;
- lst[mid]->ch[]=divide(l,mid-);
- lst[mid]->ch[]=divide(mid+,r);
- lst[mid]->pushup();
- return lst[mid];
- }
- inline void rebuild(ScapeGoat_Tree *&p)
- {
- len=;
- travel(p);
- p=divide(,len);
- }
- ScapeGoat_Tree **insert(ScapeGoat_Tree *&p,int key)
- {
- if(p==null )
- {
- p=New(key);
- return &null;
- }
- p->size++;
- p->cover++;
- ScapeGoat_Tree **ret=insert(p->ch[p->key<=key],key);
- if(p->bad())ret=&p;
- return ret;
- }
- inline void Insert(ScapeGoat_Tree *&Root,int key)
- {
- ScapeGoat_Tree **p=insert(Root,key);
- if(*p!=null )rebuild(*p);
- }
- inline int Rank_Max(ScapeGoat_Tree *Root,int key)
- {
- ScapeGoat_Tree *now=Root;
- int ret=;
- while(now!=null )
- if(now->key<=key)
- now=now->ch[];
- else
- ret+=now->ch[]->size+now->ex,now=now->ch[];
- return ret;
- }
- inline int Rank_Min(ScapeGoat_Tree *Root,int key)
- {
- ScapeGoat_Tree *now=Root;
- int ret=;
- while(now!=null )
- if(now->key>=key)
- now=now->ch[];
- else
- ret+=now->ch[]->size+now->ex,now=now->ch[];
- return ret;
- }
- void del(ScapeGoat_Tree *p,int k)
- {
- p->size--;
- if(p->ex&&p->ch[]->size+==k)
- {
- p->ex=;
- return;
- }
- if(p->ch[]->size>=k) del(p->ch[],k);
- else del(p->ch[],k-p->ch[]->size-p->ex);
- }
- inline void Del(ScapeGoat_Tree *&Root,int key)
- {
- del(Root,Rank_Min(Root,key)+);
- if(Root->size<Root->cover*a)rebuild(Root);
- }
- int n,m,pos[MAXN];
- void build(Tree *p)
- {
- p->mid=(p->l+p->r)>>;
- if(p->l==p->r)return;
- p->ch[]=new Tree;
- p->ch[]->l=p->l;
- p->ch[]->r=p->mid;
- p->ch[]=new Tree;
- p->ch[]->l=p->mid+;
- p->ch[]->r=p->r;
- build(p->ch[]);
- build(p->ch[]);
- }
- void Ins(Tree *p,int key,int aim)
- {
- Insert(p->root,key);
- if(p->l==p->r)return;
- Ins(p->ch[p->mid<aim],key,aim);
- }
- int query_Max(int l,int r,int key,Tree *p)
- {
- if(l<=p->l&&p->r<=r)
- return Rank_Max(p->root,key);
- int tmp=;
- if(l<=p->mid)tmp+=query_Max(l,r,key,p->ch[]);
- if(p->mid<r)tmp+=query_Max(l,r,key,p->ch[]);
- return tmp;
- }
- int query_Min(int l,int r,int key,Tree *p)
- {
- if(l<=p->l&&p->r<=r)
- return Rank_Min(p->root,key);
- int tmp=;
- if(l<=p->mid)tmp+=query_Min(l,r,key,p->ch[]);
- if(p->mid<r)tmp+=query_Min(l,r,key,p->ch[]);
- return tmp;
- }
- void Delete(Tree *p,int key,int aim)
- {
- Del(p->root,key);
- if(p->l==p->r)return;
- Delete(p->ch[p->mid<aim],key,aim);
- }
- int main()
- {
- //freopen("nt2011_queue.in","r",stdin);
- //freopen("nt2011_queue.out","w",stdout);
- Init();
- scanf("%d",&n);
- root=new Tree;
- root->l=;
- root->r=n;
- build(root);
- for(int i=;i<=n;i++)
- {
- int x;
- scanf("%d",&x);
- pos[i]=x;
- Ins(root,x,i);
- if(i!=)ans+=query_Max(,i-,x,root);
- }
- scanf("%d",&m);
- for(int i=;i<=m;i++)
- {
- printf("%lld\n",ans);
- int x,y;
- scanf("%d%d",&x,&y);
- if(x!=) ans-=query_Max(,x-,pos[x],root);
- if(x!=n) ans-=query_Min(x+,n,pos[x],root);
- Delete(root,pos[x],x);
- if(y!=) ans-=query_Max(,y-,pos[y],root);
- if(y!=n) ans-=query_Min(y+,n,pos[y],root);
- Delete(root,pos[y],y);
- swap(pos[x],pos[y]);
- Ins(root,pos[x],x);
- if(x!=) ans+=query_Max(,x-,pos[x],root);
- if(x!=n) ans+=query_Min(x+,n,pos[x],root);
- Ins(root,pos[y],y);
- if(y!=) ans+=query_Max(,y-,pos[y],root);
- if(y!=n) ans+=query_Min(y+,n,pos[y],root);
- }
- printf("%lld\n",ans);
- return ;
- }
【bzoj2141】排队 [国家集训队2011]排队(魏铭) 树套树 线段树套替罪羊树的更多相关文章
- 【bzoj2141】排队 [国家集训队2011]排队(树套树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- COGS1871 [国家集训队2011]排队(魏铭)
bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2141 cogs:http://cogs.pro:8080/cogs/problem/pro ...
- AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
[国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...
- cogs 1901. [国家集训队2011]数颜色
Cogs 1901. [国家集训队2011]数颜色 ★★★ 输入文件:nt2011_color.in 输出文件:nt2011_color.out 简单对比时间限制:0.6 s 内存限制 ...
- BZOJ 2150 cogs 1861 [国家集训队2011]部落战争
题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...
- happiness[国家集训队2011(吴确)]
[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...
- COGS1882 [国家集训队2011]单选错位
★ 输入文件:nt2011_exp.in 输出文件:nt2011_exp.out 简单对比时间限制:1 s 内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...
- 1893. [国家集训队2011]等差子序列(bitset)
★★ 输入文件:nt2011_sequence.in 输出文件:nt2011_sequence.out 简单对比时间限制:0.3 s 内存限制:512 MB [试题来源] 2011中国 ...
- bzoj2144 【国家集训队2011】跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
随机推荐
- scala成长之路(6)函数入门
众所周知,scala作为一门极客型的函数式编程语言,支持的特性包括: 函数拥有“一等公民”身份: 支持匿名函数(函数字面量) 支持高阶函数 支持闭包 部分应用函数 柯里化 首先需要指出,在scala中 ...
- kafka概述
kafka概述 Apache Kafka是一个开源 消息 系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目. Kafka最初是由LinkedIn开发,并于2011年初开源. ...
- ruby中将数字转化为字符串格式时差
工作中有时候会碰到需要把数值展示成比较直观的时间差格式,divmod方法很适合做这个操作. divmod #输出商和余数的数组 60.divmod(50) #=> [1, 10 ...
- Leecode刷题之旅-C语言/python-26.删除数组中的重复项
/* * @lc app=leetcode.cn id=26 lang=c * * [26] 删除排序数组中的重复项 * * https://leetcode-cn.com/problems/remo ...
- 使用source命令解决mysql导入乱码问题
设定编码格式:mysql -u root -p --default-character-set=utf8 use dbname source /root/newsdata.sql
- 标记编码报错ValueError: bad input shape ()
<Python机器学习经典实例>2.9小节中,想自己动手实践汽车特征评估质量,所以需要对数据进行预处理,其中代码有把字符串标记编码为对应的数字,如下代码 input_data = ['vh ...
- 【jQuery】 Ajax
[jQuery] Ajax $.ajax({ type: "Post", // 发包方式 cache: false, // 是否缓存 contentType: "appl ...
- Python初步
准备在工作之余看看Python的东西 收录一些资料 Python初学者(零基础学习Python.Python入门)常见问题:书籍推荐.资料.社区 http://blog.csdn.net/xiaowa ...
- Leetcode代码补全——二叉树
在刷leetcode的过程中发现,在原网页输入答案是不需要自己构筑树和链表的,虽然便于直接思考算法,但是久而久之类似过于依赖编辑器,反而不知道如何创建树和链表,因此总结了该网页省略的部分,以其中题为例 ...
- 第二十一篇 json,picklz,xml模块
Json模块 Json模块比较简单,仅有四个方法dumps()和loads()方法,dump()和load()方法,但是却非常的常用,实用性极强. 如果要在不同的编程语言之间传递对象,就必须把对象序列 ...