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上天之路(三)之Linux系统目录
1. Linux设计思想 1) 程序应该小而专一,程序应该尽量的小,且只专注于一件事上,不要开发那些看起来有用但是90%的情况都用不到的特性: 2) 程序不只要考虑性能, 程序的可移植性更重要,she ...
- docker创建mysql容器时挂载文件路径后无法启动(已解决)
系统centos7 docker版本: 解决方法: 在docker run中加入 --privileged=true 给容器加上特定权限,如下 docker run --privileged=tru ...
- zip方式安装MySQL提示找不到 MSVCP120.dll的解决方法
电脑重装系统后,用zip的方式安装MySQL,在执行mysqld --initialize的时候提示 由于找不到 MSVCP120.dll,无法继续执行代码.重新安装程序可能会解决此问题. 解决的方法 ...
- JUC之文章整理以及汇总
JUC文章汇总 JUC部分将学习<JUC并发编程的艺术>和<尚硅谷-大厂必备技术之JUC并发编程>进行博客的整理,各文章中也会不断的完善和丰富. JUC概述 JUC的视频学习和 ...
- Qt之信号与槽
student.h: #ifndef STUDENT_H #define STUDENT_H #include <QObject> class Student:public QObject ...
- windows根据进程id杀死任务进程
然后打开任务管理器找出来结束进程即可
- python30day
内容回顾 tcp协议的多人多次通信 和一个人通信多说句话 和一个人聊完再和其他人聊 bind 绑定一个id和端口 socket()tcp协议的server listen 监听,代表socket服务的开 ...
- 使用Xamarin开发移动应用示例——数独游戏(五)保存游戏进度
项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 保存进度是移动应用的基本功能,在应用的使用过程中会有各种各样的可能导致使用中 ...
- docker daemon
docker启动最先加载Docker Daemon. Docker Daemon的启动文件放在/etc/systemd/system/docker.service.d目录中,如果没有则手工创建该目录并 ...
- django 验证和授权
User模型 一. User模型简介 1. 是验证和授权框架的核心模型,完整路径为:django.contrib.auth.models.User 2. 模型中拥有的字段: 1. username:用 ...