稳住阵脚。

还可以。

至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来。

对拍了,暴力都拍了。挺稳的。

但是其实也有波折,险些被卡内存。

如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大。

T1:Divisors

直接根号筛,拿map也能过。

遍历map直接begin和end啊。。。

  1. #include<cstdio>
  2. int Cnt[];
  3. struct hash_map{
  4. int cnt,fir[],l[],to[],w[];
  5. int &operator[](int x){if(x>Cnt[])return w[];int r=x%;
  6. for(int i=fir[r];i;i=l[i])if(to[i]==x)return w[i];
  7. l[++cnt]=fir[r];fir[r]=cnt;to[cnt]=x;return w[cnt];
  8. }
  9. }M;
  10. int main(){
  11. int m;scanf("%d%d",&Cnt[],&m);
  12. for(int i=,x;i<=m;++i){
  13. scanf("%d",&x);
  14. for(int j=;j*j<=x;++j)if(x%j==)M[j]++,M[x/j]+=(x!=j*j);
  15. }
  16. for(int i=;i<=M.cnt;++i)Cnt[M.w[i]]++;
  17. for(int i=;i<=m;++i)Cnt[]-=Cnt[i];
  18. for(int i=;i<=m;++i)printf("%d\n",Cnt[i]);
  19. }

hash_map 581B

hash_map的数组大小要记得计算空间

T2:Market

应该都能看出是个背包。

不读错题问题都不大。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int dp[][];
  4. vector<pair<int,int> >V[];
  5. int main(){
  6. int n,m,v,c,t;memset(dp[],0x3f,sizeof dp[]);
  7. scanf("%d%d",&n,&m);dp[][]=;
  8. while(n--)scanf("%d%d%d",&c,&v,&t),V[t].push_back(make_pair(c,v));
  9. for(int t=;t<=;++t){
  10. for(int v=;~v;--v)dp[t][v]=dp[t-][v];
  11. for(int S=;S<V[t].size();++S){
  12. int C=V[t][S].first,W=V[t][S].second;
  13. for(int v=;v>=W;--v)dp[t][v]=min(dp[t][v],dp[t][v-W]+C);
  14. }
  15. for(int v=;~v;--v)dp[t][v]=min(dp[t][v],dp[t][v+]);
  16. }
  17. while(m--)scanf("%d%d",&t,&c),printf("%d\n",upper_bound(dp[t],dp[t]+,c)-dp[t]-);
  18. }

稍短 641B

不离线询问的话不要开long long。会MLE。

T3:Dash Speed

好题。

考场上一直在想主席树,以为有50000有70000会卡两个log的。显然没有。

这题要处理对于每一个速度的答案。

先考虑li=1的特殊性质。

我们从大到小的考虑速度,这样的话就是一个不断解锁边的过程。

不断填边,求最长链。和模拟测试40《影子》的并查集做法一模一样。

如果li不是1呢?那就有删边操作了。然而直接做貌似不可撤销。

考虑分治。

如果我们现在要求解速度为1和2时的答案,那么一个暴力的思路就是:

把1能过的所有边连上,求解,撤销。把2能过的所有边连上,求解,撤销。

复杂度是n2的。

我们可以发现上面这个方法存在冗余。如果我们一开始就把1和2的边都连上,在求解1,2时不撤销这些边,就可以快一些了。

我们利用的是线段树的结构,我们现在考虑所有[3,5]的询问,于是加入l<=3&&r>=5的边。

然后是处理3的询问,再加入速度可以接受3的边,求解3,再撤销刚刚加入的这些边就好。。。

然后不断按mid分治下去直到叶节点就是答案。

怎么撤销?

每次修改一个数值时,往一个栈里放修改前的值,然后在线段树处理完某一个节点而回溯时,不断弹栈还原至搜索到线段树该节点之前即可。

倍增LCA并没有被卡T。

然而因为要撤销,所以按照原来那道题打路径压缩并查集是不可行的(过程中修改的点太多),为了保证复杂度,我们采取按秩合并。

按秩合并其实就是把并查集按照深度合并,深度小的往打的里面合并的话那么很大可能总深度不变,或者+1。

只用两棵树深度恰好相等时深度+1,其余时候深度还是原来树的深度。不知道为什么网上给的板子深度数组叫rk。

  1. int find(int k){return f[k]==k?k:find(f[k]);}
  2. int merge(int a,int b){
  3. int A=find(a),B=find(b);
  4. if(rk[A]>rk[B])f[B]=A;
  5. else f[A]=B,rk[B]+=(rk[A]==rk[B]);
  6. }

按秩合并大概的板子

然后就差不多了。

  1. #include<cstdio>
  2. #include<vector>
  3. #include<iostream>
  4. using namespace std;
  5. int n,m,fir[],l[],to[],cnt,ans[],u[],v[],L[],R[];
  6. void link(int a,int b){l[++cnt]=fir[a];to[cnt]=b;fir[a]=cnt;}
  7. int p1[],p2[],mx[],f[][],F[],rk[],dep[],stans[];
  8. int stp1[],stp2[],stmx[],stF[],strk[],o[],top,ANS;
  9. vector<int>V[];
  10. void insert(int p,int l,int r,int i){
  11. if(L[i]<=l&&r<=R[i]){V[p].push_back(i);return;}
  12. if(R[i]>l+r>>)insert(p<<|,(l+r>>)+,r,i);
  13. if(L[i]<=l+r>>)insert(p<<,l,l+r>>,i);
  14. }
  15. int find(int k){return F[k]==k?k:find(F[k]);}
  16. void dfs(int p,int fa){
  17. f[p][]=fa;dep[p]=dep[fa]+;F[p]=p1[p]=p2[p]=p;
  18. for(int i=;i<=;++i)f[p][i]=f[f[p][i-]][i-];
  19. for(int i=fir[p];i;i=l[i])if(to[i]!=fa)dfs(to[i],p);
  20. }
  21. int dt(int a,int b){
  22. int sub=dep[a]-dep[b],A=a,B=b;
  23. if(sub<)a^=b^=a^=b,sub=-sub;
  24. for(int i=;~i;--i)if(sub&<<i)a=f[a][i];
  25. if(a==b)return sub;
  26. for(int i=;~i;--i)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];
  27. return dep[A]+dep[B]-*dep[f[a][]];
  28. }
  29. void copy(int x){++top;o[top]=x;stp1[top]=p1[x];stp2[top]=p2[x];stmx[top]=mx[x];stF[top]=F[x];strk[top]=rk[x];stans[top]=ANS;}
  30. void recover(){int x=o[top];mx[x]=stmx[top];F[x]=stF[top];ANS=stans[top];p1[x]=stp1[top];p2[x]=stp2[top];rk[x]=strk[top];--top;}
  31. void merge(int i){//printf("merge:%d %d\n",u[i],v[i]);
  32. int x=u[i],y=v[i],X=find(x),Y=find(y);
  33. int mdt,mp1,mp2,Ldt,Lp,Rdt,Rp,res;
  34. if(mx[X]>mx[Y])mdt=mx[X],mp1=p1[X],mp2=p2[X];
  35. else mdt=mx[Y],mp1=p1[Y],mp2=p2[Y];
  36. Ldt=dt(p1[X],x);res=dt(p2[X],x);
  37. if(Ldt>res)Lp=p1[X];else Ldt=res,Lp=p2[X];
  38. Rdt=dt(p1[Y],y);res=dt(p2[Y],y);
  39. if(Rdt>res)Rp=p1[Y];else Rdt=res,Rp=p2[Y];
  40. copy(X);copy(Y);
  41. if(rk[X]>rk[Y])X^=Y^=X^=Y;rk[Y]+=(rk[X]==rk[Y]);
  42. if(Ldt+Rdt+>mdt)mx[Y]=Ldt+Rdt+,p1[Y]=Lp,p2[Y]=Rp;
  43. else mx[Y]=mdt,p1[Y]=mp1,p2[Y]=mp2;
  44. F[X]=Y;ANS=max(ANS,mx[Y]);//printf("ANS:%d\n",ANS);
  45. }
  46. void Divide_and_Conquer(int p,int l,int r){int re=top;//printf("%d %d\n",l,r);
  47. for(int i=;i<V[p].size();++i)merge(V[p][i]);
  48. if(l==r){ans[l]=ANS;goto ed;}
  49. Divide_and_Conquer(p<<,l,l+r>>);
  50. Divide_and_Conquer(p<<|,(l+r>>)+,r);
  51. ed: while(top>re)recover();
  52. }
  53. int main(){//freopen("t3.in","r",stdin);freopen("t3.out","w",stdout);
  54. scanf("%d%d",&n,&m);
  55. for(int i=;i<n;++i)scanf("%d%d%d%d",&u[i],&v[i],&L[i],&R[i]),link(u[i],v[i]),link(v[i],u[i]),insert(,,n,i);
  56. dfs(,);Divide_and_Conquer(,,n);
  57. int v;while(m--)scanf("%d",&v),printf("%d\n",ans[v]);
  58. }

稍长

[考试反思]1003csp-s模拟测试58:沉淀的更多相关文章

  1. [考试反思]0718 NOIP模拟测试5

    最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...

  2. [CSP-S模拟测试58]题解

    以后题解还是单独放吧. A.Divisors 根号筛求所有数的因子,扫一遍去重统计即可. #include<cstdio> #include<iostream> #includ ...

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

    A. Divisors   大概平均下来每个数也就几千约数吧....,直接筛 B. Market 可以把时间离线下来, 考试没有想到将询问离线,用数组存算了算只能过200的点,拿了70 事实上背包后直 ...

  4. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  5. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  6. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  7. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  8. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

  9. [考试反思]0816NOIP模拟测试23

    210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...

随机推荐

  1. MongoDB 学习笔记之 基本CRUD

    Mongo 命令: show databases/dbs; use test; show tables/collections; db.help() db.createCollection('user ...

  2. WebSocket协议与抓包

    WebSocket协议 WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器 ...

  3. http post 请求,带参数,带请求头

    #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json url = 'http://............ ...

  4. javascript关键字typeof、instanceof、constructor判断类型

    鉴于 ECMAScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型.对于这个问题,JavaScript 也提供了多种方法,但遗憾的是,不同的方法得到的结果参差不齐. 下面介绍常用的几 ...

  5. kali系统

    打开终端分别输入下面两条命令: update-alternatives --install /usr/bin/python python /usr/bin/python2 100 update-alt ...

  6. 安装高可用Hadoop生态 (一 ) 准备环境

    为了学习Hadoop生态的部署和调优技术,在笔记本上的3台虚拟机部署Hadoop集群环境,要求保证HA,即主要服务没有单点故障,能够执行最基本功能,完成小内存模式的参数调整. 1.    准备环境 1 ...

  7. Numpy数组解惑

    参考: 理解numpy的rollaxis与swapaxes函数:https://blog.csdn.net/liaoyuecai/article/details/80193996 Numpy数组解惑: ...

  8. mac安装flask

    1.1使用虚拟环境 输入以下命令可以检查系统是否安装了 virtualenv: $ virtualenv --version 大多数 Linux 发行版都提供了 virtualenv 包.例如,Ubu ...

  9. .NET Core使用App.Metrics监控消息队列(一):初探

    一.简介 App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标.App Metrics可以在.NET Core或也支持.NET 4.5.2的完整.NET框架上运行. A ...

  10. Java 8 Optional:优雅地避免 NPE

    本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPo ...