B - Shorten IPv6 Address 题意 给你\(128\)位的二进制,转换为十六进制. 每\(4\)位十六进制分为\(1\)组,每两组用一个\(":"\)分开. 每一组的十六进制要去掉前导\(0\). 如果存在连续两组以上的\(0\)要转换为\("::"\).比如,\(0:0:0.0:0\)都可以转换成\("::"\). 但是最多只能转换一次,要求在长度最短的条件下字典序最小. 思路 先把二进制串转换为16进制串 找到最长连续的\…
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题目大意 给定一个 128 位的二进制 ip 地址,让你以 16 位一组,每组转成 16 进制,用冒号连接,并且可以选择一次且仅一次把 ip 数组中值连续为 0 的组删去(详情看样例),求如此操作后最短且字典序最小的 ip 字符串. 分析 bitset + sprintf. 代码如下 #include <bits/stdc++.h> using namespace std; #define INIT(…
题意: 给你一个二进制表示的IPv6地址,让你把它转换成8组4位的16进制,用冒号分组的表示法.单组的前导0可以省略,连续多组为0的可以用两个冒号替换,但是只允许替换一次.把这个地址通过这几种省略方式,长度缩到最短,然后输出字典序最小的. 题解: 计算出八组四位16进制数的值,找出连续的0,用冒号替换即可. 坑点:1,替换连续的0的时候,一定要注意冒号不能多加 2,题目要求字典序最小,因为冒号的ascii值大于0,那就优先替换后面的,但是,同样长度的连续0,替换掉中间的,比替换掉两边的,最后得到…
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题意: 您将获得一个IPv6地址,该地址是128位二进制字符串.请根据以下规则确定其最短的表示: 以十六进制表示形式表示地址,并使用冒号':'分割每四个十六进制数字.每四个数字称为一个字段.例如,'0000:0000:0123:4567:89ab:0000:0000:0000' 可以省略字段中的前导零.例如,上述IPv6地址可以缩短为 '0:0:123:4567:89ab:0:0:0' 由至少两个字段组…
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益,并花费了所有技能升到k级的花费.因为现在我们已经把所有技能都升到k了,为了获得当前情况下的最大收益,我们要把每一个技能继续升级到一定的等级,使我们能够通过这一技能获得最大的收益(即最小花费),即s[k~m]的最小值 - s[k] (s[]为这一技能花费的前缀和).我们可以用单调队列来维护这个最小值.…
题目链接:https://ac.nowcoder.com/acm/contest/886/D 题解摘自官方题解 题目大意 有 K 个体积相同的箱子,有 N 个体积相同或相异的物品,现要按照如下策略装箱: 一个一个箱子装,装到不能装了换下一个装. 对于每一个箱子,每次都从剩余物品中找最大的能装进箱子里的物品装进去,直到装不进为止. 求箱子的最小体积. 分析 首先这道题箱子容积和答案没有单调性. 比如:15 5 • 39 39 39 39 39 60 60 60 60 60 100 100 100…
题目链接:https://ac.nowcoder.com/acm/contest/886/J 题目大意 略. 分析 见代码. 代码如下 #include <bits/stdc++.h> using namespace std; #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define Rep(i,n) for (int i = 0; i < (n); ++i) #define For(i,s,t)…
题意: 传送门 给你\(A,B,C\),要求你给出有多少对\((x, y)\)满足\(x\in [1,A],y\in [1,B]\),且满足以下任意一个条件:\(x \& y > C\)或者\(x \oplus y < C\). 思路: 数位\(DP\),以前做的数位\(DP\)只是和一个数相关,今天是和两个数相关,有点神奇.这里我开了九维,第\(i\)位\(x\)是\(j\),\(y\)是\(k\),对\(第一种\)情况,对\(第二种\)情况,\(x\)到达上界,\(y\)到达上界,…
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或者说A‾\overline{A}A表示DA→\overrightarrow{DA}DA旋转180°之后的方向. block(A,B)block(A,B)block(A,B)表示的是DA→\overrightarrow{DA}DA旋转到DB→\overrightarrow{DB}DB的扫过的几何区间.…
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets which are numbered from 1 to N. Now Oak is going to do N operations. In the i-th operation, he will insert an integer x between 1 and M to every set inde…
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ACM-ICPC Team, retired this year leaving a group of newbies again. Rumor has it that he left a heritage when he left, and only the one who has at lea…
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 string) 求若干个串的公共子串个数相关变形题 牛客这题题意大概是求一个长度为\(2e5\)的字符串有多少个不同子串,若\(s==t\)或\(s==rev(t)\)则认为子串\(s,t\)相同.我们知道回文串肯定和他的反串相同. 链接:传送门. 做法1: \(yx\)大佬秒出思路%%,对\(s…
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the number of pairs <x ,y> (with 1≤x≤Aand1≤y≤B) such that at least one of the following is true: - (x and y) > C - (x xor y) < C   ("and", &q…
链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 A new city has just been built. There're nnn interesting places numbered by positive numbers from 111 to nnn. In order…
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 问\(s\)串中所有本质不同的回文子串中有多少对回文子串满足\(a\)是\(b\)的子串. 思路 参考代码:传送门 本质不同的回文子串肯定是要用回文树的啦- 在建好回文树后分别对根结点为\(0,1\)的子树进行\(dfs\),处理出以每个结点为根结点的子树的大小\(sz\)(也就是说有多少个回文子串以其为中心)和其\(dfs\)序,回文子串包含除了作为其他回文子串的中心被包含外,还可以不作为中心被包含,而这一部分则需要靠回文树的\(fai…
考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一步构造的方案,通过最基础的n=4和n=4+1的图的图推广到n=4k和n=4k+1的状态 #include<bits/stdc++.h> using namespace std; #define maxn 2005 int mp[maxn][maxn]; int n,f[maxn]; int mai…
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最大流,也就是最小割.那么割完之后会是2个连通块,且连通块内部是完全图. 因为是最小割,所以被割掉的边权和最小.即两个连通块内部的边权和最大.那么就会有一个连通块是孤立点,取s和t中到其余所有点距离小的作为孤立点. 问题变成了求每个点到其他所有点的距离. dfs第一次求每个点到他所有儿子节点的距离,d…
题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector(储存左端点,右端点,id)初始化线段树. 初始化的方法是:对于线段树的n个叶子节点,即为排好序的n个区间.对于其他节点,将左右儿子按照右端点大小归并(归并是线性复杂度). 还要维护每个节点左端点的最小值(用来剪枝)和最大值(用来判断可行性). 每个区间只会被第一个他包含的点摧毁,所以用vis数组标…
一个数很大,并不能预处理,所以要进行公式变换,存前一个的值就好 #include <bits/stdc++.h> using namespace std; typedef long long ll; ,N=1e6+; ll n,m,inv[N]; int main() { inv[]=inv[]=; ; ios::sync_with_stdio(),cout.tie(); cin>>T; ; i<N; ++i) inv[i]=(MD-MD/i)*inv[MD%i]%MD; w…
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Point{ ll x, y; Point( ll x=, ll y= ): x(x), y(y){} }; typedef Point Vector; Point p[]; Vector operator -(const Vector a, const Vector b ){ return Vector( a.x-b.x, a.y-b.y );…
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 \log n^2)\)的. 考虑另外一个做法,同样是枚举右下角\((x,y)\),然后枚举一边长度,显然现在只需要知道左边最远能延伸到哪,这个玩意显然是有单调性的,那么尺取一下,套个单调队列判断即可. 注意细节. #include <bits/stdc++.h> using namespace s…
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称“ $d$ 是模 $p$ 的二次剩余” 当对任意 $X$,$X^2 \equiv d(mod \ p)$ 都不成立时,称“ $d$ 是模 $p$ 的二次非剩余” 矩阵的相似对角化 相似矩阵:对于矩阵 $A$ 和 $B$,若存在可逆矩阵 $P$,使得 $P^{-1}AP=B$,则称 $A$ 相似于 $…
题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内外层循环都是 $\sqrt p$,题目查询 $m$ 次,$m \leq 1000$,$ p \leq 10^9$,这样总时间复杂度为 $O(m \sqrt p)$,勉强能接受.据说使用读入优化和手写哈希还是能过得,可见Cls的代码%%% 仔细想一下,由于BSGS分成两步,其中第一步是建立 $a$ 的…
题意 给你 $n$ 个集合,每个集合中包含一些整数.我们说一个集合表示一个整数当且仅当存在一个子集其异或和等于这个整数.现在你需要回答 $m$ 次询问 ($l, r, x$),是否 $l$ 到 $r$ 的每个集合都能表示 $x$. 分析 先求出每个集合的线性基,然后用线段树维护线性基的交,详见代码 #include<bits/stdc++.h> #define reg register using namespace std; typedef long long ll; ; + ; int n…
题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路,这是分层图最短路的模板题. 建立 $0~k $ 层相同的图,每层之间相邻的节点之间也用权值为0的边相连(具体操作见代码).第 $k$ 层表示已经将 $k$ 条道路置为0.最终把每层的终点连向一个超级汇点.最短路就是从第 $0$ 层源点到超级汇点的最短路. #include<bits/stdc++.h…
题意: 一颗 $n$ 个节点的树上标有 $k$ 个点,找一点使得到 $k$ 个关键结点的最大距离最小. 分析: 问题等价于求树的直径,最小距离即为直径除2向上取整. 有两种求法,一是动态规划,对于每个结点,把所有子结点的 $d(i)$ (表示根为 $i$ 的子树中根到叶子的最大距离)都求出来,设 $d$ 值前两大的结点为 $u$ 和 $v$,则 $d(u) + d(v) +2$就是树的直径. 另一种是两次DFS,从任意一个关键节点开始,找到离它最远的关键结点 $y$,从 $y$ 出发dfs找到新…
题意: 用  $A(n)$ 表示第 $n$ 个只由1组成分整数,现给定一个素数 $p$,求满足 $1 \leq i\leq n, 1 \leq j \leq m, A(i^j) \equiv 0(mod \ p)$ 的 $(i, j)$ 对数. 分析: $11...11 = \frac{10^n-1}{9} \equiv 0(mod \ p)$ 等价于 $10^n \equiv 1(mod \ 9p)$,当 $p \neq 2,5$ 时,有 $gcd(10, 9p)=1$,因此 $10^{\ph…
题目链接:https://ac.nowcoder.com/acm/contest/884/G 题目大意:给定一个树\(A\),再给出\(t\)次询问,问\(A\)中有多少连通子图与树\(B_i\)同构.\(|A|\leq 2000,t\leq 10000, |B_i|\leq 12\) 题解:本题实际上是Codeforces 762F的加强版,关于这题的题解请戳这里 本题做法与之前这道题类似,也是预处理出树的最小表示法后进行树形DP,但是由于这里有多达一万次询问,所以考虑预处理枚举所有点数不超过…
题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有石堆的石子数均为\(0\)时获胜.问有多少个区间\([l,r]\)可以保证获胜(若区间内石子数总和为奇数则会选一堆石子数最小的石堆取走一个石头). 题解:显然,对其中的一个区间,如果区间内的最大值\(mx\)不超过其总和\(sum\)的一半,则能保证获胜.于是可以考虑每一个\(a_i\)作为最大值的…
I题  Points Division 题意: 给你n个点,每个点有坐标(xi,yi)和属性(ai,bi),将点集划分为两个集合, 任意 A 集合的点 i 和 B 集合点 j, 不允许 xi >= xj 且 yi <= yj. A 集合的点使用权值 ai,B 集合的点使用权值 bi​,求: 思路: 可以用一条自底向上的折线将这些点分为两组,折线左上为A集合,右下B集合,折线上的点也属于B集合 dp[i] 代表 当前点i在折线上时权值和的最大值 那么对于当前点i来说: i点之前,y坐标小于yi的…