传送门

题目大意

有一个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. 2018-2019-2 20165210《网络对抗技术》Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165210<网络对抗技术>Exp6 信息搜集与漏洞扫描 一.实验目标: 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实验内容: 各种搜索技巧的应用 G ...

  2. Leetcode 974. Subarray Sums Divisible by K

    前缀和(prefix sum/cumulative sum)的应用. 还用了一个知识点: a≡b(mod d) 则 a-b被d整除. 即:a与b对d同余,则a-b被d整除. class Solutio ...

  3. Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

    数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当 ...

  4. 20179203 《Linux内核原理与分析》第十二周作业

    Return-to-libc 攻击实验 一.实验描述 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode.为了阻止这种类 ...

  5. Redis底层探秘(二):链表和跳跃表

    链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内 ...

  6. Vue forms

    Vue forms Vue 的表单. 表单中的数据和是双向绑定的. 你可以使用 v-model 对控件元素进行数据双向绑定. 比较有用的修饰符 .lazy .number .trim

  7. Windbg内核调试之四: Dump文件分析

    Dump 文件分析很大程度上就是分析蓝屏产生的原因.这种系统级的错误算是Windows提示错误中比较严重的一种(更严重的还有启动黑屏等硬件或软件兼容性错误等等).说它是比较严重,是因为毕竟Window ...

  8. 一个Bug 差点让服务器的文件系统崩溃

    昨天,公司的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from the source file or disk. 如果 ...

  9. SpringCloud组件的简单介绍

    springcloud官网springcloud中文网站 最近开始接触springcloud,所以先了解了一下最最基本概念. Spring Cloud ConfigSpring配置管理工具包,让你可以 ...

  10. Jenkins构建触发器定时Poll SCM、Build periodically

    一.时间设置语法 时间设置由5位组成:* * * * * 第一位:表示分钟,取值0-59. 第二位:表示小时,取值0-23. 第三位:表示日期,取值1-31. 第四位:表示月份,取值1-12. 第五位 ...