Problem A 宇宙魔方

   有一个$N \times N \times N$的魔方,每一次操作可以整体转动该魔方,也可以对于一层整体+X。

   给出最后魔方的最终状态,其中有一个位置为-1。利用其它位置的信息输出这个-1具体表示的值。

   对于$100\%$的数据满足$1 \leq n\leq 100$

Self-correction:

  考场看错题,最后炸题,导致期望得分为0。

  不能把问题看的太简单,该思考的时候还是得多思考。

Solution1:

  标程给的解答是,将x层y行z列的点染色成$(x+y+z)\% n$,

  此时容易证明,同一个层上每行每列都是一个$[0,n-1]$的轮换。

  若将魔方转置,容易看出,同行,每列,每层都是一个$[0,n-1]$的轮换; 同列,每行,每层都是一个$[0,n-1]$的轮换。

  这样一来,如果我们对于一次+X的操作,虽然不同位置的值会发生改变,但是同一颜色的点的和仍然保持不变。

  最后,由于-1只占一个颜色,我们计算其他任意一种颜色位置上的权值和,直接减去-1那种颜色的权值和就是答案。

  时间复杂度为$O(n^3)$

Solution2 :

  一种比较美妙的做法是,可以将同一层上的+x,转化为若干次同一列或者同一行的操作。 (转置同理)

  这样,如果我们对于$(x,y,z)$是$-1$的位置,只需要利用容斥原理,利用同层、同列、同行构造的矩形就可以求解了。

  每个位置,同层、同列、同行,必然能构造出一个宽度为$1$的正方形,所以这样构造可以通过所有测试点。

  时间复杂度为$O(n^3)$

Code : 这个题目方法比较多我就不贴了....

Problem B 战争

  有$n$个点的图,点的标号为$[0,n-1]$,有$m$条边,求出图上严格单增最长路的长度。

  对于$100\%$的数据满足$1 \leq n,m\leq 5\times 10^4$ 

Self-correction:

  考场需要仔细,虽然这个题,看成了[1,n]还有$96$的好成绩。

  但是不排除毒瘤出题人,给你卡到0分。还是要多加注意....

Solution :

  考虑$f[i]$表示到第$i$点的最长连读单增最长路长度。

  那么按照边权排序之后,直接$dp$就没有后效性了。

  注意到,由于是严格单增,那么需要相同边权所连的点同时转移。

  复杂度是$O(n+m)$

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+;
  4. int n,m,tot;
  5. int t[N],f[N];
  6. struct Edge { int u,v,w;}e[N];
  7. bool cmp(Edge a,Edge b) { return a.w < b.w;}
  8. int main() {
  9. scanf("%d%d",&n,&m);
  10. for (int i=;i<=m;i++) {
  11. int u,v,w; scanf("%d%d%d",&u,&v,&w);
  12. e[++tot].u=u; e[tot].v=v; e[tot].w=w;
  13. }
  14. sort(e+,e++m,cmp);
  15. int last = ;
  16. for (int i=;i<=m;i++) if (i==m || e[i].w < e[i+].w) {
  17. for (int j=last+;j<=i;j++) t[e[j].u]=f[e[j].u],t[e[j].v]=f[e[j].v];
  18. for (int j=last+;j<=i;j++) {
  19. f[e[j].u]=max(f[e[j].u],t[e[j].v]+);
  20. f[e[j].v]=max(f[e[j].v],t[e[j].u]+);
  21. }
  22. last = i;
  23. }
  24. int ans = ;
  25. for (int i=;i<n;i++) ans=max(ans,f[i]);
  26. printf("%d\n",ans);
  27. return ;
  28. }

war.cpp

Problem C 和平

  考虑$n$个点的树,每条边有边权,处理$q$个询问。

  从$u$走到$v$的最短路径,如果不经过边权小于$w$的边,最远能走到那个节点。

  对于$100\%$的数据,满足$1 \leq n ,q \leq 10^5$

Solution :

  全场最可做题,二分+倍增的暴力人人都会。

  复杂度为$O(n {log_2}^2 n)$

Code :

  1. # pragma GCC optimize()
  2. # include<bits/stdc++.h>
  3. # define inf (2e9)
  4. using namespace std;
  5. const int N=2e5+;
  6. struct rec{ int pre,to,w; }a[N];
  7. int n,m,tot;
  8. int head[N],g[N][],d[N][],dep[N];
  9. void adde(int u,int v,int w) {
  10. a[++tot].pre=head[u];
  11. a[tot].to=v;
  12. a[tot].w=w;
  13. head[u]=tot;
  14. }
  15. void dfs(int u,int fa) {
  16. g[u][]=fa; dep[u]=dep[fa]+;
  17. for (int i=head[u];i;i=a[i].pre) {
  18. int v=a[i].to; if (v==fa) continue;
  19. d[v][]=a[i].w; dfs(v,u);
  20. }
  21. }
  22. int lca(int u,int v) {
  23. if (dep[u]<dep[v]) swap(u,v);
  24. for (int i=;i>=;i--)
  25. if (dep[g[u][i]]>=dep[v]) u=g[u][i];
  26. if (u==v) return u;
  27. for (int i=;i>=;i--)
  28. if (g[u][i]!=g[v][i]) u=g[u][i],v=g[v][i];
  29. return g[u][];
  30. }
  31. int dist(int u,int v) {
  32. int ret=inf;
  33. if (dep[u]<dep[v]) swap(u,v);
  34. for (int i=;i>=;i--)
  35. if (dep[g[u][i]]>=dep[v]) ret=min(ret,d[u][i]),u=g[u][i];
  36. if (u==v) return ret;
  37. for (int i=;i>=;i--)
  38. if (g[u][i]!=g[v][i]) {
  39. ret=min(ret,d[u][i]);
  40. ret=min(ret,d[v][i]);
  41. u=g[u][i],v=g[v][i];
  42. }
  43. return ret;
  44. }
  45. int Get(int u,int d) {
  46. for (int i=;i>=;i--) if (d>=(<<i)) {
  47. u=g[u][i]; d-=(<<i);
  48. }
  49. return u;
  50. }
  51. int work1(int u,int v,int w) {
  52. int l=,r=dep[v]-dep[u],ans;
  53. while (l<=r) {
  54. int mid = (l+r)>>;
  55. int to = Get(v,mid);
  56. if (dist(to,u)>=w) ans=mid,r=mid-;
  57. else l=mid+;
  58. }
  59. return Get(v,ans);
  60. }
  61. int work2(int u,int v,int w) {
  62. int l=,r=dep[u]-dep[v],ans;
  63. while (l<=r) {
  64. int mid = (l+r)>>;
  65. int to = Get(u,mid);
  66. if (dist(to,u)>=w) ans=mid,l=mid+;
  67. else r=mid-;
  68. }
  69. return Get(u,ans);
  70. }
  71. int work3(int u,int v,int w,int l) {
  72. int ret1=work2(u,l,w); if (ret1!=l) return ret1;
  73. int ret2=work1(l,v,w); return ret2;
  74. }
  75. int main() {
  76. // freopen("peace.in","r",stdin);
  77. // freopen("peace.out","w",stdout);
  78. scanf("%d%d",&n,&m);
  79. for (int i=;i<=n;i++) {
  80. int u,v,w; scanf("%d%d%d",&u,&v,&w);
  81. adde(u,v,w); adde(v,u,w);
  82. }
  83. memset(d,0x3f,sizeof(d));
  84. dfs(,);
  85. for (int i=;i<=;i++)
  86. for (int j=;j<=n;j++) {
  87. g[j][i]=g[g[j][i-]][i-];
  88. d[j][i]=min(d[j][i-],d[g[j][i-]][i-]);
  89. }
  90. while (m--) {
  91. int u,v,w; scanf("%d%d%d",&u,&v,&w);
  92. int l = lca(u,v);
  93. if (l == u) printf("%d\n",work1(u,v,w));
  94. else if (l == v) printf("%d\n",work2(u,v,w));
  95. else printf("%d\n",work3(u,v,w,l));
  96. }
  97. return ;
  98. }

peace.cpp

  

HGOI20191114 CSP模拟赛 反思的更多相关文章

  1. 『2019/4/9 TGDay2模拟赛 反思与总结』

    2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...

  2. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  3. CSP模拟赛游记

    时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...

  4. 【CSP模拟赛】Freda的迷宫(桥)

    题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过.  黄昏 ...

  5. CSP模拟赛2游记

    这次由于有课迟到30min,了所以只考了70min. 调linux配置调了5min,只剩下65min了. T1:有点像标题统计,但要比他坑一点,而且我就被坑了,写了一个for(int i=1;i< ...

  6. 2020.11.30【NOIP提高A组】模拟赛反思

    90,rk42 T1 考试的时候觉得可以贪心,就每次找到最大的,然后以它为根去遍历每个子树,求出其最大值,然后删去这个点.一直持续直到边删完,时间复杂度\(O(n^2)\),然后想了想链的情况,没有打 ...

  7. 【CSP模拟赛】Freda的旗帜

    题目描述  要开运动会了,Freda承担起了制作全校旗帜的工作.旗帜的制作方法是这样的:Freda一共有C种颜色的布条,每种布条都有无数个,你可以认为这些布条的长.宽.厚都相等,只有颜色可能不同.每个 ...

  8. 【csp模拟赛4】基站建设 (station.cpp)

    [题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...

  9. 【CSP模拟赛】starway(玄学建边 最小生成树)

    问題描述 小w伤心的走上了 Star way to heaven.   到天堂的道路是一个笛卡尔坐标系上一个n×m的长方形通道(顶点在(0,0))和(n,m)),小w从最左边任意一点进入,从右边任意一 ...

随机推荐

  1. pt-online-schema-change使用

    MySQL ddl 的问题现状 在 运维mysql数据库时,我们总会对数据表进行ddl 变更,修改添加字段或者索引,对于mysql 而已,ddl 显然是一个令所有MySQL dba 诟病的一个功能,因 ...

  2. gdb暂停或恢复程序的运行

    ref : https://blog.csdn.net/seu_lyr/article/details/9050657   一 暂停程序的运行: (一)GDB的暂停方式:断点(BreakPoint). ...

  3. 审计一套CMS中的SQL注入

    漏洞分为系统漏洞和应用漏洞,系统漏洞以二进制漏洞为代表,其挖掘难度较高需要对反汇编和操作系统原理深入理解,而除了系统漏洞以外还有一些应用漏洞,包括不限MySQL,Apache,为代表的Web漏洞,这里 ...

  4. MongoDB的复合唯一索引

    一 创建 JavaScript Shell db.room.ensureIndex({'floor':1,'num':1}) Spring Data @Data // lombok @Document ...

  5. C# switch语句的使用

    1  今天我们来学习switch 语句的使用,switch 语句和if else 类似 switch 语句主要的作用是用于来判断在规定条件下   根据你的选择来执行switch 语句下面case :的 ...

  6. css文本超出隐藏 显示三个点

    文本超出显示三个点一般分两种情况 一,单行文本超出隐藏 overflow:hidden; text-overflow:ellipsis; white-space:nowrap; 二,多行文本超出隐藏 ...

  7. element之table自定义表头

    1.实现效果 2.使用render-header可以自定义表头 <el-table-column prop="date" label="日期" sorta ...

  8. DICOM文件修改方法

    /// <summary> /// 读取dicom文件 /// </summary> /// <param name="srcdirectory"&g ...

  9. 【leetcode】617. Merge Two Binary Trees

    原题 Given two binary trees and imagine that when you put one of them to cover the other, some nodes o ...

  10. css 制作一个点

    aside li a:before { content: ''; display: inline-block; width: 4px; height: 4px; background-color: # ...