题目传送门:https://www.luogu.org/problemnew/show/P2827

自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/t次操作。结果GG....

65分做法:写一个左偏树,每次取出最顶端元素,对堆中其余元素全部+q(可以用标记完成),将该元素取出后,切为两段后再丢入该树中。时间复杂度为O((m+n) log m)。

幸好我不会65分的STL做法,据说此题有人用STL被卡了5分.....

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define M 1100000
using namespace std;
priority_queue<int> Q;
int n,m,q,t;
int tag[M]={},a[M]={},lc[M]={},rc[M]={}; void pushdown(int x){
if(!tag[x]) return;
tag[lc[x]]+=tag[x]; tag[rc[x]]+=tag[x];
a[lc[x]]+=tag[x]; a[rc[x]]+=tag[x];
tag[x]=;
}
int merge(int x,int y){
if(!x) return y;
if(!y) return x;
if(a[x]>a[y]){
pushdown(x);
rc[x]=merge(rc[x],y);
swap(lc[x],rc[x]);
return x;
}else{
pushdown(y);
lc[y]=merge(x,lc[y]);
swap(lc[y],rc[y]);
return y;
}
}
int rt=,use=;
long long v,u;
int main(){
freopen("earthworm.in","r",stdin);
freopen("earthworm.out","w",stdout);
cin>>n>>m>>q>>u>>v>>t;
for(int i=;i<=n;i++){
int x; scanf("%d",&x);
use++; a[use]=x;
rt=merge(use,rt);
}
for(int i=;i<=m;i++){
int x=a[rt],lastrt=rt;
rt=merge(lc[rt],rc[rt]);
tag[rt]+=q; a[rt]+=q;
if(i%t==) printf("%d ",x);
int x1=(u*x)/v,x2=x-x1;
lc[lastrt]=rc[lastrt]=; a[lastrt]=x1;
rt=merge(rt,lastrt);
use++; a[use]=x2;
rt=merge(use,rt);
}
printf("\n");
for(int i=;i<=m+n;i++){
int x=a[rt]; rt=merge(lc[rt],rc[rt]);
if(i%t==) printf("%d ",x);
}
printf("\n");
}

很垃圾的65分代码

下面说下100%的做法。

首先,先开三个队列,x,y,z。初始状态下,队列x中保存的是完全没有被切过的蚯蚓的长度(初始时排个序,最大的在最前面),队列y中保存一条被切开的蚯蚓前半部分的长度,队列z中保存一条被切开的蚯蚓的后半部分的长度。我们需保证y,z中元素的单调递减性。

不妨设q=0。由于p=[0,1],则有x[1]≥y[1],z[1]。又因x[i]≥x[i-1],则有y[i]≥y[i-1],z[i]≥z[i-1]。我们每次在x,y,z三个队列的头部取出长度最长的蚯蚓,随后将其分为两半后,分别直接加至y队列和z队列末尾,基于上述性质,无需排序或树结构维护y,z的单调性。

这种方法已经可以拿90分了...

实际上,当q≠0时,通过一些小的操作,y,z的单调性依然能够满足。

假设当前时间为t,若取出元素入队的时间为t0,入队时长度为x,则出队长度为q(t-t0)+x。我们修改下元素入队的规则,假设当前需要将x入队,则在x入队前,将x减去q*t0,再加入队列中。不难证明该方法可以保证y,z队列依然满足单调性。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define L long long
#include<queue>
#define INF 1231231231
#define M 10000010
using namespace std;
int x[M]={},y[M]={},z[M]={};int a[M]={},b[M]={};
int u,v,q,t,h1=,h2=,h3=,t1=,t2=,t3=; int n,m;
int main(){
freopen("earthworm.in","r",stdin);
freopen("earthworm.out","w",stdout);
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
for(int i=;i<=n;i++) scanf("%d",a+i);
sort(a+,a+n+);
for(int i=n;i;i--) x[t1++]=a[i];
for(int i=,pls=;i<=m;i++){
int tmp=-INF,id=;
if(h1<t1) if(tmp<x[h1]) tmp=x[h1],id=;
if(h2<t2) if(tmp<y[h2]) tmp=y[h2],id=;
if(h3<t3) if(tmp<z[h3]) tmp=z[h3],id=;
tmp+=pls; pls+=q;
if(i%t==) printf("%d ",tmp);
if(id==) h1++; if(id==) h2++; if(id==) h3++;
L y1=((L)tmp*u)/v,z1=tmp-y1;
y[t2++]=(y1-pls); z[t3++]=(z1-pls);
}
int pls=(m)*q; printf("\n");
for(int i=;i<=n+m;i++){
int tmp=-INF,id=;
if(h1<t1) if(tmp<x[h1]) tmp=x[h1],id=;
if(h2<t2) if(tmp<y[h2]) tmp=y[h2],id=;
if(h3<t3) if(tmp<z[h3]) tmp=z[h3],id=;
tmp+=pls; if(i%t==) printf("%d ",tmp); //b[i]=tmp;
if(id==) h1++; if(id==) h2++; if(id==) h3++;
}
//for(int i=1;i<=n+m;i++) printf("%lld ",b[i]);
}

【NOIP2016提高组】 Day2 T2 蚯蚓的更多相关文章

  1. 【NOIP2016提高组day2】蚯蚓

    那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...

  2. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  3. NOIP2012提高组day2 T2借教室

    这题骗分可以骗到满分(可能是数据不太强给强行过去了) 这道题如果是按照题意去模拟用循环去修改区间的话只有45分,正解是二分+差分数组,骗分也是差分数组但是没有使用二分,时间复杂度在最坏的情况下是O(n ...

  4. 【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路

    存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什 ...

  5. 洛谷 3959 宝藏 NOIP2017提高组Day2 T2

    [题解] 状压DP. f[i]表示现在的点是否连接的状态是i. #include<cstdio> #include<cstring> #include<algorithm ...

  6. 【NOIP2016提高组day2】愤怒的小鸟

    分析 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0, 0) 处,每次Kiana可以用它向第一象限发射一只红色的小鸟, 小鸟们的飞行轨迹均 ...

  7. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  8. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  9. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  10. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

随机推荐

  1. 201521123114《Java程序设计》第9周学习总结

    1. 本章学习总结 2. 书面作业 Q1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 经常出现的异常 ...

  2. Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】

    什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...

  3. 再起航,我的学习笔记之JavaScript设计模式24(备忘录模式)

    备忘录模式 概念介绍 备忘录模式(Memento): 在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以便日后对象使用或者对象恢复到以前的某个状态. 简易分页 在一般情况下我们需要做 ...

  4. 解决在Ubuntu终端下使用cURL获取GBK格式的页面出现乱码问题

    问题描述 在Ubuntu下使用终端使用cURL去拿一个GBK的页面,发现返回来的内容里面中文都是乱码 解决方法 通过iconv来处理乱码拿到的内容,进行转码,示例如下: $curl http://ww ...

  5. Java定时任务调度详解

    前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券 ...

  6. 11 Linear Models for Classification

    一.二元分类的线性模型 线性分类.线性回归.逻辑回归 可视化这三个线性模型的代价函数 SQR.SCE的值都是大于等于0/1的 理论分析上界 将回归应用于分类 线性回归后的参数值常用于pla/pa/lo ...

  7. SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

    "F:\program files (x86)\Python35\python.exe" "F:/program files (x86)/JetBrains/Seleni ...

  8. 认识:ThinkPHP的编译缓存文件~runtime.php

    1.定义单入口文件(index.php) 在单入口index.php中不定义这两项时,会生成编译缓存文件~runtime.php define('RUNTIME_PATH','./App/Temp/' ...

  9. 【HIVE】sql语句转换成mapreduce

    1.hive是什么? 2.MapReduce框架实现SQL基本操作的原理是什么? 3.Hive怎样实现SQL的词法和语法解析? 连接:http://www.aboutyun.com/thread-20 ...

  10. 怎样使用自定义标签简化 js、css 引入?

    国庆将至,工作兴致全无,来总结点项目里平时不起眼干货. 前端引入 js .css 一般是这样: <script type="text/javascript" src=&quo ...