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

posted @ 2023-04-22 11:15  hubingshan  阅读(20)  评论(0)    收藏  举报  来源