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 $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
随机推荐
- i++ 和 ++i 区别
i++:是先把i拿出来使用,然后再+1: ++i :是先把i+1,然后再拿出来使用:
- 读取 properties 配置文件含有中文的value内容 导致中文乱码 的解决办法
1.前言 因为装系统的时候把中文写在了系统路径,现在我想把这个路径写在properties里面来读取,可是 发现java 读取会导致中文乱码成 问号????的乱码 ,百度找了好多博客,基本都是一摸一 ...
- jave 数据类型 float 的 正确赋值
1.前言 float 是单精度浮点型 ,有效数字8位 ,在机内存占4个字节 [double 是双精度浮点型 ,有效数字16位 ,在机内存占8个字节 ] 2.赋值 float a=1.3 会编译报 ...
- 第10组 Alpha冲刺 (6/6)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14008187.html ·作业博客:https://edu.cnblogs.co ...
- HBase文档学习顺序
1.<HBase基础概念知识学习> https://www.toutiao.com/i6774215329498268164/ 2.<VM安装CentOS6.5> https: ...
- HttpServletRequest接口详解
般情况下,浏览器(客户端)通过 HTTP 协议来访问服务器的资源,Servlet 主要用来处理 HTTP 请求.Servlet 处理 HTTP 请求的流程如下: Servlet 容器接收到来自客户端的 ...
- python变量系列--1
所以这里需要注意变量的使用,print(message),直接去引用,和shell略有不同 1.变量名只能包含字母,数字,下划线,但不能以数字开头 2.变量名不能含有空格
- kubernetes之手动部署k8s 1.14.1高可用集群
1. 架构信息 系统版本:CentOS 7.6 内核:3.10.0-957.el7.x86_64 Kubernetes: v1.14.1 Docker-ce: 18.09.5 推荐硬件配置:4核8G ...
- 实际工程中加快 Java 代码编写的小提示
这里我简单谈谈 Java 语法在编程效率方面的弱势,以及如何补救. 一.集合的快速创建 C# 是少数拥有集合字面值(又叫初始化表达式)的静态语言之一. var list = new List<i ...
- vue v-model原理实现
v-model的实现原理: 基础用法: v-model 本质上不过是语法糖,可以用 v-model 指令在表单 <input>.<textarea> 及 <select& ...