描述

有N张卡片,编号从0到n-1, 刚开始从0到n-1按顺序排好。

现有一个操作, 对于p、 l,表示从第p张卡片之后的l张卡片拿到 最前面。

例如n=7的时候, 刚开始卡片序列为0 1 2 3 4 5 6

对于操作p=2 l=3执行一次之后序列变为

2 3 4 0 1 5 6

求出所有操作之后, 奇数位上编号的和

输入

第一行两个整数 N、 M,表示有 N 张卡片,接下来 M 个操作。

接下来 M 行, 每行有三个整数 p、 l、 r, 表示重复 r 次 p、 l 操作。

输出

一个整数表示答案。

样例输入

10 3

5 3 1

2 4 1

7 2 2

样例输出

23

提示

对于 30%的数据, 1<=N,M<=1000。

对于 100%的数据, 1<=N<=1000000,1<=M<=5000,0<=p<=p+l< N

看到这个把一堆数放到队首的操作就想到了非旋treap。

要注意的是对于每次修改要利用题目给出的信息转化出新的询问区间。

还要注意答案开long long。

代码:

#include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;
typedef pair<int,int> res;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,m,cnt=0;
ll ans=0;
struct Treap{
	int rt,val[N],rd[N],son[N][2],siz[N],tot;
	inline int newnode(int v){val[++tot]=v,rd[tot]=rand(),siz[tot]=1;return tot;}
	inline void pushup(int p){siz[p]=siz[son[p][0]]+siz[son[p][1]]+1;}
	inline int merge(int a,int b){
		if(!a||!b)return a+b;
		if(rd[a]<rd[b])return son[a][1]=merge(son[a][1],b),pushup(a),a;
		return son[b][0]=merge(a,son[b][0]),pushup(b),b;
	}
	inline res split(int p,int k){
		if(!p)return make_pair(0,0);
		res tmp,ans;
		if(siz[son[p][0]]>=k){
			tmp=split(son[p][0],k),son[p][0]=tmp.second,pushup(p);
			ans.first=tmp.first,ans.second=p;
			return ans;
		}
		tmp=split(son[p][1],k-siz[son[p][0]]-1),son[p][1]=tmp.first,pushup(p);
		ans.first=p,ans.second=tmp.second;
		return ans;
	}
	inline void dfs(int p){
		if(!p)return;
		dfs(son[p][0]);
		if((++cnt)&1)ans+=val[p];
		dfs(son[p][1]);
	}
	inline int build(int l,int r){
		if(l>r)return 0;
		int mid=l+r>>1,p=newnode(mid);
		son[p][0]=build(l,mid-1),son[p][1]=build(mid+1,r);
		pushup(p);
		return p;
	}
	inline void solve(){
		srand(time(NULL));
		n=read(),m=read();
		rt=build(0,n-1);
		while(m--){
			int pos=read(),l=read(),r=read(),L,R;
			R=pos+l-1,L=(R+1-l*r)%(R+1);
			if(L<0)L+=R+1;
			if(L>R)continue;
			R-=L-1;
			res x=split(rt,L),y=split(x.second,R);
			rt=merge(y.first,merge(x.first,y.second));
		}
		dfs(rt);
		cout<<ans;
	}
}T;
int main(){
	T.solve();
	return 0;
}

2081.09.22 Kuma(非旋treap)的更多相关文章

  1. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  2. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  3. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  4. 2827: 千山鸟飞绝 非旋treap

    国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离 ...

  5. 2018.08.27 rollcall(非旋treap)

    描述 初始有一个空集,依次插入N个数Ai.有M次询问Bj,表示询问第Bj个数加入集合后的排名为j的数是多少 输入 第一行是两个整数N,M 接下来一行有N个整数,Ai 接下来一行有M个整数Bj,保证数据 ...

  6. 2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)

    传送门 平衡树好题. 我仍然是用的fhqtreap,感觉速度还行. 维护也比线段树splay什么的写起来简单. %%%非旋treap大法好. 代码: #include<bits/stdc++.h ...

  7. 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

  8. 2018.07.24 loj#107. 维护全序集(非旋treap)

    传送门 就是普通平衡树,可以拿来练非旋treap" role="presentation" style="position: relative;"&g ...

  9. 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

随机推荐

  1. angular controller 之间的通信方式

    AngularJS中的controller是个函数,用来向视图的作用域($scope)添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为. 当我们在创建新的控制器时,angularJ ...

  2. Spring boot&Mybatis 启动报错 Failed to auto-configure a DataSource

    *************************** APPLICATION FAILED TO START *************************** Description: Fai ...

  3. 安装设置IIS5.1

    1.防止不停提示无法复制staxmem.dll: esentutl /p %windir%/security/database/secedit.sdb提示数据库损坏,是否恢复,选是,出现以下提示后退出 ...

  4. git-采集编码搜索

    https://github.com/search?utf8=%E2%9C%93&q=%E9%87%87%E9%9B%86%E7%BC%96%E7%A0%81&type= https: ...

  5. UI5-文档-4.36-Device Adaptation

    现在,我们根据运行应用程序的设备配置控件的可见性和属性.通过使用sap.ui.设备API和定义一个设备模型,我们将使应用程序在许多设备上看起来很棒. Preview On phone devices, ...

  6. lftp命令详解

    lftp.sh自动上传脚本: #!/bin/bash echo -e "\nScript start at \033[43;35m `date "+%H:%M:%S"` ...

  7. 关于struts.xml配置文件的说明

    <struts> <!-- action: 对应controller 中的类的 name: 匹配url要访问的类 class:包名+类名 通过反射产生对象 method:指定默认访问 ...

  8. java 解析命令行参数

    下载地址: https://jcenter.bintray.com/org/apache/commons/com.springsource.org.apache.commons.cli/1.2.0/ ...

  9. Hive—学习笔记(一)

    主要内容: 1.Hive的基本工能机制和概念 2.hive的安装和基本使用 3.HQL 4.hive的脚本化运行使用方式 5.hive的基本语法--建表语法 6.hive的基本语法--内部表和外部表. ...

  10. SpringCloud组件和概念介绍1

    一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...