csp-s模拟测试58「Divisors」·「Market」·「Dash Speed」?

A. Divisors


大概平均下来每个数也就几千约数吧....,直接筛

B. Market



可以把时间离线下来,

考试没有想到将询问离线,用数组存算了算只能过200的点,拿了70

事实上背包后直接二分就好。。。

C. Dash Speed



好题,想到以前的一道题影子。

考场用单调队列多QJ了20分,然而没有想到并查集

线段树上分治?????

线段树上的节点表示在该权值在该区间内的边,每个节点开个vector即可

那么考虑区间查询和单点修改,

对于每个叶子节点,我们从上到下所经历的边其实就是可行的边

对于每个节点维护并查集,该联通块的最长直径和两个端点

在两个联通块相连时就是6种情况

即原直径或两联通块的端点所连的直径

但是对于每个点我们清空并查集会T,

那么我们采用按秩合并....

就是对每个节点编个排名,然后排名小的连向排名的节点,

然后我们开个栈,记录每次新连边后更改信息

void deld(int now){
    while(top>now){
          fa[st[top].to]=st[top].to;
          del[st[top].fa]-=del[st[top].to];
          len[st[top].fa]=st[top].val;
          lx[st[top].fa]=st[top].dian1;
          rx[st[top].fa]=st[top].dian2;
          top--;
    }
}

因为我们是将两联通块的fa节点相连,所以撤去后,儿子节点指向自己,父亲节点的del要减去

然后len,及直径两端点修改回原来的。

然后以为是栈,所以分治完后清空就好了。

因为倍增LCA超时了,所以改为ST求LCA,O(1)查询,跑的飞快

void DFS(int x,int father){
     pre[++dep]=x;R[dep]=deep[x];fir[x]=dep;
     for(int i=head[x];i;i=e[i].n){
         int to=e[i].to;
         if(to==father)continue;
         deep[to]=deep[x]+1;
         DFS(to,x);
         pre[++dep]=x;R[dep]=deep[x];
     }
}
void ST(){
     logg[0]=-1;
     for(int i=1;i<=dep;++i)logg[i]=logg[i>>1]+1;
     for(int j=1;j<=dep;++j)faa[j][0]=j;
     for(int j=1;(1<<j)<=dep;++j){
         for(int i=1;i+(1<<j)-1<=dep;++i){
             int x=faa[i][j-1];int y=faa[i+(1<<(j-1))][j-1];
             if(R[x]<R[y])faa[i][j]=x;
             else faa[i][j]=y;
         }
     }
}

每个节点遍历时添进pre数组里,回溯时也要添R数组记录深度,fir记录每个值的最小出现位置

倍增找两节点中深度最小的节点,注意现在节点是pre的序列节点

查询找fir[x],fir[y]这段区间的最小深度对应的节点

原文地址:https://www.cnblogs.com/Wwb123/p/11623346.html

时间: 2024-07-31 10:37:00

csp-s模拟测试58「Divisors」·「Market」·「Dash Speed」?的相关文章

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

模拟测试58

T1: 每个数至多有$2 \sqrt{m}$个约数,也就是说即使$n$很大,在数集中有倍数的数在$m \sqrt{a}$级别. 可以暴力筛出数集中每个数得约数,用hash表维护一下,可实现$O(1)$查询. 用$n$减去筛出的数个数即为答案中0的个数,但是注意超过$n$的数要删掉. 时间复杂度$O(m \sqrt{m})$. T2: 我们发现每个物品的花费很大,价值却很小,于是我们可以将价值做背包,求出每个花费对应的最小代价. 然后将询问离线排序,从时间较早的计划做起. 将所有商店也排序,从早到

csps模拟测试58

T1: 这好似我是乱搞过的. 和正解很像. 对于这些数,只有他们的因数才能对答案做贡献,别的都是0. 所以我就可以把每个数分解因数,然后把因数卡在一起. 没有的就是0,统计一下就完了. T2: 考试想到了没时间搞了, 做过一次. 条件答案互换,然后这回球出来的是花费必须为s的最少,你可以让花费至少是s的最少,然后就单调了,直接二分就行了. T3: 限制维护链并的题, 也做过一个, 先看到题中给的询问的范围和n同级. 所以可以考虑线段树分治,就是把边的取值打到线段树上, 然后dfs整棵树,让它在此

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

csp-s模拟测试94

csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间,$T3$写完暴力准备划水,突然发现特殊性质可写,$10$分钟拯救了$25$分. 80 03:24:46 70 03:24:58 65 03:25:10 215 03:25:10 没办法就是菜,退役也不暝目. A. 凉宫春日的忧郁 转成对数轻松过. B. 漫无止境的八月 取模到$K$大小的区间,$ha

微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」

前言 微信支付-微信H5外部浏览器支付「本文」微信H5内部浏览器支付「待写」PC端扫码支付「待写」 一直计划着写一写微信支付相关的文章,希望能加深一下自己的印象,拖了一天又一天… 最近终于空出时间来填坑了,我将文章分为微信H5外部浏览器支付.微信H5内部浏览器支付.PC端扫码支付三篇来写. 本篇是微信H5外部浏览器支付:支付时会唤起微信APP进行支付. 扫盲补充:关于微信H5支付,分为内部浏览器支付 + 外部浏览器支付,两者还是稍微有点点区别的,内部浏览器即在微信内打开网页,进行支付,支付调用由

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci