Codeforces 1180E Serge and Dining Room
题意:
有\(n\)个菜肴,有\(m\)个小朋友,每个菜肴的价格为\(a_i\),每个小朋友有\(b_i\)元钱,小朋友从\(1 \rightarrow m\)依次购买菜肴,当第\(i\)个小朋友轮到的时候,他会购买他买的起的最贵的,否则就离开。
要求支持修改第\(i\)个菜肴的价格和修改第\(i\)个小朋友的拥有的钱数的两种操作,每次操作完成给出\(m\)个小朋友买完后剩下的最贵的菜肴的价格是多少。
思路:
假设价格大于\(x\)的\(y\)个菜肴都被买了,那么显然拥有钱数\(\geq x\)的小朋友个数一定要\(\geq y\),显然如何购买是无所谓的。
那么就在\(a_i\)处减一,\(b_i\)处加一,每次询问一个最大的\(l\)使得\([l, \infty]\)的最大后缀和\(> 0\)。
线段树维护即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define M 1000000
int n, m, q, a[N], b[N];
struct SEG {
struct node {
int sum, Max;
node() {
sum = Max = 0;
}
node(int sum, int Max) : sum(sum), Max(Max) {}
node operator + (const node &other) const {
node res = node();
res.sum = sum + other.sum;
res.Max = max(other.Max, Max + other.sum);
return res;
}
}t[N << 2];
void init() {
memset(t, 0, sizeof t);
}
void update(int id, int l, int r, int x, int v) {
if (l == r) {
t[id].sum += v;
t[id].Max += v;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) update(id << 1, l, mid, x, v);
else update(id << 1 | 1, mid + 1, r, x, v);
t[id] = t[id << 1] + t[id << 1 | 1];
}
int query(int id, int l, int r, node tmp) {
if (l == r) {
return l;
}
int mid = (l + r) >> 1;
node tmp2 = t[id << 1 | 1] + tmp;
if (tmp2.Max > 0) {
return query(id << 1 | 1, mid + 1, r, tmp);
} else {
return query(id << 1, l, mid, tmp2);
}
}
}seg;
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
seg.init();
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
seg.update(1, 1, M, a[i], 1);
}
for (int i = 1; i <= m; ++i) {
scanf("%d", b + i);
seg.update(1, 1, M, b[i], -1);
}
scanf("%d", &q);
int op, x, v;
while (q--) {
scanf("%d%d%d", &op, &x, &v);
switch(op) {
case 1 :
seg.update(1, 1, M, a[x], -1);
seg.update(1, 1, M, a[x] = v, 1);
break;
case 2 :
seg.update(1, 1, M, b[x], 1);
seg.update(1, 1, M, b[x] = v, -1);
break;
default :
assert(0);
}
if (seg.t[1].Max <= 0) {
puts("-1");
} else {
printf("%d\n", seg.query(1, 1, M, SEG::node(0, 0)));
}
}
}
return 0;
}
Codeforces 1180E Serge and Dining Room的更多相关文章
- codeforces 1180E Serge and Dining Room 线段树
题目传送门 题目大意: 给出a序列和b序列,a序列为各种食物的价格,b序列为一列排着队的小朋友拥有的钱,小朋友依次购买食物,每个人都买自己能买的起的最贵的食物,买不起就离开队伍.给出q次操作,操作1是 ...
- E - Serge and Dining Room
https://codeforces.com/contest/1180/problem/E 转载自他人博客 题意:有nn个菜肴,有mm个小朋友,每个菜肴的价格为aiai,每个小朋友有bibi元钱,小朋 ...
- Codeforces Round #569 题解
Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- BZOJ 1711: [Usaco2007 Open]Dining吃饭
1711: [Usaco2007 Open]Dining吃饭 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 902 Solved: 476[Submit ...
- BZOJ 1226: [SDOI2009]学校食堂Dining
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 730 Solved: 446[Submit][ ...
随机推荐
- Linux十大顶级发行版本
当前顶级发行版概览 对于Linux新手来说,在各发行版之间困惑得进行选择和不断增加的数量实在令人头晕.这就是写作本文的原因,其中列出的10个(附加一个值得一提的FreeBSD,BSD一族中最为流行 ...
- asp.net core-12.dotnet watch run 和attach到进程调试
1.打开visual studio code 创建一个项目 打开终端 输出: dotnet new web --name hellocore 2.用visual studio code打开项目文件夹 ...
- IOC实现-Unity
.NET中实现IOC有很多方式,比如:Unity.Ninject.Autofac.MEFNinject的实现参考<Pro ASP.NET MVC3.5 FrameWork>下面给出的是Un ...
- Win10安装PyQt5与Qt Designer
1.直接在cmd中通过pip安装PyQt5 1 pip install pyqt5 会自动下载PyQt5以及sip并安装,因为PyQt5不再提供Qt Designer等工具,所以需要再安装pyqt5- ...
- Windows下使用批处理文件.bat删除旧文件
本文教大家写一个批处理文件.bat删除旧文件,供大家参考,具体内容如下 1. 批处理文件 del_old_file.bat rem 删除D:\temp目录下7天前的文件Forfiles /p E:\b ...
- C# 循环中 直接索引 VS 缓存索引 性能测试
using System; namespace TestCSharp { class MainClass { public class t1 { public b1 b = new b1(); } p ...
- CSS属性margin、padding的区别
原始状态 不设置margin和padding的状态 margin 设置外边距之后的状态 padding 设置内边距之后的状态 ,注意是撑开,外框高宽由300px变成450px. 说明:本文为原创作品, ...
- css-两个div并排,左边宽度固定右边自适应的布局 的实现方法
<div class= "container"> <div class="left"></div> <div clas ...
- python 爬虫抓取 MOOC 中国课程的讨论区内容
一:selenium 库 selenium 每次模拟浏览器打开页面,xpath 匹配需要抓取的内容.可以,但是特别慢,相当慢.作为一个对技术有追求的爬虫菜鸡,狂补了一些爬虫知识.甚至看了 scrapy ...
- c# String常用方法