访问到动态数组的非法下标不会报re吗
查看原帖
访问到动态数组的非法下标不会报re吗
523864
paradoxxd楼主2021/11/15 22:44

一直wa60...
对着代码看了半天发现是while访问到动态数组外面去 然后update了些奇怪的数据的问题
话说访问到动态数组洛谷测评机不会报re还运行下去吗...

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
struct inp{
	int val;
	int l,r;
};
struct node{
	int id,val;
};
vector<node>v;
vector<node>v2;
bool cmp(node a,node b){
	return a.val<b.val;
}
bool cmp1(inp a,inp b){
	return a.r<b.r;
}
struct{
	long long val,l,r;
}st[maxn*4];
inline void pushup(int rt){
	st[rt].val=st[rt*2].val+st[rt*2+1].val;
}
void build(int l,int r,int rt){
	st[rt].l=l;
	st[rt].r=r;
	if(l==r)
		return;
	int m=l+r>>1;
	build(l,m,rt*2);
	build(m+1,r,rt*2+1);
}
long long query(int rt,int s,int e){
	int l=st[rt].l;
	int r=st[rt].r;
	if(s<=l&&r<=e) return st[rt].val;
	if(e<l||r<s) return 0;
	return query(rt*2,s,e)+query(rt*2+1,s,e);
}
void update(int rt,int s){
	int l=st[rt].l;
	int r=st[rt].r;
	if(l==r){
		st[rt].val++;
		return;
	}
	int m=l+r>>1;
	if(s<=m) update(rt*2,s);
	else update(rt*2+1,s);
	pushup(rt);
}
vector<inp>ipt;
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	int i,j;
	build(1,n,1);
	v.clear();
	int tmp;
	for(i=1;i<=n;i++){
		scanf("%d",&tmp);
		v.push_back({i,tmp});
	}
	sort(v.begin(),v.end(),cmp);
	v2.push_back({min(v[0].id,v[1].id),max(v[0].id,v[1].id)});
	v2.push_back({min(v[n-2].id,v[n-1].id),max(v[n-2].id,v[n-1].id)});
	for(i=1;i<v.size()-1;i++){
		if(v[i].val-v[i-1].val==v[i+1].val-v[i].val){
			v2.push_back({min(v[i-1].id,v[i].id),max(v[i-1].id,v[i].id)});
			v2.push_back({min(v[i].id,v[i+1].id),max(v[i].id,v[i+1].id)});
		}
		else if(v[i].val-v[i-1].val<v[i+1].val-v[i].val){
			v2.push_back({min(v[i-1].id,v[i].id),max(v[i-1].id,v[i].id)});
		}
		else{
			v2.push_back({min(v[i].id,v[i+1].id),max(v[i].id,v[i+1].id)});
		}
	}
	int l,r;
	long long ans=0;
	sort(v2.begin(),v2.end(),cmp);
	for(i=1;i<=m;i++){
		scanf("%d%d",&l,&r);
		ipt.push_back({i,l,r});
	}
	sort(ipt.begin(),ipt.end(),cmp1);
	int op1=0,op2=0;
	for(auto it:ipt){
		while(it.r>=v2[op2].val){//<---problem
			update(1,v2[op2].id);
			op2++;
			if(op2==v2.size()) break;
		}
		if(it.l==it.r)
			continue;
		ans+=1ll*it.val*query(1,it.l,it.r);
	}
	printf("%lld\n",ans);
}
2021/11/15 22:44
加载中...