Nim

博弈论(六)——#10248. 「一本通 6.7 练习 5」取石子游戏

我怕爱的太早我们不能终老 提交于 2020-09-28 19:45:23
题目链接:https://loj.ac/problem/10248#submit_code 解题思路 神仙题目,迷一般的状态转移,看了yyb大佬的题解,才算明白一点。我们定义L[i][j]表示区间[i,j]左边(即i-1位)加上一堆石子L[i][j],能使先手必败,R[i][j]表示区间[i,j]右边(即j+1位)加上一堆石子R[i][j],能使先手必败。首先,边界L[i][i],R[i][i]肯定是a[i] (Nim博弈)。然后最后只要判断a[1]是否等于L[2][n]就能判断先手必胜还是必败了。 再看状态转移,L[i][j]由L[i][j-1]与R[i][j-1]转移过来,R[i][j]由R[i+1][j],L[i+1][j]转移过来,先看L[i][j],我们设L=L[i][j-1],R[i][j-1],x=a[j]。 R=x,L[i][j]=0,因为此时已经是必败态了,不必再添了。 x<L&&x<R,L[i][j]=x,此时两侧石子一致,无论先手怎么去,后手只要模仿先手在另一侧取相同的数量,这样就能保证先手先取完,此时左侧或右侧肯定有一堆没取完,此时可以等价的认为,当前是先手从L或R取了一定数量的石子转移过来的,此时无论后手怎么取都是必胜的。 L<x<R,L[i][j]=x+1,若先手在左侧取,剩下石子为rest。rest=0,等价于先手在R的状态下

duilib 窗口创建流程梳理

a 夏天 提交于 2020-08-19 05:45:09
1 duilib窗口类 <Window size="400,150" caption="0,0,0,60" roundcorner="16,16" shadowattached="false"> duilib自己封装了Window类 class UILIB_API Window : public virtual nbase::SupportWeakCallback { public: Window(); ~Window(); /** * @brief 获取窗口所属的 Windows 句柄 * @return 返回窗口关联的 Windows 窗口句柄 */ HWND GetHWND() const; /** * @brief 注册窗口类 * @return 返回 true 表示成功,否则表示失败 */ bool RegisterWindowClass(); /** * @brief 注册控件窗口类(与窗口的过程函数不同) * @return 返回 true 表示成功,否则表示失败 */ bool RegisterSuperClass(); /** * @brief 获取窗口类名称 * @return 返回窗口类名称 */ virtual std::wstring GetWindowClassName() const; /** * @brief 获取控件窗口类 * @return

Hacker News 简讯 2020-08-17

我与影子孤独终老i 提交于 2020-08-17 01:01:47
最后更新时间: 2020-08-17 01:00 Hiding messages in x86 binaries using semantic duals - (yossarian.net) 使用语义对偶在x86二进制文件中隐藏消息 得分:64 | 评论:19 Nim – Python-like statically-typed compiled language - (nim-lang.org) Nim–类Python的静态类型编译语言 得分:59 | 评论:49 Show HN: GradientMagic - (gradientmagic.com) 表演HN:GradientMagic 得分:67 | 评论:6 Kapton: Miracle Material with a Tragic History - (hackaday.com) 卡普顿:具有悲剧历史的奇迹材料 得分:26 | 评论:4 OPDS – Easy to Use, Open and Decentralized Content Distribution - (opds.io) OPD—易于使用、开放和分散的内容分发 得分:25 | 评论:8 A guide to learning algorithms through LeetCode - (github.com) LeetCode学习算法指南 得分:55 |

Julia回文数

﹥>﹥吖頭↗ 提交于 2020-08-16 16:37:19
C,D,Go,Rust,Nim,Zig,V,Julia,Py 9语回文数大战!仅供娱乐参考! https://my.oschina.net/raddleoj/blog/510932 julia 20200816 成都今天下雨 //貌似julia要先安装包,在 julia 环境下执行 import Pkg; Pkg.add("Dates") # 这是标准库的居然要安装! using Dates using Printf """ 是否回文 """ function ishuiwen(n::Int64) sn::Int32 = 0 # 可以不用类型 sn = n tn::Int32 = 0 while sn != 0 tn = tn * 10 + sn % 10 sn = sn ÷ 10 end if tn == n return true end return false end """ 回文10000000 """ function huiwen(max::Int64=10000000) tx::Int32 = 0 x::Int32 = 0 for i = 0:max if ishuiwen(i) == true tx+=1 end end return tx end function run() t1 = now() r = huiwen(10000000) t2 = now()

vue-upload 封装组件-上传组件

半城伤御伤魂 提交于 2020-08-15 23:47:50
我后端的,刚接触vue个星期,根据需求写了个上传控件,很灵活的。没有看element el-upload源码,样式用的element的。感觉vue确实好用。 先看样子: <!-- 单文件上传组件 --> < template > < div > < input type ="file" id ="file" hidden @change ="fileChange" :accept ="accept" > < div v-if ="upMode=='url'" style ="width: 100%;display:inline-flex;" > < el-input :value ="path" disabled ></ el-input > < el-button size ="small" type ="primary" @click ="btnChange" > {{autoUpload?label:'选择文件'}} </ el-button > < el-button v-if ="!autoUpload && loadButton" size ="small" type ="success" @click ="uploadClick" > {{label}} </ el-button > </ div > < div v-else-if ="upMode=='head'"

AtCoder Beginner Contest 172.F

我怕爱的太早我们不能终老 提交于 2020-08-14 20:35:00
AtCoder Beginner Contest 172.F - Unfair Nim 传送门 思路:异或的性质+构造。 显然题目背景是 N i m Nim N i m 游戏,我们目的是让后手胜,显然 n n n 堆石子异或为 0 0 0 时,后手必胜。接下我们需要构造来使 n n n 堆石子异或和为 0 0 0 。 因为题目要求我们只能将移动第一堆石子给第二堆石子。 我们记第一堆和第二堆石子个数分别为 a , b a,b a , b 。 所以我们可以预处理第 3 3 3 堆到第 n n n 堆石子的异或和,我们记为 c c c 。 设需要移动的石子数为 x x x 个。 即我们要使: ( a − x ) ⊕ ( b + x ) ⊕ c = 0 → ( a − x ) ⊕ ( b + x ) = c (a-x)\oplus(b+x)\oplus c=0\rightarrow (a-x)\oplus (b+x)=c ( a − x ) ⊕ ( b + x ) ⊕ c = 0 → ( a − x ) ⊕ ( b + x ) = c 首先我们需要知道几个结论: 1: a 1 ⊕ a 2 ⋯ ⊕ a n ≤ ∑ i = 1 n a i a_1\oplus a_2\dots \oplus a_n\leq \sum\limits_{i=1}^n a_i a 1 ​ ⊕ a 2 ​ ⋯ ⊕ a

[考试反思]0520省选模拟101:目的

大城市里の小女人 提交于 2020-08-14 06:45:10
没得说。怎么这么菜啊。 $T1$的$60$分白送的基本都不用想。 (诶那我这场考试干啥了? $T2$看着像个$min25$筛的板子。就是数据范围大了点 然而因为几乎没怎么遇到过$min25$的题,只写过一次而且还是三个月前了。 所以基本上是忘的一干二净考场上一点一点尝试想的。 结果写的混天黑地终于写完,过掉样例,就交了。 十分快乐的是:少取了个模。直接爆零。然后这场就没了。 就当是练习不熟练的知识点了(自己都不信。。。 我到现在都不知道我这么做的目的是什么。但愿不要再考场弱智了(事实上明天还是这样 T1:石子游戏 大意:$nim$。问去掉最少几堆石子后可以先手必胜。$n \le 5 \times 10^5,A \le 5 \times 10^5$ 要求出最少用多少个堆能得到和所有石子堆一样的异或值。 删掉的石子堆数是$logA$级别。否则线性基可以表出就可以去掉了。 所以暴力做$dp$是$O(n^2)$的。每一轮用$xorFWT$优化可以做到$O(nlog^2n)$。用$FWT$本质求单点点值可以做到$O(nlogn)$ 1 #include<cstdio> 2 #define S 1<<19 3 int a[S],n,t[S],T,ans; 4 void FWT( int *a){ for ( int i= 1 ;i<S;i<<= 1 ) for ( int j= 0 ;j<S

题解合集

瘦欲@ 提交于 2020-08-13 15:19:05
图论 朴素/堆优化Dijkstra(正权边无环最短路) #include<bits/stdc++.h> using namespace std; int dist[100000],g[600][600],st[100000]; int n,m; void d() { memset(dist,0x3f,sizeof(dist)); dist[1]=0; for(int i=1;i<=n;i++) { int t=-1; for(int j=1;j<=n;j++) { if(!st[j]&&(t==-1||dist[j]<dist[t])) { t=j; } } st[t]=1; for(int j=1;j<=n;j++) { dist[j]=min(dist[j],dist[t]+g[t][j]); } } } int main() { memset(g,0x3f,sizeof(g)); cin>>n>>m; for(int i=1;i<=m;i++) { int a,b,w; cin>>a>>b>>w; g[a][b]=min(g[a][b],w); } d(); if(dist[n]==0x3f3f3f3f) cout<<-1; else cout<<dist[n]; return 0; } #include<bits/stdc++.h> using namespace std;

DP问题

时间秒杀一切 提交于 2020-08-13 08:37:43
线性DP; 区间DP; 背包DP; 树形DP; 状态压缩DP; 数位DP; 计数型DP; 递推型DP; 概率型DP; 博弈型DP; 记忆化搜索; 1. 线性DP 最经典单串: 300. 最长上升子序列 (LIS) 最经典双串: 1143. 最长公共子序列 (LCS) 经典问题: 120. 三角形最小路径和 53. 最大子序和 152. 乘积最大子数组 887. 鸡蛋掉落 (DP+二分) 354. 俄罗斯套娃信封问题 (隐晦的LIS) 打家劫舍系列: (打家劫舍3 是树形DP) 198. 打家劫舍 213. 打家劫舍 II 股票系列: 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机 II 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 309. 最佳买卖股票时机含冷冻期 714. 买卖股票的最佳时机含手续费 字符串匹配系列 72. 编辑距离 44. 通配符匹配 10. 正则表达式匹配 2. 区间DP 516. 最长回文子序列 730. 统计不同回文子字符串 1039. 多边形三角剖分的最低得分 664. 奇怪的打印机 312. 戳气球 3. 背包DP 416. 分割等和子集 (01背包-要求恰好取到背包容量) 494. 目标和 (01背包-求方案数) 322. 零钱兑换 (完全背包) 518. 零钱兑换 II (完全背包-求方案数) 474.