玲珑OJ1088【蜜汁尺取】
前言(膜法):
早上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【蜜汁尺取】的更多相关文章
- Gym 100703I---Endeavor for perfection(尺取)
题目链接 http://codeforces.com/problemset/gymProblem/100703/I Description standard input/outputStatement ...
- 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 ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- Codeforces Round #116 (Div. 2, ACM-ICPC Rules) E. Cubes (尺取)
题目链接:http://codeforces.com/problemset/problem/180/E 给你n个数,每个数代表一种颜色,给你1到m的m种颜色.最多可以删k个数,问你最长连续相同颜色的序 ...
- poj2566尺取变形
Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronaut ...
- poj2100还是尺取
King George has recently decided that he would like to have a new design for the royal graveyard. Th ...
- hdu 6231 -- K-th Number(二分+尺取)
题目链接 Problem Description Alice are given an array A[1..N] with N numbers. Now Alice want to build an ...
- Codeforces 939E Maximize! (三分 || 尺取)
<题目链接> 题目大意:给定一段序列,每次进行两次操作,输入1 x代表插入x元素(x元素一定大于等于之前的所有元素),或者输入2,表示输出这个序列的任意子集$s$,使得$max(s)-me ...
- cf1121d 尺取
尺取,写起来有点麻烦 枚举左端点,然后找到右端点,,使得区间[l,r]里各种颜色花朵的数量满足b数组中各种花朵的数量,然后再judge区间[l,r]截取出后能否可以供剩下的n-1个人做花环 /* 给定 ...
随机推荐
- vs2005 未能完成操作。未指定的错误
具体解决过程是这样的: 1.先把.vcproj 文件剪切到其他地方 2.打开.sln,报错->点“确定”->再点“确定” 3.把 .vcproj 文件 放回来,在vs2008右边的“解决方 ...
- 开源流媒体服务器EasyDarwin支持epoll网络模型,大大提升流媒体服务器网络并发性能
经过春节前后将近2个月的开发和稳定调试.测试,EasyDarwin开源流媒体服务器终于成功将底层select网络模型修改优化成epoll网络模型,将EasyDarwin流媒体服务器在网络处理的效率上提 ...
- redis事务和乐观锁
1 MULTI/EXEC 执行本事务. MULTI set foo bar get foo set foo hello EXEC 在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行.没有回滚 ...
- Delphi类的默认区域
//类中数据成员的排列顺序一般是: 字段.方法.属性 //访问权限区域的顺序一般是: 无限制区(默认 published) private protected public pub ...
- Hibernate总结(转)
原文:http://blog.csdn.net/yuebinghaoyuan/article/details/7300599 那我们看一下hibernate中整体的内容: 我们一一介绍其中的内容. H ...
- javascript中获取class
js中没有获取class的办法,找了一些封装好的方法,这里整理一下 (1)先进行封装 //封装getClass function getClass(tagName,className) //获得标签名 ...
- poj2513 Colored Sticks —— 字典树 + 并查集 + 欧拉回路
题目链接:http://poj.org/problem?id=2513 题解:通过这题了解了字典树.用字典树存储颜色,并给颜色编上序号.这题为典型的欧拉回路问题:将每种颜色当成一个点.首先通过并查集判 ...
- [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要
C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...
- linux内存占用分析
概述 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存.这里我们可以 ...
- Spring 事务管理高级应用难点剖析: 第 3 部分
本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 ...