Edison UVALive3488
题目大意
有一个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的更多相关文章
- 什么是英特尔® Edison 模块?
英特尔® Edison 模块 是一种 SD 卡大小的微型计算芯片,专为构建物联网 (IoT) 和可穿戴计算产品而设计. Edison 模块内含一个高速的双核处理单元.集成 Wi-Fi*.蓝牙* 低能耗 ...
- [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...
- [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建
一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...
- [Intel Edison开发板] 03、Edison开发IDE入门及跑官方提供的DEMO
一.启动Eclipse爱迪生开发板IDE eclipse开发环境在iss-iot-win_03-14-16中,但是一定每次都是点bat脚本启动,否则就会少东西(windows->preferen ...
- [Intel Edison开发板] 02、Edison开发板入门
一.前言 Start from the link: 开始学习的链接 上面链接是官网的教程,按照教程可以开发板入门: 其中第一步是了解开发板,涉及到如何组装.如何连线.一些主要的接口简单介绍等信息: 第 ...
- Intel Edison 参考链接2
Edison的breakout板子的引脚: http://iotdk.intel.com/docs/master/mraa/java/edison.html Edison的引脚 http://www. ...
- Intel Edison
起步: https://software.intel.com/zh-cn/node/628224 刷机: https://software.intel.com/zh-cn/flashing-firmw ...
- Intel Edison的那些事:修改Edison的HTTP服务的页面
Intel Edison配置好之后,按住PWR键2-7秒(4秒恰到好处),就可以进入AP热点模式(此时,Arduino扩展板上的灯不停闪烁),可以将笔记本接入Edison的热点,然后在浏览器中访问“h ...
- Edison与Arduino通过USB对接通信
虽然Edison本身就装在一块Arduino扩展板上,但当要接的传感器太多了的时候一个扩展板也不够用了.因此需要再用一Arduino板扩展功能.而两者需要通信才能达到一个整体的效果,因此这里介绍如何用 ...
随机推荐
- 网络编程基础--协程--greenlet切换---gevent自动识别 IO ---
协程: 1 单线程来实现并发---协程: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 只 ...
- LeetCode Distribute Candies
原题链接在这里:https://leetcode.com/problems/distribute-candies/#/description 题目: Given an integer array wi ...
- 第一章计算机网络和因特网-day02
1.互联网中的时延:处理时延.排队时延.传输时延.传播时延. 处理时延:检查分组首部和决定该分组导向何处的时间. 排队时延:分组在链路上等待传输的时延. 传输时延:分组经过路由器与交换机的过程的时延. ...
- java代码swing编程JPaswordField类
总结:JPasswordField类是JTextField类的子类.用户在JPasswordField对象中输入的字符会被其他的字符替代 而挡住,JPasswordFiled组件主要用来输入口令 pa ...
- spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程
它既是 DispatcherServlet 的 (WebApplicationContext)默认策略,又是 ContextLoaderListener 创建 root WebApplicationC ...
- SpringBoot之二:部署Spring Boot应用程序方式
衡量多种部署方式 Spring Boot应用程序有多种构建和运行方式,其中一些你已经使用过了. 在IDE中运行应用程序(涉及Spring ToolSuite或IntelliJ IDEA). 使用Mav ...
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- HTTP-Runoob:HTPP Content-Type
ylbtech-HTTP-Runoob:HTPP Content-Type 1.返回顶部 1. HTTP content-type Content-Type,内容类型,一般是指网页中存在的Conten ...
- [转]RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct, ...
- CDM中遍历域及其约束条件、取值范围、引用它的项目
Option ExplicitValidationMode = TrueInteractiveMode = im_BatchDim mdl '当前model'获取当前活动mod ...