前言(膜法):

早上10点多开始膜的,然后到中午交了一发,感觉膜法不对啊!然后就兴起小窗了一发管理员,然后管理员给我发了in,out数据。。。可是太大并没有什么可取性。。。

还是自己试,然后发现自己搞的案例都过,后面放着不玩了,然后队友给了我一题以前做过的dfs写,然后写了以后T了,后面我就跟他讲这道题。。。讲完好我说我的方法,他硬是不懂我的尺取,然后搞了一个破案例我模拟发现,卧槽我左指针移的时候发现,区间突然没有取前m最大惹,后面在左指针移的时候改了一下,gg,wa的。然后继续测,继续wa。然后发现噢噢噢噢,那样子搞的!始终都要前m大,然后就这样了,膜了一发过了。。。破水题,坑了一天,不过事后发现以后做题要对重要条件特别照顾,始终照顾。然后CF也没打。。。万事大吉,然后就和女朋友去散步了。

题意:

先选一段连续的区间,能够免费m个,免费是任意位置,求一个获得价值最大;

思路:

重点就是在于怎么搞出一个区间的前m大,而且是始终都要。

尺取,对区间里的数进行分类,一类是免费,一类是付钱,那我肯定是免费最贵的,因为最终我的钱多呀!

然后具体操作是两个优先队列搞的,一个队列是付钱的最大,一个队列是免费的最小,这样维护复杂度还好吧。

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII; const int N=1e5+10;
struct asd{
int id,w;
friend bool operator< (asd n1,asd n2)
{
if(n1.w==n2.w) return n1.id>n2.id;
return n1.w>n2.w;
}
}; struct dsa{
int id,w;
friend bool operator< (dsa n1,dsa n2)
{
if(n1.w==n2.w) return n1.id>n2.id;
return n1.w<n2.w;
}
}; int a[N],b[N],sum[N];
bool vis[N];
priority_queue<asd>q; //区间内免费的物品
priority_queue<dsa>p; //区间内花费的物品
int cost,val,out;
dsa have(int s)
{
dsa now;
while(!p.empty())
{
if(p.top().id<s)
p.pop();
else
break;
}
if(!p.empty())
{
now=p.top();
return now;
}
now.id=0;
return now;
} asd get_q(int s)
{
while(!q.empty())
if(q.top().id<s)
{
q.pop();
out--;
}
else
break;
asd now;
now=q.top();
return now;
} int main()
{
int T,n,m,k;
scanf("%d",&T);
while(T--)
{
while(!q.empty())
q.pop();
while(!p.empty())
p.pop();
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
sum[i]=sum[i-1]+b[i];
vis[i]=false;
}
asd now,nex;
dsa nnn,mmm;
int s,t;
out=0; //out代表,在队列里的实际已经出队的元素个数
cost=0; //代表花费。
val=0; //代表得的价值。
s=t=1;
while(s<=n)
{
while(t<=n)
{
if((q.size()-out)<m)
{
nnn.id=t;nnn.w=a[t];p.push(nnn);
cost+=nnn.w;
mmm=have(s);
cost-=mmm.w;
now.id=mmm.id;now.w=mmm.w;
vis[now.id]=1;
p.pop();
q.push(now);
val=max(val,sum[t]-sum[s-1]);
t++;
}
else if((q.size()-out)==m)
{
now=get_q(s);
if(cost+a[t]>k&&cost+now.w>k)
break; nnn.id=t;nnn.w=a[t];p.push(nnn);
cost+=a[t];
mmm=have(s);
if(mmm.w>now.w)
{
cost-=mmm.w;
cost+=now.w;
q.pop();
p.pop();
nnn.id=now.id;nnn.w=now.w;
vis[nnn.id]=0;
p.push(nnn);
nex.id=mmm.id;nex.w=mmm.w;
vis[nex.id]=1;
q.push(nex);
}
val=max(val,sum[t]-sum[s-1]);
t++;
}
else break;
}
//printf("%d %d\n",s,t);
//printf("%d\n",val);
if(vis[s])
{
vis[s]=false;
out++;
}
else
cost-=a[s];
s++;
}
printf("%d\n",val);
}
return 0;
}
/*
100
6 1 4
5 3 2 4 1 6
2 4 3 1 6 5
5 1 6
1 2 5 4 3
2 2 5 4 8
5 2 6
1 2 5 4 3
2 2 5 4 8
6 2 4
5 3 2 4 1 6
2 4 3 1 6 5
6 2 4
1 7 1 7 1 6
2 4 3 1 6 3
6 2 4
1 7 1 7 1 6
2 4 3 1 6 3
5 2 2
1 2 5 4 3
2 2 5 4 8
5 1 1
8 5 4 3 2
1 2 3 4 5
4 1 3
4 2 2 3
3 2 4 5 */

玲珑OJ1088【蜜汁尺取】的更多相关文章

  1. Gym 100703I---Endeavor for perfection(尺取)

    题目链接 http://codeforces.com/problemset/gymProblem/100703/I Description standard input/outputStatement ...

  2. NOJ 1072 The longest same color grid(尺取)

    Problem 1072: The longest same color grid Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit in ...

  3. hdu 4123 Bob’s Race 树的直径+rmq+尺取

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  4. Codeforces Round #116 (Div. 2, ACM-ICPC Rules) E. Cubes (尺取)

    题目链接:http://codeforces.com/problemset/problem/180/E 给你n个数,每个数代表一种颜色,给你1到m的m种颜色.最多可以删k个数,问你最长连续相同颜色的序 ...

  5. poj2566尺取变形

    Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronaut ...

  6. poj2100还是尺取

    King George has recently decided that he would like to have a new design for the royal graveyard. Th ...

  7. hdu 6231 -- K-th Number(二分+尺取)

    题目链接 Problem Description Alice are given an array A[1..N] with N numbers. Now Alice want to build an ...

  8. Codeforces 939E Maximize! (三分 || 尺取)

    <题目链接> 题目大意:给定一段序列,每次进行两次操作,输入1 x代表插入x元素(x元素一定大于等于之前的所有元素),或者输入2,表示输出这个序列的任意子集$s$,使得$max(s)-me ...

  9. cf1121d 尺取

    尺取,写起来有点麻烦 枚举左端点,然后找到右端点,,使得区间[l,r]里各种颜色花朵的数量满足b数组中各种花朵的数量,然后再judge区间[l,r]截取出后能否可以供剩下的n-1个人做花环 /* 给定 ...

随机推荐

  1. 几个经典的TCP通信函数

    前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...

  2. EasyHLS实现将IPCamera摄像机的RTSP转HLS直播输出

    EasyHLS EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简单,只需要传入打包的文件名.切片存放的目录.单个切片时长以及切片数等参数,EasyHLS库就能轻松将 ...

  3. 用EasyDarwin进行IPTV rtsp mpeg-ts smil流的转发和分发直播服务

    对RTSP/RTP的转发和分发一直都是EasyDarwin的基础功能,尤其是在安防行业中,EasyDarwin非常贴合安防监控的需求,但一直未尝试用EasyDarwin进行IPTV的RTSP流进行转发 ...

  4. struts2的核心和工作原理 (转)

    转自--------http://blog.csdn.net/laner0515/article/details/27692673 在学习struts2之前,首先我们要明白使用struts2的目的是什 ...

  5. Boost智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...

  6. GNU linux 中makefile那点事

    转自陈皓: http://bbs.chinaunix.net/viewthread.php?tid=408225 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为 ...

  7. 人生苦短之Python发邮件

    #coding=utf-8 import smtplib from email.mime.base import MIMEBase from email.mime.image import MIMEI ...

  8. 为 Android 平台开发一个输入法

    学习目标: 实现新的输入法 学习目的: 掌握Android输入法框架 学习收获: Android 1.5 新特色之一就是输入法框架(Input Method Framework,IMF),正是它的出现 ...

  9. macbook清理磁盘空间

    前言:作为一名程序员,使用MacBook时间久了之后难免都会遇到“磁盘空间不足”的警告,这时就可以清理如下文件夹,一般就可以清理出几十个G的大小! 1.删除“~/资源库/Developer/Xcode ...

  10. svg矢量图制作工具(Sketsa SVG Editor) v7.1.1 中文免费版

    下载地址:https://www.jb51.net/softs/555253.html Sketsa SVG Editor中文版是一款强大好用的矢量图绘制工具,该工具的最大特色就是集成了中文语言,且支 ...