【bzoj3938】 Robot

http://www.lydsy.com/JudgeOnline/problem.php?id=3938 (题目链接)

题意

  给出数轴上$n$个点,有$m$个操作,在时间$t$让一个点以一定的速度移动,或者询问时间$t$时距离原点最远的点。

Solution

  超哥线段树。时间当做横坐标,负半轴的情况斜率和截距乘上$-1$再做一遍。

  话说我为什么要离散化=  =

细节

  LL

代码

// bzoj3938
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define eps 1e-8
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std;

const int maxn=1000010;
LL ans[maxn],a[maxn];
int n,m,cnt,tot,last[maxn],tim[maxn],q[maxn];
char ch[100];

struct seg {
	LL k,b,l,r;
	LL ch(LL x) {return k*x+b;}
}v[maxn];
struct node {int cov;seg mx;}tr[maxn<<2];
double X(seg a,seg b) {
	return a.k==b.k ? inf : 1.0*(a.b-b.b)/(b.k-a.k);
}

void insert(int k,int l,int r,int s,int t,seg g) {
	int mid=(l+r)>>1;
	if (l==s && r==t) {
		if (!tr[k].cov) tr[k].mx=g,tr[k].cov=1;
		else {
			seg a1=tr[k].mx,a2=g;double x=X(a1,a2);
			if (a1.ch(tim[l])<a2.ch(tim[l]) || (fabs(a1.ch(tim[l])-a2.ch(tim[l]))<eps && a1.k<a2.k)) swap(a1,a2);
			if (x<=tim[l] || x>=tim[r]) {tr[k].mx=a1;return;}
			if (x<=tim[mid]) tr[k].mx=a2,insert(k<<1,l,mid,s,mid,a1);
			else tr[k].mx=a1,insert(k<<1|1,mid+1,r,mid+1,t,a2);
		}
		return;
	}
	if (t<=mid) insert(k<<1,l,mid,s,t,g);
	else if (s>mid) insert(k<<1|1,mid+1,r,s,t,g);
	else insert(k<<1,l,mid,s,mid,g),insert(k<<1|1,mid+1,r,mid+1,t,g);
}
LL query(int k,int l,int r,int x) {
	if (l==r) return tr[k].cov ? tr[k].mx.ch(x) : 0;
	int mid=(l+r)>>1;LL t=0;
	if (x<=tim[mid]) t=query(k<<1,l,mid,x);
	else t=query(k<<1|1,mid+1,r,x);
	return tr[k].cov ? max(t,tr[k].mx.ch(x)) : t;
}
void clear(int k,int l,int r) {
	tr[k].cov=0;
	if (l==r) return;
	int mid=(l+r)>>1;
	clear(k<<1,l,mid);
	clear(k<<1|1,mid+1,r);
}

int main() {
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for (int i=1;i<=n;i++) v[++cnt]=(seg){0,a[i],0,-1},last[i]=cnt;
	for (int x,i=1;i<=m;i++) {
		scanf("%d",&tim[i]);
		scanf("%s",ch);
		if (ch[0]==‘c‘) {
			scanf("%d%lld",&x,&v[++cnt].k);
			v[last[x]].r=v[cnt].l=tim[i];v[cnt].r=-1;
			a[x]=v[last[x]].k*tim[i]+v[last[x]].b;
			v[cnt].b=a[x]-v[cnt].k*tim[i];
			last[x]=cnt;
		}
		if (ch[0]==‘q‘) q[++tot]=tim[i];
	}
	m=unique(tim,tim+1+m)-tim-1;
	for (int i=1;i<=cnt;i++) {
		if (v[i].r==-1) v[i].r=tim[m];
		int l=lower_bound(tim,tim+1+m,v[i].l)-tim;
		int r=lower_bound(tim,tim+1+m,v[i].r)-tim;
		insert(1,0,m,l,r,v[i]);
	}
	for (int i=1;i<=tot;i++)
		ans[i]=query(1,0,m,q[i]);
	clear(1,0,m);
	for (int i=1;i<=cnt;i++) {
		int l=lower_bound(tim,tim+1+m,v[i].l)-tim;
		int r=lower_bound(tim,tim+1+m,v[i].r)-tim;
		v[i].k*=-1;v[i].b*=-1;
		insert(1,0,m,l,r,v[i]);
	}
	for (int i=1;i<=tot;i++) ans[i]=max(ans[i],query(1,0,m,q[i]));
	for (int i=1;i<=tot;i++) printf("%lld\n",ans[i]);
	return 0;
}
时间: 2024-10-14 04:51:25

【bzoj3938】 Robot的相关文章

【朝花夕拾】Robot Framework实战演练之开篇

(原创文章,转载请注明出处.) 开博了,简单感慨两句. 前些年一直在做质量体系建设及团队管理的事,忽略了对测试技术热度的保持,这两年有幸重回开发测试第一线,颇感欣喜. 近期随着公司新业务的开展,需要快速组建一套自动化测试框架,用于开展接口及UI自动化测试.虽然自己也曾基于公司业务系统从无到有码过一套测试框架,但由于开发时的思想同时受限于公司业务及框架的适用性上,导致最终虽然框架可完美支持业务,但在易用性.兼容性及可扩展性方面依然存在一定问题,维护成本较高. 根据大牛的推荐,有幸结识RF开源框架.

【自动化测试】robot framwork的一点小发现

我们在搭建完robotframwork框架并开始打开火狐浏览器的时候,总会碰到打不开浏览器的问题.这次,分享一个常见的小问题. 这个问题呢,是因为火狐的版本更新频繁,导致selenium的版本跟不上导致的.当然,解决这个问题,你可以选择降低火狐版本,但是却会给自己造成一定的成本.所以有一个可以解决的方法,就是下载 geckodriver.exe 文件,这个文件有32bit和64bit,请不要下错版本了.下完这个文件之后,将这个文件放在Python的根目录即可.不过记住的是,Python的根目录已

【LeetCode】字符串 string(共112题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [3]Longest Substring Without Repeating Characters [5]Longest Palindromic Substring [6]ZigZag Conversion [8]String to Integer (atoi) [10]Regular Expression Matching [12]Integer to Roman

【LeetCode】深搜DFS(共85题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [104]Maximum Depth of Binary Tree [105]Construct Binary Tree from Preorder and Inorder

HDOJ1035 Robot Motion 【模拟】

Robot Motion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6079    Accepted Submission(s): 2844 Problem Description A robot has been programmed to follow the instructions in its path. Instruc

【BZOJ1408】[Noi2002]Robot DP+数学

[BZOJ1408][Noi2002]Robot Description Input Output Sample Input 3 2 1 3 2 5 1 Sample Output 8 6 75 HINT 90号机器人有10个老师,加上它自己共11个.其中政客只有15号:军人有3号和5号:学者有8个,它们的编号分别是:2,6,9,10,18,30,45,90. 题解:语文题,就是问你n的约数中μ(d)=0,1,-1时,φ(d)的和,其中令μ(1)=0,φ(2)=0 直接DP,令f[i][0/1]

【leetcode】657. Robot Return to Origin

Algorithm [leetcode]657. Robot Return to Origin https://leetcode.com/problems/robot-return-to-origin/ 1)problem There is a robot starting at position (0, 0), the origin, on a 2D plane. Given a sequence of its moves, judge if this robot ends up at (0,

【Codeforces 922D】Robot Vacuum Cleaner

[链接] 我是链接,点我呀:) [题意] 让你把n个字符串重新排序,然后按顺序连接在一起 使得这个组成的字符串的"sh"子序列最多 [题解] /* * 假设A的情况好于B * 也就对应了A排在B的前面 * 那么 * As*Bh>Ah*Bs ① * 现在假设B又比C来得好 * 那么有 * Bs*Ch>Bh*Cs ② * 由①可得 * As/Ah>Bs/Bh * 由②可得 * Bs/Bh>Cs/Ch * 那么有 * As/Ah>As/Ch * 即As*Ch&g

【Python】初学编程适合学Python?其有何用?

初学编程适合学Python?其有何用? 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多因素造成了,当然市场需求的重要因素.吴军博士对大数据流行的解释与python流行或许有些默契.数据一直以来都存在,只是在历史条件下,由于计算性能和技术发展的原因,与之匹配的数据处理技术还不是很先进,以至于很多数据被我们舍弃了.同样,python语言简洁流畅等多种优点,也会让第一次接触