MnZn奇怪做法爆零求调
查看原帖
MnZn奇怪做法爆零求调
728483
wwwidk1234楼主2024/9/7 23:28

思路:计算出时刻 titi+1t_i \sim t_{i+1} 的速度 viv_i,然后排个序。每次询问更改 ti1ti,titi+1t_{i-1} \sim t_i,t_i \sim t_{i+1} 和对应的速度,答案和前三大做个比较输出。

// Problem: T486086 「LAOI-6」区间测速
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/T486086?contestId=157920
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T>
inline void read(T &x){x=0;char ch=getchar();bool f=0;while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();if(f)x=-x;}
template <typename T,typename ...Args>
inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
template <typename T,typename ...Args>
inline void readn(T a[],int _){for(int i=1;i<=_;i++) read(a[i]);}
template <typename T>
inline void write(T x){if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+48);}
template <typename T,typename ...Args>
inline void write(T tmp,Args ...tmps){write(tmp);putchar(' ');write(tmps...);}
template <typename ...Args>
inline void writeln(Args ...tmps){write(tmps...);putchar('\n');}
constexpr int N=1e5+7;
struct node{ll x,t;int id;}a[N];//v[i]:a[i]到a[i+1]的速度
int id[N];
ll v[N];
inline ll calc(node x,node y)
{
	return abs((x.x-y.x)/(x.t-y.t));
}
int main()
{
	int n,Q;
	read(n,Q);
	for(int i=1;i<=n;i++) read(a[i].x,a[i].t),a[i].id=i;
	sort(a+1,a+n+1,[&](node X,node Y){return X.t<Y.t;});
	for(int i=1;i<=n;i++) id[a[i].id]=i;
	for(int i=1;i<n;i++) v[i]=calc(a[i],a[i+1]);
	sort(v+1,v+n,greater<ll>());
	// for(int i=1;i<=n;i++) cout<<v[i]<<' ';
	while(Q--)
	{
		int x,y,i;
		read(x,y);
		i=id[x];
		node tmp=a[i];
		ll v01=calc(a[i-1],tmp);
		ll v02=calc(a[i+1],tmp);
		cerr<<"t:"<<a[i-1].t<<' '<<tmp.t<<' '<<a[i+1].t<<endl;
		tmp.t=y;
		ll v1=calc(a[i-1],tmp);
		ll v2=calc(a[i+1],tmp);
		ll va=v[1],vb=v[2],vc=v[3];
		if(va==v01) va=v1,v1=v01=-1;
		if(vb==v01) vb=v1,v1=v01=-1;
		if(vc==v01) vc=v1,v1=v01=-1;
		if(va==v02) va=v2,v2=v02=-1;
		if(vb==v02) vb=v2,v2=v02=-1;
		if(vc==v02) vc=v2,v2=v02=-1;
		writeln(max({v1,v2,va,vb,vc}));
	}
	return 0;
}
/*
访问第i个监控:a[id[i]];
*/
2024/9/7 23:28
加载中...