为什么直接做会WA 啊
查看原帖
为什么直接做会WA 啊
119062
Lates楼主2021/5/18 19:07

RT

根号分治,二分,没有用题解里LCT的做法。问问是不是假掉了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
inline int read(){
	register int x=0,f=0,ch=getchar();
	while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
	return f?-x:x;
}
const int MAX=1e5+5;
int n,w,T,a[MAX];
struct Q{
	int l,pos;
}q[MAX]; 
inline int cmp(Q A,Q B){return A.l<B.l;}
inline int abs(int x){return x<0?-x:x;}
inline int sol(int k){
	register int ret=1,mxa=a[1],mni=-1; 
	for(register int t,i=2;i<=n;++i){
		if(mni==-1){
			if(abs(a[i]-mxa)>k)++ret,mxa=a[i],mni=-1;
			else {
				t=mxa;
				mxa=max(a[i],t);
				mni=min(a[i],t); 
			}
		}else {
			if(a[i]>mxa)
				if(a[i]-mni>k)++ret,mxa=a[i],mni=-1;
				else mxa=a[i];
			if(a[i]<mni)
				if(mxa-a[i]>k)++ret,mxa=a[i],mni=-1;
				else mni=a[i];
		}
	}
	return ret-1;
}
int ans[MAX];
signed main(){
	n=read(),w=read(),T=read();
	for(register int i=1;i<=n;++i)a[i]=read();
	for(register int i=1;i<=T;++i)q[i]=(Q){w-read(),i};		
	sort(q+1,q+1+T,cmp);
	int P=sqrt(q[T].l*log2(q[T].l));
	for(register int i=1;i<=T;){
		if(q[i].l<=P){
			ans[q[i].pos]=sol(q[i].l);++i;
			continue;
		}
		register int tmp=sol(q[i].l),l=q[i].l,r=q[T].l,u=0,mid=0;
		while(l<=r){
			mid=l+r>>1;
			if(sol(mid)<=tmp)u=mid,l=mid+1;
			else r=mid-1;
		}
		for(;q[i].l<=u&&i<=T;++i)ans[q[i].pos]=tmp;
	}
	for(register int i=1;i<=T;++i)printf("%d\n",ans[i]);
	return 0;
}

2021/5/18 19:07
加载中...