前言(膜法):

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

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

题意:

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

思路:

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

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

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

  1. //#include <bits/stdc++.h>
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<queue>
  5. #include<string.h>
  6. #include<algorithm>
  7. using namespace std;
  8. typedef long long LL;
  9. typedef pair<int,int> PII;
  10.  
  11. const int N=1e5+10;
  12. struct asd{
  13. int id,w;
  14. friend bool operator< (asd n1,asd n2)
  15. {
  16. if(n1.w==n2.w) return n1.id>n2.id;
  17. return n1.w>n2.w;
  18. }
  19. };
  20.  
  21. struct dsa{
  22. int id,w;
  23. friend bool operator< (dsa n1,dsa n2)
  24. {
  25. if(n1.w==n2.w) return n1.id>n2.id;
  26. return n1.w<n2.w;
  27. }
  28. };
  29.  
  30. int a[N],b[N],sum[N];
  31. bool vis[N];
  32. priority_queue<asd>q; //区间内免费的物品
  33. priority_queue<dsa>p; //区间内花费的物品
  34. int cost,val,out;
  35. dsa have(int s)
  36. {
  37. dsa now;
  38. while(!p.empty())
  39. {
  40. if(p.top().id<s)
  41. p.pop();
  42. else
  43. break;
  44. }
  45. if(!p.empty())
  46. {
  47. now=p.top();
  48. return now;
  49. }
  50. now.id=0;
  51. return now;
  52. }
  53.  
  54. asd get_q(int s)
  55. {
  56. while(!q.empty())
  57. if(q.top().id<s)
  58. {
  59. q.pop();
  60. out--;
  61. }
  62. else
  63. break;
  64. asd now;
  65. now=q.top();
  66. return now;
  67. }
  68.  
  69. int main()
  70. {
  71. int T,n,m,k;
  72. scanf("%d",&T);
  73. while(T--)
  74. {
  75. while(!q.empty())
  76. q.pop();
  77. while(!p.empty())
  78. p.pop();
  79. scanf("%d%d%d",&n,&m,&k);
  80. for(int i=1;i<=n;i++)
  81. scanf("%d",&a[i]);
  82. sum[0]=0;
  83. for(int i=1;i<=n;i++)
  84. {
  85. scanf("%d",&b[i]);
  86. sum[i]=sum[i-1]+b[i];
  87. vis[i]=false;
  88. }
  89. asd now,nex;
  90. dsa nnn,mmm;
  91. int s,t;
  92. out=0; //out代表,在队列里的实际已经出队的元素个数
  93. cost=0; //代表花费。
  94. val=0; //代表得的价值。
  95. s=t=1;
  96. while(s<=n)
  97. {
  98. while(t<=n)
  99. {
  100. if((q.size()-out)<m)
  101. {
  102. nnn.id=t;nnn.w=a[t];p.push(nnn);
  103. cost+=nnn.w;
  104. mmm=have(s);
  105. cost-=mmm.w;
  106. now.id=mmm.id;now.w=mmm.w;
  107. vis[now.id]=1;
  108. p.pop();
  109. q.push(now);
  110. val=max(val,sum[t]-sum[s-1]);
  111. t++;
  112. }
  113. else if((q.size()-out)==m)
  114. {
  115. now=get_q(s);
  116. if(cost+a[t]>k&&cost+now.w>k)
  117. break;
  118.  
  119. nnn.id=t;nnn.w=a[t];p.push(nnn);
  120. cost+=a[t];
  121. mmm=have(s);
  122. if(mmm.w>now.w)
  123. {
  124. cost-=mmm.w;
  125. cost+=now.w;
  126. q.pop();
  127. p.pop();
  128. nnn.id=now.id;nnn.w=now.w;
  129. vis[nnn.id]=0;
  130. p.push(nnn);
  131. nex.id=mmm.id;nex.w=mmm.w;
  132. vis[nex.id]=1;
  133. q.push(nex);
  134. }
  135. val=max(val,sum[t]-sum[s-1]);
  136. t++;
  137. }
  138. else break;
  139. }
  140. //printf("%d %d\n",s,t);
  141. //printf("%d\n",val);
  142. if(vis[s])
  143. {
  144. vis[s]=false;
  145. out++;
  146. }
  147. else
  148. cost-=a[s];
  149. s++;
  150. }
  151. printf("%d\n",val);
  152. }
  153. return 0;
  154. }
  155. /*
  156. 100
  157. 6 1 4
  158. 5 3 2 4 1 6
  159. 2 4 3 1 6 5
  160. 5 1 6
  161. 1 2 5 4 3
  162. 2 2 5 4 8
  163. 5 2 6
  164. 1 2 5 4 3
  165. 2 2 5 4 8
  166. 6 2 4
  167. 5 3 2 4 1 6
  168. 2 4 3 1 6 5
  169. 6 2 4
  170. 1 7 1 7 1 6
  171. 2 4 3 1 6 3
  172. 6 2 4
  173. 1 7 1 7 1 6
  174. 2 4 3 1 6 3
  175. 5 2 2
  176. 1 2 5 4 3
  177. 2 2 5 4 8
  178. 5 1 1
  179. 8 5 4 3 2
  180. 1 2 3 4 5
  181. 4 1 3
  182. 4 2 2 3
  183. 3 2 4 5
  184.  
  185. */

玲珑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. aapt命令获取apk具体信息(包名、版本号号、版本号名称、兼容api级别、启动Activity等)

    aapt命令获取apk具体信息(包名.版本号号.版本号名称.兼容api级别.启动Activity等) 第一步:找到aapt 找到sdk的根文件夹,然后找到build-tools文件夹.然后会看到一些b ...

  2. EasyDarwin流媒体服务器RTSP拉模式流媒体转发模块设计

    拉模式转发 拉模式转发,顾名思义就是服务器主动从源端(IPCamera.NVR.或者其他流媒体服务器)通过RTSP/RTP协议将流媒体音视频数据拉取到流媒体转发服务器,再通过内部分发调度机制,分发给请 ...

  3. bapi_goodsmvt_create-GR

    BAPI_GOODSMVT_CREATE 使用方法 * GMCODE Table T158G - - MB01 - Goods Receipts for Purchase Order * - MB31 ...

  4. Nginx 基本介绍

    同类产品 同类竞争产品,Apache,Tomcat,IIS等. Tomcat面向Java. IIS只能在Windows上运行. Apache有很多优点,稳定,开源,跨平台.但是它比较重,而且不支持高并 ...

  5. linux应用之tomcat的安装及配置(centos)

    CentOS 6.6下安装配置Tomcat环境 [日期:2015-08-25] 来源:Linux社区  作者:tae44 [字体:大 中 小]   实验系统:CentOS 6.6_x86_64 实验前 ...

  6. codeforces 701B B. Cells Not Under Attack(水题)

    题目链接: B. Cells Not Under Attack 题意: n*n的棋盘,现在放m个棋子,放一个棋子这一行和这一列就不会under attack了,每次放棋子回答有多少点还可能under ...

  7. python中的linspace,meshgrid,concatenate函数

    linspace可以用来实现相同间隔的采样. numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) ...

  8. Apktool 和 Jeb 给出的不同的smali语法

    今天发现用Apktool和Jeb反编译出来的smali在语法上有一定区别,比如一个Java函数: private void packageNameCheck() { com.example.testf ...

  9. bzoj 3992 [SDOI2015] 序列统计 —— NTT (循环卷积+快速幂)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3992 (学习NTT:https://riteme.github.io/blog/2016-8 ...

  10. ASoC框架

    ASoC框架分为3部分: 1. platform(用来描述芯片的DAI接口,负责数据传输): DAI:snd_soc_dai_driver, 用来表示支持哪些格式数据, 提供设置格式的函数, 启动数据 ...