bzoj2011: [Ceoi2010]Mp3 Player
Description
Input
Output
Sample Input
- 0
+ 8
+ 9
+ 13
- 19
- 24
Sample Output
题解:
这题肯定要从大到小枚举T,判断这时有效的操作能否有解
判断能否有解有两种做法
第一种是将所有操作倒过来作,这样加边减,减变加
无解的情况就是 在未到达过0之前,最后某段音量>vmax 或未到达过vmax之前,最后某段音量<0
然后就是分情况讨论了
如果没有到过vmax,那么最大初始音量为所有操作之和
否则就是vmax
第二种就是类似清华集训V那题一样的去维护一个分段函数f(x)
其定义域为[0,vmax],表示这段操作的初始音量,值域也为[0,vmax],表示这段操作后的音量为多少
然后也是一通讨论
code:
第一种:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
char ch;
bool ok;
void read(int &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
const int inf=0x7f7f7f7f;
char s[];
int n,vm,v[maxn];
struct oper{
int id,t;
}op[maxn];
bool cmp(const oper &a,const oper &b){return a.t>b.t;}
void write(int a,int b){
if (a==inf) puts("infinity");
else printf("%d %d\n",a,b);
}
struct Node{
int sum,maxv,minv;
};
Node operator+(const Node &a,const Node &b){return (Node){a.sum+b.sum,max(a.maxv,a.sum+b.maxv),min(a.minv,a.sum+b.minv)};}
struct Seg{
Node node[maxn<<],res,tmp;
void build(int k,int l,int r){
if (l==r){node[k]=(Node){v[l],v[l],v[l]};return;}
int m=(l+r)>>;
build(k<<,l,m),build((k<<)+,m+,r),node[k]=node[k<<]+node[(k<<)+];
}
void modify(int k,int l,int r,int x){
if (l==r){node[k]=(Node){,,inf};return;}
int m=(l+r)>>;
if (x<=m) modify(k<<,l,m,x); else modify((k<<)+,m+,r,x);
node[k]=node[k<<]+node[(k<<)+];
}
int query_max(int k,int l,int r){
if (l==r){tmp=res+node[k];return tmp.maxv<vm;}
int m=(l+r)>>;
tmp=res+node[k<<];
if (tmp.maxv>=vm) return query_max(k<<,l,m);
res=tmp; return query_max((k<<)+,m+,r)+(m-l+);
}
int query_min(int k,int l,int r){
if (l==r){tmp=res+node[k];return tmp.minv>;}
int m=(l+r)>>;
tmp=res+node[k<<];
if (tmp.minv<=) return query_min(k<<,l,m);
res=tmp; return query_min((k<<)+,m+,r)+(m-l+);
}
Node query(int k,int l,int r,int x){
if (l==r) return node[k];
int m=(l+r)>>;
if (x<=m) return query(k<<,l,m,x);
else return node[k<<]+query((k<<)+,m+,r,x);
}
bool check(int ans){
int t1,t2;
res=(Node){,,inf},t1=query_max(,,n-);
res=(Node){,,inf},t2=query_min(,,n-);
if (t1==n&&t2==n){write(ans,node[].sum);return true;}
if (t1>t2){
res=query(,,n-,t1);
if (res.minv<) return false;
if (t1==n) write(ans,node[].sum);
else write(ans,vm);
return true;
}
else{
res=query(,,n-,t2);
if (res.maxv>vm) return false;
write(ans,vm);
return true;
}
return false;
}
}T;
int main(){
read(n),read(vm),read(v[]);
for (int i=n;i>=;i--) scanf("%s",s),v[i]=s[]=='+'?-:,read(op[i].t),op[i].id=i;
T.build(,,n-);
if (T.check(inf)) return ;
for (int i=;i<n;i++) op[i].t-=op[i+].t;
sort(op+,op+n,cmp);
for (int i=,j;i<n;i=j){
for (j=i;op[j].t==op[i].t;j++) T.modify(,,n-,op[j].id);
if (T.check(op[i].t-)) return ;
}
return ;
}
第二种:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
char ch;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
inline int min(const int &a,const int &b){
int diff=b-a;
return a+(diff&(diff>>));
}
inline int max(const int &a,const int &b){
int diff=b-a;
return b-(diff&(diff>>));
}
char s[];
int n,vm,v2;
struct Oper{
int op,t,id;
}oper[maxn];
bool cmp(const Oper &a,const Oper &b){return a.t>b.t||(a.t==b.t&&a.id<b.id);}
struct Data{
int a,b,c;
void init(){a=,b=vm,c=;}
}res;
Data operator+(const Data &x,const Data &y){return (Data){min(y.b,max(y.a,x.a+y.c)),max(y.a,min(y.b,x.b+y.c)),x.c+y.c};}
struct Seg{
#define ls k<<1
#define rs (k<<1)+1
Data val[maxn<<];
void build(int k,int l,int r){
if (l==r){val[k]=(Data){,vm,oper[l].op};return;}
int m=(l+r)>>;
build(ls,l,m),build(rs,m+,r),val[k]=val[ls]+val[rs];
}
void modify(int k,int l,int r,int x){
if (l==r){val[k].init();return;}
int m=(l+r)>>;
if (x<=m) modify(ls,l,m,x); else modify(rs,m+,r,x);
val[k]=val[ls]+val[rs];
}
void modify(int x,int op){modify(,,n,x);}
}T;
int calc(){
if (v2==res.b&&res.b-res.c<=vm) return vm;
return max(,min(v2-res.c,vm));
}
int f(int x){return min(res.b,max(res.a,x+res.c));}
int main(){
read(n),read(vm),read(v2);
for (int i=;i<=n;i++) scanf("%s",s),read(oper[i].t),oper[i].op=s[]=='+'?:-,oper[i].id=i;
T.build(,,n);
for (int i=n;i>=;i--) oper[i].t-=oper[i-].t;
sort(oper+,oper+n+,cmp);
res=T.val[];
if (f()<=v2&&v2<=f(vm)){puts("infinity");return ;}
for (int i=,j;i<=n;i=j){
for (j=i;oper[j].t==oper[i].t;j++) T.modify(oper[j].id,oper[j].op);
res=T.val[];
if (f()<=v2&&v2<=f(vm)){printf("%d %d\n",oper[i].t-,calc());return ;}
}
return ;
}
bzoj2011: [Ceoi2010]Mp3 Player的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- android服务之MP3播放(2)
该播放器将会直接从网络上获取资源进行播放,并提供进度条显示的功能 布局文件 布局文件中使用Seekbar组件来显示进度条 <?xml version="1.0" encodi ...
- android之MP3播放器(1)
该播放器只是对本地的MP3文件进行简单的播放 布局文件 布局文件中设置了三个按钮分别来进行播放.暂停和继续播放 <?xml version="1.0" encoding=&q ...
- 你也可以用java的swing可以做出这么炫的mp3播放器_源码下载
I had published the blog : 你用java的swing可以做出这么炫的mp3播放器吗? and to display some screenshots about this M ...
- 20 Free Open Source Web Media Player Apps
free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...
- 视频播放flv player的使用
JW FLV PLAYER 中文文档 使用方法:如果你仅需要播放一个FLV文件[例如“video.flv”],那么只要把“video.flv”和压缩包内的 flvplayer.swf复制到同一个目录内 ...
- 关于jmf不能播放mp3的问题解决
想写个JAVA的MP3音乐管理器,使用JMF插件,但发现运行时总报一个异常: Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Ster ...
- 华为上机测试题(MP3光标移动-java)
PS:此题满分,可参考 描述: MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲.为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第 ...
- 20款 JavaScript 开发框架推荐给前端开发者
下面,我们给大家提供了一个用于 HTML5 开发的各种用途的 JavaScript 库列表.这些框架能够给前端开发人员提供更好的功能实现的解决方案.如果你有收藏优秀的框架,也可以在后面的评论中分享给我 ...
随机推荐
- postgresql9.5 run 文件linux安装后配置成开机服务
网上出现的比较多安装方法要么是源码安装,要么是yum安装,我发觉都要配置很多属性,比较麻烦,所以现在我在centos7长用 run文件来安装 http://get.enterprisedb.com/p ...
- 有n个台阶,如果一次只能上1个或2个台阶,求一共有多少种上法
// n级台阶,求多少种跳法.cpp : Defines the entry point for the console application. // /* 思路: 如果只有一级台阶,n=1,很明显 ...
- fscanf函数
函数定义: int fscanf( FILE *stream, const char *format [, argument ]... ); 以下是csdn的样例: /* FSCANF.C: This ...
- keepalive support-----Programming applications
TCP Keepalive HOWTO Prev Next 4. Programming applications This section deals with programming code ...
- 2014-08-05 pig
Pig的数据类型能够分为两种:一种是scalar类型,包含单一的value,一种是complex类型,包含有其他的类型. 对于scalar类型: int,long,float,double,chara ...
- 实现FTP断点续传
应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在客户端修改或新增加一个文件时,该文件要同步上传到服务器端对应的用户目录下,因此针对数据传输(即:上传.下载)这一块现在既定了三种传输方式,即: ...
- HTML+CSS基础学习笔记(7)
CSS布局模型 在网页中,元素有三种布局模型: 1.流动模型(Flow) 2.浮动模型(Float) 3.层模型(Layer) 一.流动模型 流动(Flow)是默认的网页布局模型,网页在默认状态下的H ...
- PHP in_array不兼容问题
做过日本的手机端,就因为in_array这个方法在我的环境下没有问题 结果到日本那边就是出问题,一直纠结的我啊,现在特贴出当初的兼容方法 function in_into($key,$array){ ...
- MVC 中的Areas支持
在ASP.NET MVC 2中对于Area功能的增强,这样的增强是如何在同一个项目中更好地组织应用程序的? ASP.NET MVC 1.0时,如果我们要在一个项目中做自己网站的后台应用,而又保持URL ...
- SOCKET,TCP/UDP,HTTP,FTP
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...