点此看题面 大致题意: 给你一张\(n*m\)的棋盘,问你一匹马在两个点中是否存在一条经过黑白格子数目相等的路径. 简化题目 首先,我们来简化一下题目. 考虑到马每次走的时候,所经过的格子的颜色必然发生变化,因此黑白格子数目相等这个条件就变成了起点和终点颜色是否相同. 当颜色相同时,我们就可以直接输出\(No\)了. 而接下来的问题就变成了:一匹马是否能从一个点到达另一个点. 在此之前,我们先默认\(n\le m\)(不满足条件\(swap\)即可). 当\(n=1\)时 此时,马完全无法移动,…
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任何一条边 (u,v),都有 f(u)≠f(v). 定义函数 g(n,k) 的值为所有包含 n 个点的无自环.无重边的 k 可染色无向图中的边数最大值.举例来说,g(3,1)=0,g(3,2)=2,g(3,3)=3. 现在给出三个整数 n,l,r,你需要求解:\((\sum_{i=l}^rg(n,i)…
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, s, t) for (int i = s; i < (int)t; i++) #define fi first #define se second #define all(x) x.begin(),x.end() #define pf2(x,y) printf("%d %d\n",…
点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\),且\(n\le1000\),首先想到的自然是打表. 打表程序略(其实是手贱不小心删掉了). 然后放到\(OEIS\)上,我们就可以找到一个\(Python\)的伪代码. 于是\(hl666\)神仙就切了此题. 动态规划 当然,像我这么弱,不会\(Python\),只好去写\(DP\)了. 我们可以设\(f_…
点此看题面 大致题意: 有\(n\)种宝藏,每种各两个.让你依次获得\(1\sim n\)号宝藏,然后依次获得剩余的\(n\sim1\)号宝藏,求最少步数. 简单结论 其实这题有一个十分简单的结论,即你只需考虑相邻两号宝藏的两种匹配方式即可. 因为这是相互独立的.互不影响的,所以这道题就很水了. 也就是分别考虑两种匹配方式下的距离和,取\(min\)记录答案. 不过要注意第\(n\)号的两个宝藏之间的距离也要计入答案. 代码 #include<bits/stdc++.h> #define Tp…
点此看题面 大致题意: 给你一个边集的子集,问你这可不可能是这张图的最小边覆盖. 大致思路 考虑到,如果一条边连接的两个点度数都大于等于\(2\),则这条边完全可以删去. 因此,我们只要判断是否存在这样的边,就可以判断这个边集有没有可能是这张图的最小覆盖了. 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar>…
点此看题面 大致题意: 有\(n\)张卡牌,每张卡牌有两种用法:使场上增加一个伤害为\(a_i\)的生物,或使场上所有生物伤害增加\(b_i\).求最大总伤害. 三分 我们可以三分使用\(a_i\)的卡牌张数. 证明如下: 假设使用\(a_i\)的卡牌张数最优为\(x\),此时选用的\(b_i\)总和为\(t\). 证明:从最优决策点向左总伤害值递减 此时如果将一张选\(a_i\)的卡牌改为选\(b_i\),则伤害变化值应为\(b_i*(x-1)-a_i-t\). 因为原先状态为最优状态,所以该…
点此看题面 大致题意: 共两轮,每轮每人有一个标签,标签相同的人必须到同一个点集合.求所有人总路程的最小值. 爬山算法 这道题貌似有三种做法:模拟退火.高斯消元以及爬山算法. 相比之下,自然是爬山算法最简单了. 实现方式 设第一轮编号为\(i\)的节点要到点\(s1_i\)集合,第二轮编号为\(i\)的节点要到点\(s2_i\)集合. 则总答案应为: \[\sum_{i=1}^n(a_i.x-s1_{f1_i}.x)^2+(a_i.y-s1_{f1_i}.y)^2+(s1_{f1_i}.x-s2…
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果,糖果只存在一秒,下一秒就会消失. 假如wls第\(k\)秒在第\(i\)行第\(j\)列的格子上,满足\(T[i][j]|k\),则wls会得到一个糖果. wls每一秒只可以上下左右移动一格或停在原地. 请问wls从指定的\(S(xs,ys)​\)出发到达指定的\(T(xt,yt)​\),并且在路上…
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的说,每个点是一个矩阵,区间赋值和区间求积. Solution: \(div2\)版本就\(O(n*m*9)\)暴力更新暴力矩阵乘法求答案就行了,代码挺短的,有需要的话去另一篇博客里有代码. \(div1\)题解就上面这个,相信大家看完应该都能\(ac\). 本题只有两种操作,区间赋值和区间求和(矩阵的积).很…
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  原题目描述在最下面.  对给定的式子算解.  \(0\leq k\leq n+m,c_k=(\sum_{i+j=k}i\times j\times \sigma_{a_i,b_j}) mod\;998244353\),其中\(当且仅当a=b时,\sigma_{a_i,b_j}=1.\) Solution:  我们发现只有当\(a_i\)和\(b_j\)相…
题目链接:https://zhixincode.com/contest/18/problem/I?problem_id=267 题目描述 输入描述 输出描述 一行一个整数表示答案. 样例输入 1 320 115 1020 2 样例输出 1 60 题解: 首先肯定的是,这 $n$ 次选择必然是分为两段的,前一段全部是召唤,后一段全部是加攻. 然后我们只需要考虑,这两段的数目即可,然后我们假设这个函数和最后的总攻击力是一个单峰函数,就可以上三分. 那么接下来考虑在确定多少张牌召唤,多少张牌加攻的前提…
题目链接:https://zhixincode.com/contest/18/problem/G?problem_id=265 题目描述 wls有一个整数 $n$,他想请你算一下有多少 $1...n$ 的排列(permutation)满足:对于所有的 $i(2 \le i \le n)$,若 $i$ 为奇数,则 $a[i−1]<a[i]$,否则 $a[i−1]>a[i]$.请输出答案 $\mod 1e9 + 7$. 输入描述 一行一个整数 $n$. $1≤n≤1000$ 输出描述 一行一个整数…
题目链接:https://zhixincode.com/contest/18/problem/C?problem_id=261 样例输入 1 4 21 23 4 样例输出 1 Yes 样例输入 2 4 31 22 33 4 样例输出 2 No 题解: 判断一个边集是否为最小边覆盖,用最笨的方法,暴力枚举边集内所有边进行删除,看删除后是否依然覆盖所有点,这个可以用线段树优化成 $O(\log n)$ 的时间复杂度,就可以过了.这是一个比较直观的做法. AC代码: #include<bits/std…
题目链接:https://zhixincode.com/contest/18/problem/A?problem_id=259 题目描述 wls正在玩一个寻宝游戏. 宝藏一共有 $n$ 种,都藏在一个 $m$ 行 $m$ 列的网格中. 每种宝藏都恰好有两个. wls只能沿着网格走(上下左右四个方向). 他想依次获得 $1...n$ 类宝藏,然后再以 $n...1$ 的顺序获得剩下的宝藏. wls可以从任意点出发. 当wls到达某个宝藏的位置时,他可以选择取或不取这个宝藏. 请问他最少要移动多少距…
点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌斯反演,详见这篇博客:初学莫比乌斯反演. 推式子 下面让我们来推式子. 首先,我们采用解决这种问题的常用套路,来枚举\(gcd\),就能得到这样一个式子: \[\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\fra…
点此看题面 大致题意: 有一个\(n\)行\(m\)列的网格图,让你给每一条边设置一个通过次数(\(\ge1\)),使其成为欧拉回路,且通过次数总和最小. 初始化 首先,由于通过次数\(\ge1\),因此首先必然设置每条边通过次数为\(1\). 对于一个\(n\)行\(m\)列的网格图,共有\(n(m-1)+m(n-1)\)条边,如下图: 所以,初始化\(ans\)为\(n(m-1)+m(n-1)\). 仔细观察上图,可以发现,中间的点以及四个角落的点都为偶点,因此只需给边上的点连边,使其全为偶…
点此看题面 大致题意: 有\(6\)个人玩大富翁,共有\(n\)块地,进行\(500\)轮,已知每个人掷骰子掷出\(1\sim6\)的概率.当某人到达一块未被占领的地时,他可以占领它.求最后每个人占有地的期望块数. 概率\(DP\) 这应该是一道概率\(DP\)题. 我们可以定义\(Arrive_{i,j,k}\)表示第\(i\)个人在第\(j\)轮到达第\(k\)块地的概率,\(Never_{i,j,k}\)表示第\(i\)个人在第\(j\)轮及之前从未到达过第\(k\)块地的概率. 显然,初…
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y,k$,表示询问区间$[x,y]$中的第$k$小数 思路:数据范围不是很大,可以分块来做,记录每个块已经更新过的最小值$imin[]$,询问时二分答案,然后求出$[x,y]$区间中小于等于$mid$的数的个数$cnt$,通过判断$cnt$与$k$的大小来改变$l,r$即可 #include <ios…
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移到$dp[i]$. AC自动机 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; ; const LL INF = 0x3f3f3f3f3f3f…
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一个复杂度是$O(nlog^{2}n)$,也够AC了.有正有负,控制边界有点难度. 二分答案 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; ;…
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O O O day3 6 6/10 O O O O O Ø day4 5 6/11 O O O O O O day5 3 4/10 O O O O day7 7 7/10 O O O O O O O day8 7 5/10 O O O O O…
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉及到子序列的题目的一个常用技巧是:对于子序列来说,贪心的能取就取. 因此本题对于每个字符串,需要维护的东西有f[i][j]表示第一次取i,下一次想取j的方案数:g[i]表示第一次取i的方案数:vis[i]表示当前字符i在这个串中有没有出现.具体的转移需要仔细讨论.…
线段树优化建图,用于区间到区间建边时降低空间复杂度 建立两颗线段树,一颗in, 代表进入这个区间,一颗out,代表从这个区间出去 in树从父亲向儿子建边,代表宏观进入整个区间,不向下寻找 out树从儿子向父亲建边,代表出去 in树向out树对应点建边,代表从这个点进去可以从它出去 建真正的边时: 1: 单点向单点: out树对应点向in树对应点建边 2: 单点向区间: out树对应点向in树对应区间建边 3: 区间向单点: out树对应区间向in树对应点建边 4: 区间向区间: out树区间对新…
slove 6/11 A.夺宝奇兵 Code:zz Thinking:zz 贪心即可.这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两种情况,选择距离短的即可,就这样一直往前贪心. //#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<stdio.h> #include<stdl…
Replay Dup4: 两轮怎么退火啊? 简单树形dp都不会了,送了那么多罚时 简单题都不想清楚就乱写了,喵喵喵? X: 欧拉怎么回路啊, 不会啊. 还是有没有手误?未思考清楚或者未检查就提交, 导致自己白送罚时. A:夺宝奇兵 Solved. 考虑$所有i >= 2 需要跟i - 1 连两条边 只有两种可能 取最小的一种$ $注意n的两个点要连一条边$ #include<bits/stdc++.h> using namespace std; typedef long long ll;…
题目链接 \(Description\) 给定\(n\)个十维向量\(\overrightarrow{V_i}=x_1,x_2,...,x_{10}\).定义\(\overrightarrow{V}=x_1,x_2,...,x_{10}\)的模长\(|\overrightarrow{V}|=\sqrt{x_1^2+x_2^2+...+x_{10}^2}\).求有多少个四元组\(1\leq i,j,k,l\leq n\)满足\(|\overrightarrow{V_i}-\overrightarr…
题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵,要求支持区间赋值和求区间乘积. 输出答案对\(998244353\)取模后的结果. \(n,q\leq10^5\). \(Solution\) 裸的线段树+矩阵快速幂是\(O(3^3q\log^2n)\)的,因为维护区间乘的话,区间赋值为矩阵\(A\)的时候要赋值\(A^{r-l+1}\),带一个快…
目录 day1 F div1 爬爬爬山 (最短路) B div2 吃豆豆 (dp) J div2 夺宝奇兵(暴力) J div1 夺宝奇兵 (权值线段树) C div1 拆拆拆数 E div1 流流流动(冰雹猜想 ,树形dp) I div2 起起落落 (dp) I div1 起起落落 (权值线段树优化dp) day2 A div2 Erase Nodes(贪心) B div2 Erase Numbers III(贪心) H div1&2 Cosmic Cleaner(计算几何) K div1 S…
目录 day5 5H div2 Nested Tree (树形dp) 5F div2 Kropki (状压dp) 5J div1 Special Judge (计算几何) 5I div1 Sorting (线段树) 5D div1 Doppelblock (搜索) 5C div1 Division (主席树) 5E div1 Fast Kronecker Transform (NTTorFFT) day7 7G div1&2 抢红包机器人 (拓扑序) 7A div1 迷宫 (树 规律) 7E d…