首页 > 其他分享 >P8477 「GLR-R3」春分 题解

P8477 「GLR-R3」春分 题解

时间:2023-06-23 18:33:15浏览次数:45  
标签:lfloor frac 题解 P8477 rfloor times ge 块板 GLR

更好的阅读体验

牛逼逼题。

Subtask 1

直接暴力,每个实验配一块板。

需要 \(n^2\) 块板。

cout << n * n << '\n';
for (int i = 1; i <= n; ++i) {
  for (int j = 1; j <= n; ++j) {
    cout << "1 " << i << ' ' << ++c << ' ' << j << '\n';
  }
}

Subtask 2

注意到我们可以给每一种溶液配一块专属板,实验时挑出两种溶液配的板拼在一起即可。

需要 \(2n\) 块板。

cout << 2 * n << '\n';
for (int i = 1; i <= n; ++i) {
  for (int j = 1; j <= n; ++j) {
    cout << "2 " << i << ' ' << i << ' ' << n + j << ' ' << j << '\n';
  }
}

Subtask 3

考虑分组,我们把右边的溶液平均分为两组,记作 \(R_0\) 和 \(R_1\),左边的溶液记作 \(L\)

那么我们考虑给 \(L\) 中每组溶液配一块专属板,这里需要 \(n\) 块板,然后给 \(R_0\) 中每组溶液配一块板,完成 \(L\times R_0\) 中的实验。

这时情况是这样的:

sub3-1

我们考虑复用 \(R_0\) 中的板,翻转后给 \(R_1\) 完成 \(L\times R_1\) 中的实验即可。

这时需要用 \(\lceil\frac{n}{2}\rceil+n\) 块板,会被卡。

发现 \(R_0\) 中多出来的那块板其实根本不需要,因为污染的地方只是内侧。而在处理 \(L\times R_1\) 里的实验时我们不需要内侧。

于是就只要 \(\lfloor\frac{n}{2}\rfloor+n\) 块板了。

\(\lceil\frac{n}{2}\rceil+n\):

cout << (n + 1) / 2 + n << '\n';
for (int i = 1; i <= n; ++i) {
  for (int j = 1; j <= (n + 1) / 2; ++j) {
    cout << "2 " << i << ' ' << i << ' ' << n + j << ' ' << j << '\n';
  }
}
for (int i = 1; i <= n; ++i) {
  for (int j = (n + 1) / 2 + 1; j <= n; ++j) {
    cout << "2 " << i << ' ' << i << ' ' << -(n / 2 + j) << ' ' << j << '\n';
  }
}

\(\lfloor\frac{n}{2}\rfloor+n\):

cout << n / 2 + n << '\n';
for (int i = 1; i <= n; ++i) {
  for (int j = 1; j <= n / 2; ++j) {
    cout << "2 " << i << ' ' << i << ' ' << n + j << ' ' << j << '\n';
  }
}
if (n & 1) {
  for (int i = 1; i <= n; ++i) {
    cout << "1 " << i << ' ' << i << ' ' << n / 2 + 1 << '\n';
  }
}
for (int i = 1; i <= n; ++i) {
  for (int j = (n + 1) / 2 + 1; j <= n; ++j) {
    cout << "2 " << i << ' ' << i << ' ' << -(n / 2 + j) << ' ' << j << '\n';
  }
}

Subtask 4

Subtask 3 最劣的地方在于 \(L\) 配板的右边本来都是干净的,结果被 \(R_0\) 配板污染了,这显然不是我们的意图。

考虑把 \(L,R\) 两边都均分成 \(3\) 组。给 \(L_0,L_1,L_2,R_0\) 各分配一块板。

那么第一步显然是把 \(L\times R_0\) 弄完。

sub4-1

然后我们考虑将 \(L_2\) 的板拿给 \(R_1\) 用,然后将 \((L_0+L_1)\times R_1\) 弄完。

但这样会导致 \(L_0+L_1\) 的配板被污染了,很劣。

考虑 \(R_0\) 的配板,我们让它充当中间人,将干净的一面对着 \(L_0+L_1\),脏的一面对着 \(R_1\),于是 \(L_0+L_1\) 依然是干净的。

sub4-2

同样的,我们再把 \(L_1\) 的板给 \(R_2\) 用,然后用同样的方式处理 \(L_0\times R_2\)

sub4-3

我们还剩下 \(L_2\times R_1+(L_1+L_2)\times R_2\) 没做,随便排列组合一下就行:

sub4-4

需要满足 \(s_{L_2}\ge s_{R_1},s_{L_1}\ge s_{R_2},s_{R_0}\ge s_{L_2},s_{L_0}\ge s_{L_1}\),取:

\[s_{L_1}=s_{R_2}=\lfloor\frac{n}{3}\rfloor\\[5px] s_{L_2}=s_{R_1}=\lfloor\frac{n+1}{3}\rfloor\\[5px] s_{L_0}=s_{R_0}=\lceil\frac{n}{3}\rceil \]

即可。

sl1 = sr2 = n / 3;
sl2 = sr1 = (n + 1) / 3;
sl0 = sr0 = (n + 2) / 3;
for (int i = 1; i <= sl0; ++i) {
  l0[i] = ++c;
}
for (int i = 1; i <= sl1; ++i) {
  l1[i] = ++c;
}
for (int i = 1; i <= sl2; ++i) {
  l2[i] = ++c;
}
for (int i = 1; i <= sr0; ++i) {
  r0[i] = ++c;
}
cout << c << '\n';
for (int j = 1; j <= sr0; ++j) {
  for (int i = 1; i <= sl0; ++i) {
    cout << "2 " << i << ' ' << l0[i] << ' ' << r0[j] << ' ' << j << '\n';
  }
  for (int i = 1; i <= sl1; ++i) {
    cout << "2 " << sl0 + i << ' ' << l1[i] << ' ' << r0[j] << ' ' << j << '\n';
  }
  for (int i = 1; i <= sl2; ++i) {
    cout << "2 " << sl0 + sl1 + i << ' ' << l2[i] << ' ' << r0[j] << ' ' << j << '\n';
  }
}
for (int j = 1; j <= sr1; ++j) {
  for (int i = 1; i <= sl0; ++i) {
    cout << "3 " << i << ' ' << l0[i] << ' ' << r0[1] << ' ' << l2[j] << ' ' << sr0 + j << '\n';
  }
  for (int i = 1; i <= sl1; ++i) {
    cout << "3 " << sl0 + i << ' ' << l1[i] << ' ' << r0[1] << ' ' << l2[j] << ' ' << sr0 + j << '\n';
  }
}
for (int j = 1; j <= sr2; ++j) {
  for (int i = 1; i <= sl0; ++i) {
    cout << "3 " << i << ' ' << l0[i] << ' ' << r0[1] << ' ' << l1[j] << ' ' << sr0 + sr1 + j << '\n';
  }
}
for (int i = 1; i <= sl1; ++i) {
  for (int j = 1; j <= sr2; ++j) {
    cout << "2 " << sl0 + i << ' ' << -l0[i] << ' ' << l1[j] << ' ' << sr0 + sr1 + j << '\n';
  }
}
for (int i = 1; i <= sl2; ++i) {
  for (int j = 1; j <= sr1; ++j) {
    cout << "2 " << sl0 + sl1 + i << ' ' << r0[i] << ' ' << l2[j] << ' ' << sr0 + j << '\n';
  }
  for (int j = 1; j <= sr2; ++j) {
    cout << "2 " << sl0 + sl1 + i << ' ' << r0[i] << ' ' << l1[j] << ' ' << sr0 + sr1 + j << '\n';
  }
}

Subtask 5~7

观察 sub 4,我们发现其实只需要额外拿一块中间板就可以保持左右两边板的状态,于是我们可以空出来一个 \(R_0\) 来干一些奇奇怪怪的事情。

考虑将 \(L\) 分为 \(2\) 组,\(R\) 分为 \(3\) 组。给 \(L_0,R_0,R_1\) 各分配一块板。

首先第一步显然还是将 \(L_0\times(R_0+R_1)\) 的实验做了:

sub7-1

然后我们将 \(R_0\) 翻转后给 \(R_2\) 用,额外用一块中间板来隔绝 \(L_0\) 和 \(R_2\),处理 \(L_0\times R_2\):

sub7-2

翻转 \(L_0\) 给 \(L_1\) 用,处理 \(L_1\times R_1\):

sub7-3

最后把 \(R_1\) 的板翻转后给 \(R_0\),处理 \(L_1\times(R_0+R_2)\) 即可:

sub7-4

需要 \(s_{R_1}\ge s_{R_0}\ge s_{R_2},s_{L_0}\ge s_{L_1}\),取

\[s_{L_0}=\lceil\frac{n}{2}\rceil,s_{L_1}=\lfloor\frac{n}{2}\rfloor\\[5px] s_{R_0}=\lfloor\frac{n+1}{3}\rfloor,s_{R_1}=\lceil\frac{n}{3}\rceil,s_{R_2}=\lfloor\frac{n}{3}\rfloor \]

即可。

代码实际上比 sub 4 还要好写一点。

for (int i = 1; i <= (sl = (n + 1) / 2); ++i) {
  l[i] = ++c;
}
for (int i = 1; i <= (sr0 = (n + 1) / 3); ++i) {
  r0[i] = ++c;
}
for (int i = 1; i <= (sr1 = (n + 2) / 3); ++i) {
  r1[i] = ++c;
}
sr2 = n / 3;
x = ++c;
cout << c << '\n';
for (int i = 1; i <= sl; ++i) {
  for (int j = 1; j <= sr0; ++j) {
    cout << "2 " << i << ' ' << l[i] << ' ' << r0[j] << ' ' << j << '\n';
  }
  for (int j = 1; j <= sr1; ++j) {
    cout << "2 " << i << ' ' << l[i] << ' ' << r1[j] << ' ' << sr0 + j << '\n';
  }
}
for (int i = 1; i <= sl; ++i) {
  for (int j = 1; j <= sr2; ++j) {
    cout << "3 " << i << ' ' << l[i] << ' ' << x << ' ' << -r0[j] << ' ' << sr0 + sr1 + j << '\n';
  }
}
for (int i = 1; i <= n / 2; ++i) {
  for (int j = 1; j <= sr1; ++j) {
    cout << "3 " << sl + i << ' ' << -l[i] << ' ' << -x << ' ' << r1[j] << ' ' << sr0 + j << '\n';
  }
}
for (int i = 1; i <= n / 2; ++i) {
  int d = sl + i;
  for (int j = 1; j <= sr0; ++j) {
    cout << "2 " << d << ' ' << -l[i] << ' ' << -r1[j] << ' ' << j << '\n';
  }
  for (int j = 1; j <= sr2; ++j) {
    cout << "2 " << d << ' ' << -l[i] << ' ' << -r0[j] << ' ' << sr0 + sr1 + j << '\n';
  }
}

record

code

标签:lfloor,frac,题解,P8477,rfloor,times,ge,块板,GLR
From: https://www.cnblogs.com/bykem/p/17499473.html

相关文章

  • WGCLOUD在windows启动server - dos窗口显示乱码的问题解决
    首先,这个乱码没有影响,忽略即可这个是windows窗口编码导致的,不会影响程序运行,server/log下日志文件没有出现乱码,我们主要看日志文件如果我们想处理,也可以的,修改server/start.bat,添加一行命令,chcp65001,如下echo%cd%start/d"%cd%"wgcloud-daemon-release.exechcp65001java-......
  • AT_abc118_d题解
    ATLuogu题目描述有\(n\)根火柴\(m\)种数字,数字\(1,2,3,4,5,6,7,8,9\)分别需要\(2,5,5,4,5,6,3,7,6\)根火柴,要求\(n\)根火柴全部都用完且拼成的数字最大,输出这个数字。输入格式第一行两个整数\(n\),\(m\);第二行\(m\)个整数,分别为\(a_1,a_2,...,a_m\)(即\(m\)种......
  • P2596 [ZJOI2006]书架 题解
    题目传送门:link。FHQ-Treap解题的关键在于如何来求出一本书上面有多少本书,但考虑到我们里面没有像权值一样的东西来让我们用按值分裂来完成这个操作,所以考虑用按排名分裂来实现。我们按照先后顺序把所有的书都给插入到平衡树里面,根据二叉搜索树的性质,当前结点的所有左子树的结......
  • Linux Nacos2.2.0版本集群搭建,常见报错问题解决
    准备:服务器,nacos,mysql,nginx,java,mavenNacos官网:https://nacos.io下载地址github:https://github.com/alibaba/nacos相关版本问题,见nacos官网手册查看集群配置图:官方的: 本次搭建集群配置图:开始搭建:修改nacos的配置文件“application.properties,cluster.conf.ex......
  • 金九银十首战告捷,五年Android开发工程师面试经验分享(附面试题解析)
    笔者从前期准备到所有面试结束,花费了差不多3个月的时间。真可谓“面试造火箭,工作拧螺丝”,面试过程真的很累很辛苦。笔者面了很多公司,最终拿下了百度、腾讯和京东的offer,最后可能会选择京东。有人可能会问为什么不选择腾讯?的确腾讯的工资很高,福利待遇也很好。我觉得在京东能接触到更......
  • CF248B Chilly Willy 题解
    CF248BChillyWilly解题过程经过简单思考,这道题肯定是由规律可循,因为\(n\le10^5\),只有高精度能存下。下面是暴力程序对\(n\)为\(1\)到\(13\)时的答案进行求解(\(11\)到\(13\)超出int范围了)。发现\(n\)为\(1\)或\(2\)时,他们的答案为\(-1\)。接着来分析......
  • UVA12222 Mountain Road 山路 题解 dp
    UVA12222山路题意:--一个山路只有一条车道,因此不能有两辆方向相反的车同时在车道内。同时,为了保证安全,车道内不能超车,且同向行驶的车间距必须大于10分钟。现在给你n辆车,三个参数依次表示行驶方向,到达时刻,行驶时间。问如何安排能使最后一个通过的车通过时的时刻最小,输出这个值......
  • 问题解决 --- surface go sd卡槽不识别问题
    问题描述之前好好的,突然发现没有识别sd卡,sd卡是好的问题原因可能是系统更新了uefi解决办法重启电脑,多次点按音量加键进入uefi,关闭sd卡,重启电脑到系统再次进入uefi,开启sd卡,重启电脑到系统,完成!......
  • 在一加7上kali nethunter安装好后更新到最新版本,vnc打开失败问题解决方法。
    首先说明nethunter的vnc本身就不稳定,是兼容性问题,而非非正常关闭导致的。解决方法:方法一:查看nethunre主app的开启vnc命令是不是终端不识别。现在vnc叫做kex。方法二:更新到最新版本,sudoaptupdate&aptupgrade,如果还是打不开的话,更新nethunre主app,在https://store.nethunter.co......
  • ARC162 题解
    A.EkidenRace(450)题意:\(n\)个人在进行往返跑比赛,其中第\(i\)个人在回程前的排名是\(i\),总排名是\(p_i\),问有多少个人可能成为回程中跑得最快的人?如果对于\(i\),存在某个\(j>i\),使得\(p_j<p_i\),那么\(j\)在回程途中超过了\(i\),\(i\)肯定不能成为答案,否则一定可以。......