Solution -「OurOJ 46544」漏斗计算
\(\mathcal{Description}\)
Link.
定义一个运算结点 \(u\) 有两个属性:当前容量 \(x_u\)、最大容量 \(V_u\)。提供以下单元操作:
I读入一个整数 \(x\),令新结点 \(u=(x,x)\)。F u装满 \(u\) 结点,即令 \(x_u=V_u\)。E u清空 \(u\) 结点,即令 \(x_u=0\)。C s令新结点 \(u=(0,s)\)。M u令新结点 \(v=(0,x_u)\)。T u v不断令 \(x_u\leftarrow x_u-1,x_v\leftarrow x_v-1\) 直到 \(x_u=0\) 或 \(x_v=V_v\)。
构造不超过 \(10^4\) 次操作的一个运算方法,输入 \(a,b\),输出 \(ab\bmod 2^{18}\)。
\(0\le a,b\le 10^5\)。
\(\mathcal{Solution}\)
貌似是瓶子国的某个点?反正很离谱就是了。
首先观察操作,我们只有一个二元运算 \(T(u,v)\),必然只能用它实现逻辑模块。
再从问题入手,不难想到可以龟速乘计算 \(ab\),过程中若值 \(\ge 2^{18}\),则减去 \(2^{18}\)。那么我们至少需要实现这些模块:
加法器:输入结点 \(u,v\),输出 \(w\),满足 \(x_w=x_u+x_v\)。
逻辑减法器:输入结点 \(u,v\),输出 \(w\),若 \(x_u\ge x_v\),\(x_w=x_u-x_v\);否则 \(x_w=x_u\)。
加法器比较方便:新建一个大容量点,把两个加数复制一份倒进去就好。先实现一个复制当前容量器:
inline int copyNum( const int u ) {
printf( "M %d\n", u ), ++node;
printf( "F %d\n", node );
return node;
}
再实现加法器:
inline int add( const int u, const int v ) {
printf( "C 1000000000\n" ); int res = ++node;
printf( "T %d %d\n", copyNum( u ), res );
printf( "T %d %d\n", copyNum( v ), res );
return res;
}
逻辑减法?先要判断大小关系。而 \(T(u,v)\) 之后 \(x'_u=\max\{x_u-x_v,0\}\),我们只需要判断一个结点的当前容量是否为 \(0\)。好消息是,我们能够实现逻辑非器:
inline int logicNot( const int u ) {
printf( "M %d\n", u ), ++node;
puts( "C 1" ), ++node;
printf( "F %d\n", node );
printf( "T %d %d\n", node, node - 1 );
return node;
}
内部逻辑比较易懂就不讲啦。在此基础上,实现普通减法器和逻辑减法器:
inline int sub( const int u, const int v ) {
printf( "M %d\n", v ); int tmp = ++node;
printf( "T %d %d\n", copyNum( u ), tmp );
return node;
}
inline PII logicSub( int u, int v ) {
int f = logicNot( sub( u = add( u, 1 ), v ) );
rep ( i, 1, 18 ) f = add( f, f );
printf( "M %d\n", f ), f = ++node;
printf( "T %d %d\n", v = copyNum( v ), f );
return { u = sub( sub( u, v ), 1 ), f };
}
逻辑减法器返回的 first 即减法结果,second 用于求解时重复利用。
底层方法实现之后,剩下的工作就简单了:输入 \(a,b\),计算 \(2a,4a,\cdots,2^{16}a\),枚举 \(b\) 是否大于等于 \(2^{16}\dots2^0\),若是,则减去,答案加上对应的权。都能用以逻辑非为基础的模块实现。
操作次数复杂度为 \(\mathcal O(\log^2 V)\)(倍增以及内部的逻辑减法),我实现的常数较大,不过封装成模块很易懂就是了。(
\(\mathcal{Code}\)
/*+Rainybunny+*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef std::pair<int, int> PII;
#define fi first
#define se second
int node, mod;
namespace StandardModuleLibrary {
inline int logicNot( const int u ) {
printf( "M %d\n", u ), ++node;
puts( "C 1" ), ++node;
printf( "F %d\n", node );
printf( "T %d %d\n", node, node - 1 );
return node;
}
inline int copyNum( const int u ) {
printf( "M %d\n", u ), ++node;
printf( "F %d\n", node );
return node;
}
inline int add( const int u, const int v ) {
printf( "C 1000000000\n" ); int res = ++node;
printf( "T %d %d\n", copyNum( u ), res );
printf( "T %d %d\n", copyNum( v ), res );
return res;
}
inline int sub( const int u, const int v ) {
printf( "M %d\n", v ); int tmp = ++node;
printf( "T %d %d\n", copyNum( u ), tmp );
return node;
}
inline PII logicSub( int u, int v ) {
int f = logicNot( sub( u = add( u, 1 ), v ) );
rep ( i, 1, 18 ) f = add( f, f );
printf( "M %d\n", f ), f = ++node;
printf( "T %d %d\n", v = copyNum( v ), f );
return { u = sub( sub( u, v ), 1 ), f };
}
} using namespace StandardModuleLibrary;
int main() {
freopen( "liver.out", "w", stdout );
int x, y;
printf( "C 1\nF 1\n" ), node = 1; // element 1.
printf( "C 262144\nF 2\n" ), mod = node = 2; // module.
puts( "I" ), x = ++node;
puts( "I" ), y = ++node;
int buc[30] = { x }, pwr[30] = {};
int ans = ++node; puts( "C 1000000000" );
pwr[0] = ++node, printf( "C 1\nF %d\n", node );
rep ( i, 1, 16 ) {
pwr[i] = ++node, printf( "C %d\nF %d\n", 1 << i, node );
PII shit( logicSub( add( buc[i - 1], buc[i - 1] ), mod ) );
buc[i] = shit.fi;
}
per ( i, 16, 0 ) {
PII r( logicSub( y, pwr[i] ) );
int x = r.se;
rep ( j, 1, 18 - i ) x = add( x, x );
printf( "M %d\n", x ), x = ++node;
printf( "T %d %d\n", buc[i], x ), y = r.fi;
ans = logicSub( add( ans, buc[i] ), mod ).fi;
}
printf( "P %d\n", ans );
return 0;
}
Solution -「OurOJ 46544」漏斗计算的更多相关文章
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
- Solution -「WC 2022」秃子酋长
\(\mathscr{Description}\) Link. (It's empty temporarily.) 给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...
- Solution -「CEOI 2017」「洛谷 P4654」Mousetrap
\(\mathscr{Description}\) Link. 在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...
- Solution -「CEOI 2006」「洛谷 P5974」ANTENNA
\(\mathcal{Description}\) Link. 给定平面上 \(n\) 个点,求最小的能覆盖其中至少 \(m\) 个点的圆半径及一个可能的圆心. \(n\le500\),坐 ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
随机推荐
- Win10编辑Host文件授权问题
今天重温Kafka命令, 使用KafkaTool连接Broker,需要修改主机名,发现host修改时,提示以下错误: C:\Windows\System32\drivers\etc\hosts.txt ...
- 深入理解Java虚拟机之自己编译JDK
题外话 最近在阅读<深入理解Java虚拟机>,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考! 前置准备 平台及工具:Window ...
- [源码解析] PyTorch 分布式之 ZeroRedundancyOptimizer
[源码解析] PyTorch 分布式之 ZeroRedundancyOptimizer 目录 [源码解析] PyTorch 分布式之 ZeroRedundancyOptimizer 0x00 摘要 0 ...
- RDA5807M开发指南 & 开源库函数
文档标识符:RDA5807M_T-D-P16 作者:DLHC 最后修改日期:2022.1.14 最后修改内容:修改.添加内容 发布状态:已发布 本文链接:https://www.cnblogs.com ...
- Nginx 反向代理解决跨域问题分析
当你遇到跨域问题,不要立刻就选择复制去尝试.请详细看完这篇文章再处理 .我相信它能帮到你. 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://local ...
- k8s中kubeconfig的配置及使用
1.概述 kubeconfig文件保存了k8s集群的集群.用户.命名空间.认证的信息.kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯. 注意:用于配 ...
- [C语言基础] 数组与指针之间的引用
通过指针引用数组,通过数组引用指针,你搞明白了么?通过下面3种情形来了解一下数组和指针 Case 1. unsigned char arry[10]; unsigned char *ptr; unsi ...
- jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片
年后换了部门,现在主要的职责就是在网上卖精油,似乎这个就是传说中的网络营销. 跟着公司的MM们也了解不了少关于网络营销的知识,间接的了解到马云和刘强东都是些怎样龌龊的人,尽管之前也这样认为. 淘宝就不 ...
- bit操作常见trick
x&(x-1)可以消去最右边的1, 如果判断一个数是否是2的指数的快捷方法,比如8,二进制位1000, 那么8&(8-1)为0,只要为0就是2的指数
- BAT经典面试题之redis的热KEY问题怎么解决
引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...