【扫描线】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;
}

  

时间: 2024-10-06 22:35:48

【扫描线】Gym - 101190E - Expect to Wait的相关文章

Gym 100733J Summer Wars 题解:灵活运用扫描线的思想

题意: 给你n个点,m个横着的线段.你能够横移这些线段,可是这些线段的相对位置不能改变.假设一个点,在它的正上方和和正下方都有线段(包含线段的终点).则这个点被视为被"屏蔽".问通过随意平移我们能够遮住最多的点的数量. 解题思路: 首先把全部的点向右平移1000000个单位.然后那些线段位置不变,我们開始平移这些点,这样我们保证点向左移动的距离肯定是一个正数,方便处理. 这样我们仅仅要求出每一个点向左移动的距离后能够满足题目条件的集合W.然后在求出某个距离值在全部的集合中出现最多次数的

Gym - 100781G Goblin Garden Guards (扫描线)

题意: n 只哥布林,每只哥布林都有一个位置坐标. m 个炮台,每个炮台都有一个位置坐标和一个攻击半径. 如果一个哥布林在任何一个炮台的攻击范围内,都会被杀死. 求最后没有被杀死的哥布林的数量. 这题暴力加一些小小的优化可以爆过去...然后场上并不敢试. 标算是扫描线.炮台攻击范围内的每个横坐标都拉一个扫描线,把线的两端的点和哥布林的点一起加进一个数组. 然后排序,就会发现能被杀死的哥布林的点在一根线的两个端点之间. 直接扫一遍统计答案就可以了.注意存点的数组要开够. 另外就是...排序的时候

Gym 102028J 扫描线/二维差分 + 解方程

题意:有一个二维平面,以及n个操作,每个操作会选择一个矩形,使得这个二维平面的一部分被覆盖.现在你可以取消其中的2个操作,问最少有多少块地方会被覆盖? 思路:官方题解简洁明了,就不细说了:https://codeforces.com/blog/entry/63729. 此处重点记录一下两种做法的巧妙之处. 1:二维差分+解方程 二维差分:假设在矩形[(x1, y1), (x2, y2)]上加一个数,那么在(x1, y1), (x2 + 1, y2 + 1)加1, (x1, y2 + 1), (x

【扫描线】Gym - 100781G - Goblin Garden Guards

平面上有100000个哥布林和20000个圆,问你不在圆内的哥布林有多少个. 将每个圆从左到右切2r+1次,形成(2r+1)*2个端点,将上端点记作入点,下端点记作出点,再将这些点和那些哥布林一起排序(x第一关键字,y第二关键字,类型(入 哥布林 出)第三关键字),扫一遍就好了. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const double EPS=0.000

shell脚本交互:expect学习笔记及实例详解

最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是spawn: 后面加上需要执行的shell命令,比如说spawn sudo touch testfile 1.3 expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,Li

【BZOJ】1382: [Baltic2001]Mars Maps (线段树+扫描线)

1382: [Baltic2001]Mars Maps Time Limit: 5 Sec  Memory Limit: 64 MB Description 给出N个矩形,N<=10000.其坐标不超过10^9.求其面积并 Input 先给出一个数字N,代表有N个矩形. 接下来N行,每行四个数,代表矩形的坐标. Output 输出面积并 Sample Input 2 10 10 20 20 15 15 25 30 Sample Output 225 本以为是傻逼题,没想到不容易啊- 线段树+扫描

expect使用

有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用户交互很痛苦,expect能很好的解决这类问题. expect的核心是spawn expect send set spawn 调用要执行的命令 expect 等待命令提示信息的出现,也就是捕捉用户输入的提示: send 发送需要交互的值,替代了用户手动输入内容 set 设置变量值 interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了.如果没有这一句登录完成后会退出,而不是留在远程终端上. ex

expect 使用实例

shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh [email protected] expect "*password:" send "123\r" expect "*#"interact Expect是一个用来处理交互的命令.借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成.形象的说,ssh登录,ftp登录等都符合交互的定义.下文我们首先提出一个问题,然后介绍基础知四个

centos 7 expect + shell实现批量创建文件

这个问题好久了,一直没整理出来.记得还是上次面试的时候问到如何批量修改1000台机器的主机名.这里给出批量创建内容为Hello,名为1.txt的文件. 一.首先安装expect yum install -y expect 二.准备工作:(1)准备IP地址的列表.vim ip.txt 192.168.1.88 192.168.1.89 192.168.1.90 (2)准备要执行的命令.vim cmd.txt mkdir /tmp/test 三.脚本部分 #!/bin/bash passwd="12