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 $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
随机推荐
- centos7 文件属性介绍block+软硬连接介绍
block block用于存放的是数据信息 block默认大小是4k,可以进行调整 比较大的文件,会占用多个block 比较小的文件,剩余空间无法使用,浪费磁盘空间 软硬链接的区别 硬链接:是文件的多 ...
- Servlet中分发器和重定向两兄弟
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513702111698485767/ 弄清这个两兄弟,我们还是从练习中去理解 先创建一个数据提交页面,注意路径 编 ...
- RISC-V CPU加电执行流程
市面上采用RISC-V架构的CPU很多,且没有如X86那样高度细节的标准,故采用说明文档详细的SiFive Freedom U540-C000芯片来做介绍(下面统一称为FU540). FU540支持多 ...
- manjaro20初始配置
输入法配置 安装完以后需要注销或重启,然后配置fctx 注意如果刚开始 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMOD ...
- JAVA主要类集分类
包装类 Integer包装类 方法 返回值 功能描述 byteValue() byte 以 byte 类型返回该 Integer 的值 intValue() int 以 int 型返回此 Intege ...
- vscode自定义代码片段,自定义注释片段(动态时间)
下载vscode 一.打开vscode,点击左下角设置图标. 二.点击用户代码片段 三.点击新建全局代码片段文件 四.输入自定义代码片段配置文件名,例如:vue.json 五.进行代码片段配置示例如下 ...
- redis一主两从搭建
一主两从搭建: 主配: daemonize yes port 6379 logfile ./redis6379.log dir ./ bind 10.131.156.170 从1配: daemoniz ...
- python16day
昨日回顾 自定义模块 模块的两种执行方式:脚本方式.调用方式 name 模块导入的方式 相对导入 random:获取随机数相关 今日内容 常用模块的介绍 time:和时间相关 datetime os ...
- C++ 微信多开
应用是如何判断多开 一.通过查找窗口标题或者类名来判断程序是否正在运行. 二.通过互斥对象确定程序是否运行,大多数软件都是使用CreateMutexW 判断多开的. 三.内存映射物理文件,控制多开. ...
- java 多线程 start方法 run方法 简单介绍。
一 start开启一个多线程, run 只是一个内部的方法. package com.aaa.threaddemo; /* * start方法的作用? * 在 Java中启动多线程调用的是start方 ...