传送门

题目大意

有一个0~n-1的序列,有m次操作,操作包含三个元素:pl,len,ti,表示这个操作进行ti次,每次将从pl+1开始的len个元素移到序列头部。
分析

看到题不难想到使用平衡树将需移动部分切出来挂到顶部。本题我使用fhqtreap来实现,但需要注意的是对于挪动部分使用的split不再以节点值为关键字切割而改用它在树中的排名作为关键字。具体实现详见代码。注意输出格式!!!!!!!!

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int root,son[][],a[],rd[],siz[],cnt,n;
inline void up(int x){siz[x]=siz[son[x][]]+siz[son[x][]]+;}
inline int bnode(int x){
siz[++cnt]=;
a[cnt]=x;
rd[cnt]=rand();
return cnt;
}
inline int gk(int rt,int k){
while(){
if(k<=siz[son[rt][]])rt=son[rt][];
else if(k==siz[son[rt][]]+)return rt;
else k-=siz[son[rt][]]+,rt=son[rt][];
}
}
inline void spt1(int rt,int k,int &x,int &y){
if(!rt)x=y=;
else {
if(a[rt]<=k)x=rt,spt1(son[rt][],k,son[rt][],y);
else y=rt,spt1(son[rt][],k,x,son[rt][]);
up(rt);
}
}
inline int mer(int x,int y){
if(!x||!y)return x+y;
if(rd[x]<rd[y]){
son[x][]=mer(son[x][],y);
up(x);
return x;
}else {
son[y][]=mer(x,son[y][]);
up(y);
return y;
}
}
inline void spt(int sum,int rt,int k,int &x,int &y){
if(!rt)x=y=;
else {
if(sum+siz[son[rt][]]+<=k){
x=rt,spt(sum+siz[son[rt][]]+,
son[rt][],k,son[rt][],y);
}else y=rt,spt(sum,son[rt][],k,x,son[rt][]);
up(rt);
}
}
inline void init(){
root=cnt=;
memset(rd,,sizeof(rd));
memset(a,,sizeof(a));
memset(son,,sizeof(son));
memset(siz,,sizeof(siz));
}
inline long long getans(int n){
long long ans=;
int i;
for(i=;i<=n;i+=)
ans+=(long long)a[gk(root,i)];
return ans;
}
inline void work(int _){
int n,m,i,j,x,y,z,w,pl,len,ti;
scanf("%d%d",&n,&m);
for(i=;i<n;i++){
spt1(root,i,x,y);
root=mer(mer(x,bnode(i)),y);
}
for(i=;i<=m;i++){
scanf("%d%d%d",&pl,&len,&ti);
for(j=;j<=ti;j++){
spt(,root,pl,x,y),spt(,y,len,z,w);
root=mer(z,mer(x,w));
}
}
printf("%lld\n",getans(n));
}
int main(){
srand(time()+);
int t;
scanf("%d",&t);
for(int _=;_<=t;_++){
printf("Case %d:\n",_);
init();
work(_);
if(_!=t)puts("");
}
return ;
}

Edison UVALive3488的更多相关文章

  1. 什么是英特尔® Edison 模块?

    英特尔® Edison 模块 是一种 SD 卡大小的微型计算芯片,专为构建物联网 (IoT) 和可穿戴计算产品而设计. Edison 模块内含一个高速的双核处理单元.集成 Wi-Fi*.蓝牙* 低能耗 ...

  2. [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信

    一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...

  3. [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

    一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...

  4. [Intel Edison开发板] 03、Edison开发IDE入门及跑官方提供的DEMO

    一.启动Eclipse爱迪生开发板IDE eclipse开发环境在iss-iot-win_03-14-16中,但是一定每次都是点bat脚本启动,否则就会少东西(windows->preferen ...

  5. [Intel Edison开发板] 02、Edison开发板入门

    一.前言 Start from the link: 开始学习的链接 上面链接是官网的教程,按照教程可以开发板入门: 其中第一步是了解开发板,涉及到如何组装.如何连线.一些主要的接口简单介绍等信息: 第 ...

  6. Intel Edison 参考链接2

    Edison的breakout板子的引脚: http://iotdk.intel.com/docs/master/mraa/java/edison.html Edison的引脚 http://www. ...

  7. Intel Edison

    起步: https://software.intel.com/zh-cn/node/628224 刷机: https://software.intel.com/zh-cn/flashing-firmw ...

  8. Intel Edison的那些事:修改Edison的HTTP服务的页面

    Intel Edison配置好之后,按住PWR键2-7秒(4秒恰到好处),就可以进入AP热点模式(此时,Arduino扩展板上的灯不停闪烁),可以将笔记本接入Edison的热点,然后在浏览器中访问“h ...

  9. Edison与Arduino通过USB对接通信

    虽然Edison本身就装在一块Arduino扩展板上,但当要接的传感器太多了的时候一个扩展板也不够用了.因此需要再用一Arduino板扩展功能.而两者需要通信才能达到一个整体的效果,因此这里介绍如何用 ...

随机推荐

  1. Azure新建的CentOS设置root账户的密码

    前言:Azure在新建VM的时候的账户使用的是自定义的用户名和密码或者自定义的用户名使用公钥 1.使用自定义的用户名登录到服务器. 2.设置root的密码: sudo passwd root 3.按照 ...

  2. 掌握sudo的使用

    “sudo”是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他 特许用户才能完成的任务,比如:运行一些像mount,h ...

  3. Scala 面向接口编程

    1.如果要实现一个接口,前边没有extends关键字就可以使用extends,如果有要使用with关键字 2.Scala 中的接口支持多种继承,类或者抽象类不支持多种继承 3.抽象属性:未被实例化的属 ...

  4. 类和对象(9)—— new和delete

    对象动态建立和释放 new 和delete 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C ...

  5. Linux动态gif图的录制

    Linux动态gif图的录制 Linux动态gif图的录制 byzanz的安装与使用 recordmydesktop再convert成gif 参考资料 前几天写了两篇博客vim的配置和Vim的自动代码 ...

  6. [转]Cache-Control max-age=0

    Cache-Control max-age=0   Cache-Control  no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验.这对于需要确认认证应用很有用(可以和 ...

  7. BZOJ3624:[APIO2008]免费道路

    浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...

  8. Java基础--注解Annotation

    Annotation是给类,方法或域上加的一种特殊的标记,可以通过反射取到注解的类型和值,从而完成某种特定的操作. 定义注解需要使用元注解,元注解有@Retention和@Target //@Rete ...

  9. Day2-Python基础2---字符编码与转码

    详细内容http://www.cnblogs.com/yuanchenqi/articles/5956943.html 一.编码介绍: 1.基本概念: 在python 2中默认编码是 ASCII,而在 ...

  10. HTTP-Runoob:HTTP简介

    ylbtech-HTTP-Runoob:HTTP简介 1.返回顶部 1. HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网 ...