$Noip2016/Luogu2827$蚯蚓
$Sol$
乍一看就是个模拟叭,用个优先队列维护不就好了.不过这里有一个问题就是怎么解决没被切的蚯蚓的增长问题.可以这样处理,每次切一条蚯蚓,给切完之后的都减去$q$,最后输出答案时都加上$q*m$就$OK$辣.还有一个要注意的地方就是每次切蚯蚓的时候都要求出它的实际长度而不是存在优先队列里的长度.
但是这样只有$80$的样子.瞎分析一波复杂度似乎是$O(mlog_{n+m}^2)$.
考虑优化,如果能把这个$log^2$去掉就好了吖.
注意到,先被切的蚯蚓的较长的一段一定大于后被切的蚯蚓的较长的一段,先被切的蚯蚓的较短的一段一定大于后被切的较短的一段.于是不需要优先队列就可以维护单调性了.具体来说开三个数组,分别存还没被切的蚯蚓(初始数组,记得排序),被切了之后较长的那个蚯蚓,被切之后较短的蚯蚓.每次选取三个数组里最长的那个切,切完之后分别加入后面两个数组就好了不需要多余的维护.
$Code$
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<queue>
- #include<cmath>
- using namespace std;
- int r()
- {
- int x=,y=;;char ch;
- ch=getchar();
- while(ch<''||ch>'') {if(ch=='-') y=-;ch=getchar();}
- while(ch>=''&&ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}
- return x*y;
- }
- bool cmp(int x,int y)
- {
- return x>y;
- }
- int q[],q1[],q2[];
- int n,m,qq,u,v,t;
- double p;
- int a[];
- int rem;
- priority_queue<int> ans;
- int main()
- {
- n=r();m=r();qq=r();u=r();v=r();t=r();
- p=(double)u/(double)v;
- for(register int i=;i<=n;i++) q[i]=r();
- sort(q+,q+n+,cmp);
- int h=;
- int h1=,t1=,h2=,t2=;
- int top;
- for(register int i=;i<=m;i++)
- {
- if(h>n) {if(q1[h1]>q2[h2]) top=q1[h1++];else top=q2[h2++];}
- else if(q[h]>=q1[h1]&&q[h]>=q2[h2]) top=q[h++];
- else if(q1[h1]>=q2[h2]) top=q1[h1++];
- else top=q2[h2++];
- top+=rem;
- int x1=floor((double)top*p),x2=top-x1;
- rem+=qq;
- x1-=rem;x2-=rem;
- q1[++t1]=x1;q2[++t2]=x2;
- if(i%t==) printf("%d ",top);
- }
- printf("\n");
- for(register int i=h;i<=n;i++) ans.push(q[i]);
- for(register int i=h1;i<=t1;i++) ans.push(q1[i]);
- for(register int i=h2;i<=t2;i++) ans.push(q2[i]);
- for(int i=;ans.size();i++)
- {
- if(i%t==) printf("%d ",ans.top()+rem);
- ans.pop();
- }
- return ;
- }
View 去年的 Code
随机推荐
- tp3 key json 分页
//json 强制转换为array $arr[$key]['checkpro'] = json_decode($val['checkpro'],JSON_FORCE_ARRAY); $arr[$ ...
- vb.net机房收费系统——存储过程
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xdd19910505/article/details/35574125 一.使用背景 ...
- CF986F Oppa Funcan Style Remastered
CF986F Oppa Funcan Style Remastered 不错的图论转化题! 题目首先转化成:能否用若干个k的非1因数的和=n 其次,因数太多,由于只是可行性,不妨直接都用质因子来填充! ...
- Libev源码分析01:Libev中的监视器结构(C结构体实现继承)
在Libev的源码中,用到了一种用C实现类似C++中继承的技巧,主要是用宏和结构体实现. 在Libev中,最关键的数据结构就是各种监视器,比如IO监视器,信号监视器等等.这些监视器的多数成员都是一样的 ...
- php函数nl2br的反函数br2nl
真是搞不明白,php里有nl2br这样的好函数,但是为什么就没有它的反函数呢?只好自己在网站找了一个br2nl.分两个版本:php和javascript的. php版的代码如下: function b ...
- H3C 网络号和主机号
- Java 自带性能监控工具:监视和管理控制台 jconsole 的使用
1. 前言想验证你对 jvm 配的一些调优参数(比如 Xms.Xmx 等)有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数.有没有死锁?应用出现 java.lang.OutOfM ...
- C# winforms 输入颜色转换颜色名
本文告诉大家如何输入颜色,如0xFFFF8000转换为 Orange 在 winforms 程序 可以使用下面代码转换 public static class HexColorTranslator { ...
- InetAddress与Socket
InetAddress:构造方法私有,不能直接创建对象. InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址. InetAddress get ...
- printk函数 打印设备编号
偶尔地, 当从一个驱动打印消息, 你会想打印与感兴趣的硬件相关联的设备号. 打印主次 编号不是特别难, 但是, 为一致性考虑, 内核提供了一些实用的宏定义( 在 <linux/kdev_t.h& ...