本机样例一答案正确,但是提交显示wa。求助
查看原帖
本机样例一答案正确,但是提交显示wa。求助
708098
game_start楼主2022/11/14 21:36
一眼看过去想着可以不用splay,采用数据离散化的动态开点线段树和multiset来写。跑出来最开始没有离散化最后一个样例me了,离散化之后全wa了,样例一自己本机跑出来答案一样的,为啥洛谷上过不了。最后有样例一及其答案,可以复制代码跑一下。
#include<bits/stdc++.h>
#define ll long long 
//#define int long long
#define endl "\n"
#define FAST std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
const int inf = 0x3f3f3f3f;
using namespace std;
struct node{
	int l,r,sum;
	int mx,mn;
	int son[2];
}tree[6000010];
int n,m,tot,root;
void update(int &id,int l,int r,int st){
	if(id==0){
		id=++tot;
		tree[id].l=l,tree[id].r=r;
		tree[id].mx=-inf,tree[id].mn=inf;
		tree[id].sum=0;
	}
	tree[id].sum++;
	if(l==r){
		tree[id].mx=tree[id].mn=l;
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=st)update(tree[id].son[0],l,mid,st);
	else update(tree[id].son[1],mid+1,r,st);
	if(tree[id].son[0]==0){
		tree[id].mx=tree[tree[id].son[1]].mx;
		tree[id].mn=tree[tree[id].son[1]].mn;
	}
	else if(tree[id].son[1]==0){
		tree[id].mx=tree[tree[id].son[0]].mx;
		tree[id].mn=tree[tree[id].son[0]].mn;
	}
	else{
		tree[id].mx=max(tree[tree[id].son[0]].mx,tree[tree[id].son[1]].mx);
		tree[id].mn=min(tree[tree[id].son[0]].mn,tree[tree[id].son[1]].mn);
	}
}
int query(int id,int l,int r,int type){
	if(type==1){//取极大值 
		if(id==0)return -inf;
		else if(tree[id].l>=l&&tree[id].r<=r)return tree[id].mx;
		else {
			int mid=(tree[id].l+tree[id].r)>>1;
			if(mid>=r)return query(tree[id].son[0],l,r,1);
			else if(mid<l)return query(tree[id].son[1],l,r,1);
			else return max(query(tree[id].son[0],l,r,1),query(tree[id].son[1],l,r,1));
		}
	}
	else{
		if(id==0)return inf;
		else if(tree[id].l>=l&&tree[id].r<=r)return tree[id].mn;
		else{
			int mid=(tree[id].l+tree[id].r)>>1;
			if(mid>=r)return query(tree[id].son[0],l,r,2);
			else if(mid<l)return query(tree[id].son[1],l,r,2);
			else return min(query(tree[id].son[0],l,r,2),query(tree[id].son[1],l,r,2));
		}
	}
}
vector<int>vec[500010];
multiset<int>st;
string s[500010];
int b[1000010],lk[500010][2],cnt;
int get_id(int x){
	return lower_bound(b+1,b+cnt+1,x)-b; 
}
signed main(){
	FAST
	int ans=inf;
	cnt=0;
	cin>>n>>m;
	for(int i=1,k;i<=n;i++){
		cin>>k;
		b[++cnt]=k;
		vec[i].push_back(k);
		//cout<<ans<<endl;
	}
	for(int i=2;i<=n;i++){
		st.insert(abs(vec[i][0]-vec[i-1][0]));
	}
	getline(cin,s[0]);
	for(int i=1;i<=m;i++){
		getline(cin,s[i]);
		if(s[i][0]=='I'){
			int sum=0;
			for(int j=7;j<s[i].length();j++){
				if(s[i][j]==' '){
					lk[i][0]=sum;
					sum=0;
				}
				else{
					sum=sum*10+s[i][j]-'0';
				}
			}
			b[++cnt]=sum;
			lk[i][1]=sum;
		}
	}
	sort(b+1,b+cnt+1);
	cnt=unique(b+1,b+cnt+1)-b-1;
//	for(int i=1;i<=cnt;i++)cout<<b[i]<<" ";
//	cout<<endl;
	for(int i=1,k;i<=n;i++){
		k=get_id(vec[i][0]);
		//cout<<"k: "<<k<<endl;
		int tt;
		tt=query(root,1,k,1);
		if(tt!=-inf)ans=min(ans,b[k]-b[tt]);
		tt=query(root,k,cnt,2);
		if(tt!=inf)ans=min(ans,b[tt]-b[k]);
		update(root,1,cnt,k);
		//cout<<"* "<<ans<<endl;
	}
	for(int i=1;i<=m;i++){
		int x,y;
		if(s[i][0]=='I'){
			x=lk[i][0],y=get_id(lk[i][1]);
			if(x<n){
				st.erase(st.find(abs(vec[x+1][0]-vec[x][vec[x].size()-1])));
				st.insert(abs(vec[x+1][0]-b[y]));
			}
			st.insert(abs(b[y]-vec[x][vec[x].size()-1]));
			vec[x].push_back(b[y]);
			int tt;
			tt=query(root,1,y,1);
			if(tt!=-inf)ans=min(ans,b[y]-b[tt]);
			tt=query(root,y,cnt,2);
			if(tt!=inf)ans=min(ans,b[tt]-b[y]);
			update(root,1,cnt,y);
		}
		else if(s[i][4]=='G'){
			auto it=st.begin();
			cout<<*it<<endl;
		}
		else cout<<ans<<endl;
	}
}

样例一

10 20
33 87024675 43512354 174049319 217561644 130536998 261073969 348098617 304586294 391610940
INSERT 1 21770567
INSERT 2 174060039
INSERT 2 43514251
MIN_GAP
INSERT 2 174060043
INSERT 2 65272338
MIN_SORT_GAP
INSERT 6 152314558
INSERT 6 261101532
MIN_GAP
INSERT 6 152314554
MIN_GAP
MIN_GAP
INSERT 1 152315265
MIN_GAP
INSERT 2 152299949
MIN_SORT_GAP
MIN_GAP
INSERT 8 435123234
INSERT 5 174083729

答案(这就是洛谷给的正确答案)

1897
4
27563
21759984
21759984
21759984
4
21770534

2022/11/14 21:36
加载中...