【扫描线】Gym - 101190E - Expect to Wait
假设初始人数为0,
将每个时刻在等待的人数写下来,就是求个和。
如果纵坐标看成人数,横坐标看成时间,就是求个面积。
因为初始人数不一定为零,所以离线后扫描线即可回答所有询问。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,e;
struct LINE{
int y,l,id;
}ls[200010];
bool cmp(const LINE &a,const LINE &b){
return a.y!=b.y ? a.y>b.y : a.l<b.l;
}
ll anss[100010];
int main(){
freopen("expect.in","r",stdin);
freopen("expect.out","w",stdout);
int x,y;
char op[4];
scanf("%d%d",&n,&m);
int now=0,last=1;
for(int i=1;i<=n;++i){
scanf("%s%d%d",op,&x,&y);
if(now>0 && i>1){
ls[++e]=(LINE){now,x-last};
}
if(op[0]=='+'){
now-=y;
}
else{
now+=y;
}
last=x;
}
if(now>0){
ls[++e]=(LINE){now,1000000001};
}
for(int i=1;i<=m;++i){
++e;
scanf("%d",&ls[e].y);
ls[e].id=i;
ls[e].l=0;
}
sort(ls+1,ls+e+1,cmp);
ll nowans=0;
int nowl=0;
int i=1;
for(;i<=e;++i){
if(ls[i].l==0){
anss[ls[i].id]=nowans;
}
if(ls[i].y>0 && ls[i].l==1000000001){
break;
}
nowl+=(ll)ls[i].l;
if(ls[i].y!=ls[i+1].y){
nowans+=(ll)(ls[i].y-ls[i+1].y)*(ll)nowl;
}
}
for(;i<=e;++i)if(ls[i].l==0){
anss[ls[i].id]=-1;
}
for(i=1;i<=m;++i){
if(anss[i]==-1){
puts("INFINITY");
}
else{
printf("%I64d\n",anss[i]);
}
}
return 0;
}
【扫描线】Gym - 101190E - Expect to Wait的更多相关文章
- Gym - 101982F Rectangles (扫描线+线段树)
链接:http://codeforces.com/gym/101982/attachments 思路: 问被覆盖次数为奇数次的矩阵的面积并 扫描线求矩阵面积并我们是上界赋为-1,下界赋为1,因为要求覆 ...
- Gym - 100781G Goblin Garden Guards (扫描线)
题意: n 只哥布林,每只哥布林都有一个位置坐标. m 个炮台,每个炮台都有一个位置坐标和一个攻击半径. 如果一个哥布林在任何一个炮台的攻击范围内,都会被杀死. 求最后没有被杀死的哥布林的数量. 这题 ...
- Gym 100733J Summer Wars 题解:灵活运用扫描线的思想
题意: 给你n个点,m个横着的线段.你能够横移这些线段,可是这些线段的相对位置不能改变.假设一个点,在它的正上方和和正下方都有线段(包含线段的终点).则这个点被视为被"屏蔽".问通 ...
- Gym 102028J 扫描线/二维差分 + 解方程
题意:有一个二维平面,以及n个操作,每个操作会选择一个矩形,使得这个二维平面的一部分被覆盖.现在你可以取消其中的2个操作,问最少有多少块地方会被覆盖? 思路:官方题解简洁明了,就不细说了:https: ...
- Gym - 101982F 扫描线+线段树
题目链接:https://codeforces.com/gym/101982/attachments 要你求覆盖奇数次的矩形面积并,每次更新时减去原先的值即可实现奇数次有效,下推时为保证线段长度不变左 ...
- Codeforces Gym 101480C - Cow Confinement(扫描线+线段树)
题面传送门 题意: 有一个 \(10^6\times 10^6\) 的地图.其中 \(m\) 个位置上有花,\(f\) 个矩形外围用栅栏围了起来.保证 \(f\) 个矩形两两之间没有公共点. \(q\ ...
- 【扫描线】Gym - 100781G - Goblin Garden Guards
平面上有100000个哥布林和20000个圆,问你不在圆内的哥布林有多少个. 将每个圆从左到右切2r+1次,形成(2r+1)*2个端点,将上端点记作入点,下端点记作出点,再将这些点和那些哥布林一起排序 ...
- GYM 101350 F. Monkeying Around
F. Monkeying Around time limit per test 2.0 s memory limit per test 256 MB input standard input outp ...
- expect用法
1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西. 注意: ...
随机推荐
- 大聊Python----生产消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式? 在线程世界里,生产者就是生产数 ...
- Nodejs mac版安装
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven ...
- poj 1837 Balance(背包)
题目链接:http://poj.org/problem?id=1837 Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- 集合框架源码学习之LinkedList
0-1. 简介 0-2. 内部结构分析 0-3. LinkedList源码分析 0-3-1. 构造方法 0-3-2. 添加add方法 0-3-3. 根据位置取数据的方法 0-3-4. 根据对象得到索引 ...
- perl模拟登录(1)
use WWW::Mechanize; my $ua = WWW::Mechanize->new(); $ua->post('http://localhost/dvwa/DVWA-mast ...
- C基础 如何得到文件长度
引言 有一天看见看到返回文件长度代码返回值都是long,就感觉怪怪的, 一般32位long最大也就2G. 而大文件太多了, 一个Dota2安装包估计都得10多G吧. 一般C得到文件长度代码 /* * ...
- git学习笔记三
1.每个分支的历史版本维护信息位置是.git/logs/refs/heads/master,这个位置的信息是文本文件,不是引用. harvey@harvey-Virtual-Machine:~/dem ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
- jdbc连接远程数据库进行操作
链接远程数据库的时候,要把获得链接的url进行修改 1 package com.test; import java.sql.Connection; import java.sql.DriverMana ...
- jstack 命令学习笔记
大部分内容转载自:Java命令学习系列(二)--Jstack jstack - 查看堆栈信息 jstack ( Stack Trace for java ) 命令主要作用就是为了查看堆栈信息.它可以用 ...