20230422做题笔记
var code = "43cb9205-7395-4eb0-9c8e-f19cf8cad4fe"
T1
按时间排序即可
T2
三维偏序 cdq分治即可
T3
令每个元素对应坐标为$[i,j]$表示在$A$,$B$中的位置分别为i,j
询问操作就变成了在$[l1,r1][l2,r2]$构成的矩阵中有多少个点,就可以用二维前缀和
交换操作就相当于删点再加点
我们把这三种操作加上时间一维
那就变这样两种操作
$(t,x,y,1/-1)$ 在这个位置加点或删点
$(t,x,y)$询问在有几个$i$满足$t_i<=t;x_i<=x;y_i<=y$
可以用cdq分治实现
T4
对于某个元素$x$
它的$f$值等价于$\sum_{a_i=x} i-l_i$
那就把每个点看做$(l_i,i)$,贡献为$i-l_i$
询问操作就相当于看$x<=l_i;i<=y$的元素总贡献
对于修改操作
和T3一样,加一个时间维,用cdq分治就可以了
T5
略
T6
容易想到四次方暴力
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(t[i][j]=='?') continue;
for(int u=0;u<n;u++){
int p=(u+i)%n;
for(int v=0;v<m;v++){
notM[u][v]|=(t[i][j]!=s[p][(v+j)%m]);
}
}
}
}
发现最内层循环可以用$bitset$优化
令$k=t[i][j]$
如果$s[u][v]!=k$
那么$notM[u][v-j]=1$
那就设$(bitset)g[u][k]$表示第$u$行哪些位置不为k
于是变成这样
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(t[i][j]=='?') continue;
for(int u=0;u<n;u++){
int p=(u+i)%n;
notM[u]|=((g[p][k]>>j)|((g[p][k])<<(m-j)));
}
}
}
T7
考虑分治
对于每个分治区间,记录里面的点能否到达分治区间的左、右边
两个分治区间的点能否互相到达,可以枚举两区间相邻的两列
看是否有一对相邻的点,既能到左边的点,又能到右边的点
复杂度$O(n^3logn)$
区间的合并可以用$bitset$优化
复杂度$O(n^3/w*logn)$
T8
问题转化为求某个三角形最小边的最大值
从大到小枚举$d_{i,j}$
枚举时看$dp_i$ & $dp_j$是否有一位是$1$
有的话直接输出答案
枚举后把$dp_{i,j}=dp_{j,i}=1$
复杂度$O(n^3/w)$
T9
发现如果四个点在$P$同一侧时无法包含$P$
枚举$P$
再枚举其他点
极角扫描线
把统计形成夹角小于等于180的点
那多出的不包含的点集个数为$C_{cnt}^3$
最终答案为$5*C_n^5-res$
T10
法1
枚举一条边后,需要找到一个点
使点到线的距离$H=2*S/d$
当点是有序的时候,可以直接$lower\_bound$
发现两个点到一条线的相对距离发生改变,那这两点和这条线的斜率关系会发生改变
我们先把所有边先按斜率排序
再把点按到第一条边的距离排序
当边转移后,只有改变的两条边的端点,的$H$的顺序才会改变
法2
把所有值$%65536$
暴力计算,当等于后,映射回$long long$计算
常数大约是$1/48$,可以过
T11
1119G

浙公网安备 33010602011771号