唐诗の我
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)
与你的日常,便是奇迹

浙公网安备 33010602011771号