这份代码第五十行为什么会导致 RE?
  • 板块灌水区
  • 楼主不知名用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/4/8 18:30
  • 上次更新2024/4/8 20:36:33
查看原帖
这份代码第五十行为什么会导致 RE?
316358
不知名用户楼主2024/4/8 18:30

P8441。

#include<bits/stdc++.h>
#define mkp make_pair
#define int long long
using namespace std;

const int N = 1e5 + 10;

int n, c[N], ans[N], is[N];
inline void add(int a, int x){for(;a<=n;a+=(a&-a))c[a]+=x;}
inline int ask(int a){int b=0;for(;a;a-=(a&-a))b+=c[a];return b;}

multiset<pair<int,int> > S[N];

struct qq{int x, y, a, b;}qu[N*100];int cur;

inline void ad(int x1, int y1, int x2, int y2, int a)
{
//	printf("%d %d %d %dttt\n", x1, y1, x2, y2, a);
	qu[++cur] = {x1,y1,a,1}, qu[++cur] = {x2+1,y2+1,a,1};
	qu[++cur] = {x1,y2+1,-a,1}, qu[++cur] = {x2+1,y1,-a,1};
}
inline void da(int l1, int r1, int l2, int r2, int a){ad(r1+1,l2,r2,n,a);}

void ins1(int a, int l, int r, int k)
{
//	printf("%d %d %d %dsss\n", a, l, r, k);	
	auto it = S[a].lower_bound(mkp(l,r));
	assert(it!=S[a].begin());
	auto itt = prev(it);
	da(itt->first,itt->second,it->first,it->second,a*k);
}
void add(int a, int l, int r)
{
	auto p = mkp(l,r);
	auto it = S[a].lower_bound(p);
	if(it!=S[a].end()) ins1(a,it->first,it->second,-1);
	S[a].insert(p);
	it = S[a].upper_bound(p);
	if(it!=S[a].end()) ins1(a,it->first,it->second,1); 
	it = S[a].lower_bound(p);
	if(it!=S[a].end()) ins1(a,it->first,it->second,1);
}
void del(int a, int l, int r)
{
	auto p = mkp(l,r);
	auto it = S[a].upper_bound(p);
	if(it!=S[a].end()) ins1(a,it->first,it->second,-1);
	it = S[a].lower_bound(p);
	if(it!=S[a].end()) ins1(a,it->first,it->second,-1);
	if(it!=S[a].end()) S[a].erase(it);
	it = S[a].lower_bound(p);
	if(it!=S[a].end()) ins1(a,it->first,it->second,1);
}

inline void ins(int a, int l, int r)
{
	auto p = mkp(l,l);
	auto it = S[a].lower_bound(p);
	int L = l, R = r;
	if(it!=S[a].begin())
	{
		auto itt = it;itt--;
		if(itt->second>=l)
			L = itt -> first, R = max(R,itt->second), del(a,itt->first,itt->second);
	}
	for(;it!=S[a].end()&&R>=it->first;it++)
		R = max(R,it->second), del(a,it->first,it->second);
	add(a,L,R);
}

bool cmp(qq a,qq b){return a.x<b.x;}
void cdq(int l, int r)
{
	if(l==r) return;
	int mid = l + r >> 1, i, j;
	cdq(l,mid), cdq(mid+1,r);
	sort(&qu[l],&qu[mid]+1,cmp);
	sort(&qu[mid+1],&qu[r]+1,cmp);
	for(i=mid+1,j=l;i<=r;i++)
	{
		while(j<=mid&&qu[j].x<=qu[i].x)
		{
			if(qu[j].b==1) add(qu[j].y,qu[j].a);
			j++;
		}
		if(qu[i].b==2) ans[qu[i].a] += ask(qu[i].y);
	}
	for(i=l;i<j;i++) if(qu[i].b==1) add(qu[i].y,-qu[i].a);
}

signed main()
{
	int m, i;
	scanf("%*s%lld%lld", &n, &m);
	for(i=1;i<=N-10;i++) S[i].insert(mkp(0,0));
	for(i=1;i<=m;i++)
	{
		int op, l, r, x;
		scanf("%lld%lld%lld", &op, &l, &r);
		if(op==1) scanf("%lld", &x), ins(x,l,r);
		else qu[++cur] = {l,r,i,2}, is[i] = 1;
	}
//	for(i=1;i<=cur;i++) printf("%d %d %d %daaa\n", qu[i].x, qu[i].y, qu[i].a, qu[i].b);
	cdq(1,cur);
	for(i=1;i<=m;i++) if(is[i]) printf("%lld\n", ans[i]);
	return 0;
}

第五十行:if(it!=S[a].end()) S[a].erase(it);。

前面第 48 行有 it = S[a].lower_bound(p);,怎么回事呢。

没加。加了。

2024/4/8 18:30
加载中...