Solution -「LOCAL」「cov. HDU 6816」折纸游戏
\(\mathcal{Description}\)
Link(削弱版).
\(n\) 张纸叠在一起对折 \(k\) 次,然后从上到下为每层的正反两面写上数字,求把纸重新摊平后每张纸上的数字序列。
\(n\le10\),\(k\le19\)。
\(\mathcal{Solution}\)
模拟摊平操作,对于每一层维护一个双向链表(实际指针的方向并不重要,不要纠结两个叫 pre
的指针相互指的问题),每次把上一半的反向接到下一半即可。
复杂度 \(\mathcal O(n2^k)\),瓶颈在 IO。
\(\mathcal{Code}\)
#include <cstdio>
#include <vector>
#include <assert.h>
typedef unsigned long long ULL;
inline char fgc () {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread ( p = buf, 1, 1 << 17, stdin ), p == q ) ? EOF : *p ++;
}
inline ULL rint () {
ULL x = 0; char s = fgc ();
for ( ; s < '0' || '9' < s; s = fgc () );
for ( ; '0' <= s && s <= '9'; s = fgc () ) x = x * 10 + ( s ^ '0' );
return x;
}
inline void wint ( const ULL x ) {
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
}
const int MAXN = 10, MAXK = 19, MAXP = 1 << MAXK << 1, MAXL = MAXN << MAXK << 1;
int n, K, perL, L, p[MAXL + 5];
int pre[MAXP + 5], suf[MAXP + 5], lef[MAXP + 5], rig[MAXP + 5];
std::vector<int> paper[MAXN + 5], fold;
namespace Generator {
const int threshold = 10000000;
ULL k1,k2;
ULL xorShift128Plus () {
ULL k3 = k1, k4 = k2;
k1 = k4, k3 ^= k3 << 23;
k2 = k3 ^ k4 ^ ( k3 >> 17 ) ^ ( k4 >> 26 );
return k2 + k4;
}
void gen ( int n, int k, ULL _k1, ULL _k2){
k1 = _k1, k2 = _k2;
int _len = 2 * n * ( 1 << k );
for ( int i = 1; i <= _len; i ++ )
p[i] = xorShift128Plus () % threshold + 1;
}
};
inline void initFold ( std::vector<int>& res ) {
int up = perL;
for ( int i = up; i; -- i ) {
lef[i] = rig[i] = up - i + 1;
pre[i] = suf[i] = 0;
}
while ( up > 2 ) {
int mid = up >> 1;
for ( int i = mid + 1; i <= up; ++ i ) {
int j = mid * 2 + 1 - i;
if ( !suf[lef[i]] ) {
assert ( !suf[lef[j]] );
suf[lef[i]] = lef[j], suf[lef[j]] = lef[i];
} else {
assert ( !pre[lef[i]] && !pre[lef[j]] );
pre[lef[i]] = lef[j], pre[lef[j]] = lef[i];
}
lef[j] = rig[i];
}
up = mid;
}
int i = lef[1], las = 0;
for ( int i = lef[2], las = 0; ; ) {
res.push_back ( i );
if ( i == rig[2] ) break;
int nxt = suf[i] ^ las ? suf[i] : pre[i];
las = i, i = nxt;
}
for ( int i = lef[1], las = 0; ; ) {
res.push_back ( i );
if ( i == rig[1] ) break;
int nxt = suf[i] ^ las ? suf[i] : pre[i];
las = i, i = nxt;
}
}
int main () {
freopen ( "folding.in", "r", stdin );
freopen ( "folding.out", "w", stdout );
for ( int T = rint (), type = rint (); T --; ) {
n = rint (), K = rint (), perL = 1 << K << 1, L = n * perL;
if ( !type ) for ( int i = 1; i <= L; ++ i ) p[i] = rint ();
else {
ULL k1 = rint (), k2 = rint ();
Generator::gen ( n, K, k1, k2 );
}
for ( int i = 1; i <= L; ++ i ) { // attention that K>0.
int r = ( i - 1 ) % ( n << 2 ) + 1;
if ( r <= n << 1 ) {
paper[n - ( r - 1 ) / 2].push_back ( p[i] );
} else {
paper[( r - ( n << 1 ) - 1 ) / 2 + 1].push_back ( p[i] );
}
}
initFold ( fold );
ULL ans = 0;
for ( int i = 1, id = 0; i <= n; ++ i ) {
for ( int j = 0; j < perL; ++ j ) {
ans ^= 1ll * ++ id * paper[i][fold[j] - 1];
}
paper[i].clear ();
}
wint ( ans ), putchar ( '\n' );
}
return 0;
}
\(\mathcal{Details}\)
为什么这种大模拟兔子会想到去找规律……
关键是死也没找出来!
联赛难度联赛难度啊你姿势摆对啊喂 qwq!
Solution -「LOCAL」「cov. HDU 6816」折纸游戏的更多相关文章
- Solution -「LOCAL」「cov. HDU 6864」找朋友
\(\mathcal{Description}\) Link.(几乎一致) 给定 \(n\) 个点 \(m\) 条边的仙人掌和起点 \(s\),边长度均为 \(1\).令 \(d(u)\) 表 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
- Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory
Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...
- SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法
用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...
- 「Windows MFC 」「Edit Control」 控件
「Windows MFC 」「Edit Control」 控件
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
随机推荐
- linux清理缓存cache
Linux服务器有自己先进的内存管理机制,有时候会发现我们系统的buff/cache内存占用会越来越高,操作系统也有卡顿的情况,遇到这种情况,不妨试试下面的方法. 步骤一:我们先使用free -m查看 ...
- PAT 乙级 1001. 害死人不偿命的(3n+1)猜想 (15)(C语言描述)
卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...
- kubernetes运行应用2之DaemonSet详解
kubernetes运行应用1之Deployment详解 查看daemonset 如下,k8s自身的 DaemonSet kube-flannel-ds和kube-proxy分别负责在每个结点上运 ...
- Cesium源码剖析---Post Processing之物体描边(Silhouette)
Cesium在1.46版本中新增了对整个场景的后期处理(Post Processing)功能,包括模型描边.黑白图.明亮度调整.夜视效果.环境光遮蔽等.对于这么炫酷的功能,我们绝不犹豫,先去翻一翻它的 ...
- 使用 fail2ban 保护 frp 服务
背景 我们一般会使用 fail2ban 来保护暴露到公网的提供密码登录的 ssh 连接等. 但使用 frp 穿透后所有的从外网访问都会变成 127.0.0.1 进入的,原本能用 fail2ban 保护 ...
- 在3G移动通信网络信令流程里获取用户电话号的一种方法(中国电信cdma2000)
首先这些关于电话号的的寻找都是在分组域进行的 然后是首先在rp接口的A11接口寻找,没有看到,于是到pi接口,研究radius协议 发现在协议里也不含有与用户电话号码mdn相关的元素 然后偶遇一篇文档 ...
- MyCms 开源自媒体系统,系统配置字段说明
功能说明 站点名称:站点的简要描述名称,没有启用SEO插件时,将用此字段用作站点标题. 站点地址:站点的完整地址(包含 http/https),此字段有多处依赖用于生成链接,请正确填写. 站点logo ...
- gin中如何记录日志和错误日志
package main import ( "github.com/gin-gonic/gin" "io" "os" ) func main ...
- gin中的多模板和模板继承的用法
1. 简单用法 package main import ( "github.com/gin-contrib/multitemplate" "github.com/gin- ...
- Go 常用函数
#### Go 常用函数,错误处理这一节我们来学习一下Go 常用的函数,这些函数有些是内置的,有些是官方标准库内的, 熟悉这些函数对程序开发来讲还是很重要的; 1. len("abc&quo ...