警钟のbfs
查看原帖
警钟のbfs
1153677
Treap_Kongzs楼主2024/7/21 00:45

我没研究过心理学,但你只WA/TLE前十个点时,请你耐心一点,不要搞暴戾语言,禁赛三年:

  1. 检查排序函数,我用的是:
bool operator <(interval a,interval b)
{
	if(belong[a.l]!=belong[b.l])return belong[a.l]<belong[b.l];
	else if(belong[a.r]!=belong[b.r])return belong[a.r]<belong[b.r];
	else return a.time<b.time;
}
  1. 检查逗霸的update()update()(虽然我不这么叫),我之前有一个笔误:
void travel(int t,int i)
{
	if(ops[t].pos>=querys[i].l&&ops[t].pos<=querys[i].r)
	{
		del(arr[ops[t].pos]);
		add(ops[t].val);
	}
	swap(ops[t].val,arr[ops[t].pos]);
}

然而我的tt是时间指针,导致调用的++t++t和t−−t--全失效了,调了三天嘞。

正确姿势:

void travel(int poss,int i)
{
	if(ops[poss].pos>=querys[i].l&&ops[poss].pos<=querys[i].r)
	{
		del(arr[ops[poss].pos]);
		add(ops[poss].val);
	}
	swap(ops[poss].val,arr[ops[poss].pos]);
}
  1. 检查add()add()、del()del()与你传的参数之间的关系,如果你的add()、del()add()、del()如下所示:
void add(int pos)
{
	if(cnt[pos]==0)res++;
	cnt[pos]++;
}

void del(int pos)
{
	cnt[pos]--;
	if(cnt[pos]==0)res--;
}

请你务必检查调用,它应该如下所示:

while(l>querys[i].l)add(arr[--l]);
while(r>querys[i].r)del(arr[r--]);
while(r<querys[i].r)add(arr[++r]);
while(l<querys[i].l)del(arr[l++]);

请认真思考arr[i]arr[i]和ii所代表的意义

  1. 本着统一传入的询问数据的目的,将时间修改写在位置修改后面是个更优的选择。如:
while(l>querys[i].l)add(arr[--l]);
while(r>querys[i].r)del(arr[r--]);
while(r<querys[i].r)add(arr[++r]);
while(l<querys[i].l)del(arr[l++]);
while(t<querys[i].time)travel(++t,i);
while(t>querys[i].time)travel(t--,i);
ans[querys[i].id]=res;

CSP-S 2024 rp++

NOIP 2024 rp++

HNOI 2025 rp++

NOI 2025 rp++

2024/7/21 00:45
加载中...