loj2031 「SDOI2016」数字配对】的更多相关文章

跑最大费用最大流,注意到每次 spfa 出来的 cost 一定是越来越少的,啥时小于 \(0\) 了就停了吧. #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; typedef long long ll; int n, a[205], b[205], c[205], dd[205], hea[205], cnt, ss,…
「SDOI2016」数字配对 题目大意 传送门 题解 \(a_i\) 是 \(a_j\) 的倍数,且 \(\frac{a_i}{a_j}\) 是一个质数,则将 \(a_i,a_j\) 质因数分解后,其质因子的次数和相差为 \(1\). 由此我们可以想到根据质因子次数和的奇偶性对 \(a_i\) 进行分组,不难发现会被分成两组.这让我们联想到了二分图. 我们考虑采用费用流求解. 首先我们可以将源点 \(s\) 向其中一组点连容量为 \(b_i\),费用为 \(0\) 的边,然后从另外一组点的每个点…
题解 这个图是个二分图,因为如果有一个奇环的话,我们会发现一个数变成另一个数要乘上个数不同的质数,显然不可能 然后我们发现这个不是求最大流,而是问一定价值的情况下最大流是多少,二分一个流量,加上一条边限流,然后求最小费用(其实是最大费用,把权值取反即可)是不是小于等于0,再看流量有没有流满 代码 #include <iostream> #include <cstdio> #include <vector> #include <algorithm> #incl…
#2033. 「SDOI2016」生成魔咒     题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 11.2 22 拼凑起来形成一个魔咒串 [1,2] [1, 2][1,2]. 一个魔咒串 S SS 的非空子串被称为魔咒串 S SS 的生成魔咒. 例如 S=[1,2,1] S = [1, 2, 1]S=[1,2,1] 时,它的生成魔咒有 [1] [1][1].[2] [2][2].[1,2] [1, 2][1,2].[2,1] [2, 1][2,1].[1,2…
「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 \(m\) 是否到达上界 \(k\) 是否到达下界.我用一个 \(pair\) 存,\(first\) 记录方案数,\(second\) 记录所有的和. \(ans=(P.S-k*P.F)\%mod\) 那么我们每次枚举该位为 \(0/1\) 就可以转移了,逐位计算贡献. \(Code\ Belo…
目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个可以用转移矩阵通过矩阵乘法处理出来 预处理出\(A[i][j]\)表示数S为\(j * 10 ^ i\)的转移矩阵 对于g的转移 \(g(i) = \sum_{j = 0}^{i - 1}g(j) * D(j + 1,i)\) D[i][j]表示第i位到底j位构成的数的f,(转移矩阵 对于g的转移也…
COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★   输入文件:menci_pair.in   输出文件:menci_pair.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 aiaj 是一个质数,那么这两…
[LOJ 2070] 「SDOI2016」平凡的骰子 [题目链接] 链接 [题解] 原题求的是球面面积 可以理解为首先求多面体重心,然后算球面多边形的面积 求重心需要将多面体进行四面体剖分,从而计算出每一个四面体的重心和体积,加权平均即为整个多面体的重心 四面体体积可以用一个点引出的三条向量的积乘 \(\frac 1 6\) 四面体重心坐标是四个顶点坐标平均数 根据题目提示,球面多边形面积为三个二面角之和减去 \(\pi\),那么我们需要求二面角 先求出法向量,然后点积求向量二面角 [代码] /…
[SDOI2016 Round1] 数字配对 ★★★ 输入文件:menci_pair.in 输出文件:menci_pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数,那么这两个数字可以配对,并获得 ci×cj 的价值. 一个数字只能参与一次配对,可以不参与配对. 在获得的价值总和不小于 0 的前提下,求最多进行多少…
「SDOI2016」征途 先浅浅复制一个方差 显然dp,可以搞一个 \(dp[i][j]\)为前i段路程j天到达的最小方差 开始暴力转移 \(dp[i][j]=min(dp[k][j-1]+?)(j-1\leq k\leq i-1)\)这咋写?还是需要转换一下 开始了,but题目的方差还需要m^2,很好 以下x为m天行走的平均值,s[i]为1~i段路的总路程 那么x可以算对吧:\(x=\frac{s[n]}{m}\) \[m\times \sum^m_{i=1}(x_i-x)^2\\ =m\ti…
数字配对 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的价值. 一个数字只能参与一次配对,可以不参与配对. 在获得的价值总和不小于 0 的前提下,求最多进行多少次配对. Input 第一行一…
★★ 输入文件:pair.in 输出文件:pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数,那么这两个数字可以配对,并获得 ci×cj 的价值. 一个数字只能参与一次配对,可以不参与配对. 在获得的价值总和不小于 0 的前提下,求最多进行多少次配对. [输入格式] 第一行一个整数 n. 第二行 n 个整数 a1.…
题面 传送门 思路 一个数字能且只能匹配一次 这引导我们思考:一次代表什么?代表用到一定上限(b数组)就不能再用,同时每用一次会产生价值(c数组) 上限?价值?网络流! 把一次匹配设为一点流量,那产生的价值不就是费用了吗? 我们考虑把一种数字抽象成一个点,可以匹配的数字之间连边,费用为c[i]*c[j],流量上限为..... 等等,流量上限怎么设? 而且还有一个问题:这里的匹配是双向的,虽然可以$O\left(n^2\right)$求出所有匹配对,但是网络流要求是单向边啊! 别急,我们先来分析一…
题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{i - 1} dp[j] * tr[j + 1][i]\) \(tr[j][i]\)表示矩阵的\([j,i]\)组成的数字次幂是什么样的矩阵 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pai…
题解 用了一堆迷之复杂的结论结果迷之好写的计算几何???? 好吧,要写立体几何了 如果有名词不懂自己搜吧 首先我们求重心,我们可以求带权重心,也就是x坐标的话是所有分割的小四面体的x坐标 * 四面体体积的和除以骰子的体积,y,z坐标同理 然后我们把这个骰子四面体剖分,剖分的话就是随便选在骰子内的一个点,对于骰子的每个面找相邻的三个点和这个点作为顶点组成的四面体 四面体的重心是四个点三维坐标和除以4 四面体的体积是三维混合积的绝对值除以6 然后对于每个面,我们把它剖分成三角形,发现它们二面角的和就…
题解 我一开始还努力想这道题是不是有坑,被SDOI折磨到我觉得不能有那么水的题在-- 就是带权并查集维护一下两点间距离,如果新加一条边两个点在同一集合,看看已有的路径和新加的路径是否相等 乘积可以在模意义下维护,多随机几个模数就行 代码 #include <bits/stdc++.h> #define enter putchar('\n') #define space putchar(' ') #define pii pair<int,int> #define fi first #…
题解 少考虑了情况,导致我以为是暴力讨论一次角落移动 de了两天才反应过来--简直降智 事实上,我们把移动分三类,一种是在边界跳过一段,一种是在左上角上左上左上左这样撞墙,在右下角下右下右下右这么撞墙,另一种是左右左右左右这么撞墙 如果你说还有上下上下这么撞墙,就把整个图旋转180度再做一遍dp就好了 那么就说一种就可以了 我们在角落里的移动,如果想进行左右洄游的话,就不能再次进行角落移动了,除非我们到了右下角 那么我们就通过dp求出我们左右洄游之前进行角落移动到了每一行的左右位置时最大价值 然…
题解 c一样的就是一个独立的游戏 我们对于2和3的指数 sg[i][j] 表示\(c \cdot 2^i \cdot 3^j\)的棋子,只有这个硬币是反面,翻转的硬币是正面的sg值 枚举sg函数所有可能的局面,每个后继局面的sg值,就是所有被翻到背面的硬币sg值的异或和 我们忽略了反转当前硬币前面可能不是全部正面,但是这是正确的,我们可以证明一下 如果一个局面所有背面朝上的棋子sg函数异或起来为\(x\) 若\(x!=0\) 那么我们找到\(x\)最高位是\(2^k\),我们找到一个含有\(2^…
题解 我一直也不会网络流--orz 我们分析下这道题,显然和行列没啥关系,就是想给你n + m个串 那么我们对于非回文单词之外的单词,找到两两匹配的反转单词(即使另一个反转单词不会出现也要建出来) 具体就是我们建一个hash表,遇见一个单词读进来,把这个单词反转之后再存进哈希表里 然后我们把一对反转单词挑出来,按照字典序,字典序小的往字典序大的连一条流量为2的边 那么现在我们考虑一下加入阅读方式都已经被全部确定,那么网络流的建图方式就应该是 如果顺着给定的顺序是字典序较小的,那么就向给定循序读的…
题解 按秩合并怎么清数组对我来说真是世纪性难题 我们很熟练地想到点分,如果我们认为某个点到重心是正着读的,由于它的深度固定,它的串也是固定的,我们只要预处理出所有长度正着重复的串,反着重复的串,和它们的哈希值,遍历树的时候只需要记录一下路径字符串的哈希值,比对一下看是否合法就行 为了快一点可以按深度合并每棵子树 代码 #include <bits/stdc++.h> #define enter putchar('\n') #define space putchar(' ') #define p…
题解 看错题了,以为单次修改相当于一个覆盖,后来才明白"添加"-- 就相当于添加很多线段求最小值 首先这个等差数列添加的方式比较烦人,我们拆开两条链,一条s到lca,一条lca到t 那么s到lca上的点x值就是\(-A * dis[x] + A * dis[s] + B\) lca到t上的点x值就是\(A * dis[x] + A * (dis[s] - 2 * dis[lca]) +B\) 这个时候就是点值代入的一次函数的形式,考虑怎么插入一条线段 这个线段树上的节点原来维护着一条直…
题解 就是字符集较大需要离散化和建边表的后缀自动机水题 每次会加入i个新的串,其中重复的就是i的父亲节点所在节点的长度,减掉即可 代码 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <vector> #include <set> #define enter putchar('\n') #define spac…
题解 有人管它叫带权二分,有人管它叫dp凸优化,有人管它叫wqs二分-- 延伸出来还有zgl分治,xjp¥!%#!@#¥!# 当我没说 我们拆个式子,很容易发现所求的就是 \(m\sum_{i = 1}^{m}s_{i}^2 - sum^{2}\) 然后去掉常数我们只要求\(\sum_{i = 1}^{m}s_{i}^2\)的最小值 然而,我们需要m个? 我们发现,这个东西随着选的个数增多,越来越少,并且少得越来越慢(斜率变大,斜率是负的!) 我们二分最后一次的斜率,选一次减少q,最后能取到的最…
题面 传送门 做一道题学一堆东西不管什么时候都是美好的体验呢-- 前置芝士 混合积 对于三个三维向量\(a,b,c\),定义它们的混合积为\((a\times b)\cdot c\),其中$\times \(表示叉乘,\)\cdot\(表示点乘,记为\)[a b c]$ 关于它的几何意义的话--图片来自网络 其中\(Prj_{a\times b}c\)代表的是\(c\)这个向量在\(a\times b\)这个向量上的投影 那么显然我们最后得到的是以这三个向量为三条临边的一个六面体的体积 四面体体…
ref不是太懂 #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef unsigned long long ull; int T, n, m, hea[1000005], cnt, uu, vv, rnd[1000005], rot, siz[1000005]; int tot, sf[1000005], sg[1000005], ff[1000005]…
学了斜率优化这题就能一气呵成地做出来啦qwqqwq #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int n, m, x[3005], s[3005], l, r, dp[3005][3005], que[3005]; double getK(int j, int u, int v){ return (double)(dp[v][j-1]+s[v]*s[v]-(dp[…
做了 [JSOI2008]Blue Mary开公司 以后发现这 tm 不就是个傻逼树剖+李超线段树吗,做了以后发现我才是傻逼--树剖竟然写错了--这题是我目前写过最长的代码了qwq #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int n, m, uu, vv, ww, dep[100005], fa[100005], dfn[100005], son[100005]…
ref ref 一个点就是一个数对 \((x,y)\). 记状态 \(f[i][1/0][1/0][1/0]\) 和 \(g[i][1/0][1/0][1/0]\),其中三个 \(1/0\) 取值分别代表"\(x\) 在前 \(i\) 位卡满 \(n\)(的前 \(i\) 位)/小于它"."\(y\) 在前 \(i\) 位卡满 \(m\)(的前 \(i\) 位)/小于它"."\(k_{current}\) 在前 \(i\) 位卡满 \(k\)(的前 \(i…
there #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; int T, n, m, pri[1000005], pricnt, mu[1000005], f[1000005], g[1000005], F[1000005]; bool isp[1000005]; const int mod=1000000007; te…
[题目] Hecy 又接了个新任务:BE 处理.BE 中有一类被称为 GBE. 以下是 GBE 的定义: 空表达式是 GBE 如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE 如果 A 与 B 都是 GBE,那么 AB 是 GBE 样例输入 []) 样例输出 1 [思路] 区间DP 设f[i][j]是区间i~j的最小操作数 方程:f[i][j] = min{f[i][k]+f[k+1][j]} 若a[i] == a[j] f[i][j]=min(f[i][j],f[i+1][j-…