A
B

唐诗の我

8.20

  • 线段树尝试同时维护区间最小值和最小值下标的某些性质($if(tr[lid].min == tr[rid].min) $ $ return $ $ (a[tr[lid].id] < a[tr[rid].id]) $ \(?\) $ tr[rid] $ \(:\) \(tr[lid]\) )然后写假了(判断没加 \(a\) 数组)

  • 数组开到 \(N\) ,然后访问到 \(N - 1\) 导致莫名 \(RE\) 两次

  • 发现一种新的算法:异或哈希 ,详见这道题,通过异或哈希快速得到序列中这个数是不是出现了两次(如果区间 \([l,r]\) 的异或哈希值为 \(0\),则该序列中的数都出现了2的倍数次 ),这很好证明:因为两个相同的数异或值为 \(0\)

8.21

  • 写链式前向星写成
for(int h[x];i;i = nxt[i])
  • 十年OI一场空,不开 \(long\) \(long\) 见祖宗。

8.25

定义数组时把 \(N << 4\) 写成了 \(N < 4\) ,在本地编译过了。。。,甚至样例都过了。。。交上去全RE。它甚至连个警报都不给我。。。

8.27

没有取等导致爆炸: (100 pts -> 31 pts)

inline void ins(int &id,int l,int r,int pos)
{
	if(r < l) return;
	if(!id) id = ++ cnt;
	if(!tr[id].val)
	{
		tr[id].val = pos;
		return;
	}
	int mid = (l + r) >> 1;
	if(calc(pos,mid) < calc(tr[id].val,mid)) swap(tr[id].val,pos);
	if(k[pos] >= k[tr[id].val]) ins(tr[id].ls,l,mid,pos);
	else ins(tr[id].rs,mid + 1,r,pos);	
}

改成

inline void ins(int &id,int l,int r,int pos)
{
	if(r <= l) return;
	if(!id) id = ++ cnt;
	if(!tr[id].val)
	{
		tr[id].val = pos;
		return;
	}
	int mid = (l + r) >> 1;
	if(calc(pos,mid) < calc(tr[id].val,mid)) swap(tr[id].val,pos);
	if(k[pos] >= k[tr[id].val]) ins(tr[id].ls,l,mid,pos);
	else ins(tr[id].rs,mid + 1,r,pos);	
}

9.6

更改权值写成了

		if(op == '+') // 路径加
		{
			x = read();
			y = read();
			z = read();
			split(x,y);
			sum[y] = (sum[y] + z) % mod;
			laz1[y] = (laz1[y] + z) % mod;
			sum[y] = (sum[y] + z * siz[y]) % mod;
		}

应该是

		if(op == '+') // 路径加
		{
			x = read();
			y = read();
			z = read();
			split(x,y);
			val[y] = (val[y] + z) % mod;
			laz1[y] = (laz1[y] + z) % mod;
			sum[y] = (sum[y] + z * siz[y]) % mod;
		}

9.8

小技巧: rope (时间复杂度为 \(O(nlog_{n})\) )

支持插入、删除与查询操作。

使用可以类比 vector

rope op;

//修改
op.insert(0,1);
op.insert(1,2);
op.erase(1);
//查询
op[0];// op[0] = 2

9.14

学考报名没改班!
重铸24205荣耀!(bushi)

posted @ 2025-08-20 22:06  MyShiroko  阅读(19)  评论(0)    收藏  举报