
swust
ddgo
给我高高飞起来啊!(ACM退役,转JAVA后端了)
展开
-
HDU 1421搬寝室 swustOJ1151搬运工
HDU地址思路,要使得差值方最小,一定是选择连续的两个数。先把数组从小到大排序。构建出它们的差值方数组。当我们选取了一个数,那么这个数左右相邻的两个数都不能被选择。所以题意就转换为。给一个序列(我们处理好的),求在序列中选取不相邻的k个数,使得最大值最小。这样就可以转换为dp了。设转移状态为dp[i][j] 表示前i个中选择j个数的最下值。那么dp[i][j] = min(dp[i-1][j],dp[i-2][j-1] + a[i]) 表示,当前状态由当前这个不选(dp[i-1][j])转移过来,原创 2020-11-21 17:07:40 · 138 阅读 · 0 评论 -
swust OJ 249 求凸包面积模板
用Graham_scan 求出凸点,再用叉积求面积,一个三角形的面积等于叉积的一半。#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair<int,int> pii;typedef long long ll;const int INF = 0x3f原创 2020-11-11 12:09:40 · 299 阅读 · 0 评论 -
sum A^B 等比数列求和(log(k))
题目地址 -> 一个方法,因为mod捕食不是质数。poj 1845 -> 两个方法都可以 还有一个求逆元的解法参考以前博客先化等比数列: 设 sum = (1+q+…+qc)假设 c为奇数, 则可以得到 sum = (1+q+…+q(c/2)+q((c+1)/2)+…+qc)则为sum = (1+q+…+q(c/2)+q((c+1)/2)*(1+q+…+q(c/2)))sum = (1+q((c+1)/2)) * (1+q+…+q(c/2))当 c 为偶数时,同理, sum = (原创 2020-11-05 18:04:32 · 651 阅读 · 0 评论 -
无聊的开车 (状压DP)
题目地址每个起点与终点组成一个状态节点,然后实现状态转移,注意权值的计算,dis -> 等于上一个点的终点到下一个点的起点+ 下一个点的起点到下一个点的乘2.和哈密顿的那个类似:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair<int,int原创 2020-10-27 00:18:27 · 148 阅读 · 0 评论 -
纽扣 (简单博弈)
题目地址类似以前的简单博弈,只有一对由K数量的石头,每次最多取L次,求后手获胜的概率当k%(L+1) == 0 ,后手获胜,现在求解L,枚举一下就行了。没了解为什么可以 , 去学一下那个简单博弈 巴什博弈#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair原创 2020-10-23 00:15:12 · 142 阅读 · 0 评论 -
交税
题目地址由题目分析得到。把税分成尽可能少的质数堆。每次找到 比n小的最大质数,注意两个质数间的距离很小,所以我们直接枚举一下,再用sqrt(n)去检查是否为质数就可以了。是的话就cnt++,且 n-= 当前质数。直到 n <=2.复杂度大致为 200 * 常数 * sqrt(n)代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int原创 2020-10-22 23:57:38 · 427 阅读 · 0 评论 -
涂颜色(欧拉定理 + 大数模拟取模)
每一行只有两种情况,与列无关,所以答案时2n2^n2n因为n很大很大,所以由欧拉定理 当a与mod互质时 aba^bab(模 mod) = ab模phi(mod)a^{b 模 phi(mod)}ab模phi(mod) (模 mod)= ab(模mod−1)a^{b(模 mod-1)}ab(模mod−1)(模 mod) , 数组模拟去模,把 n 给缩小。最后快速幂就行了。数的四则运算取模证明:设 a = mp + r1 , b = np + r2.(a+b)%p = (a%p+b%p) % pa原创 2020-10-22 21:12:06 · 324 阅读 · 0 评论 -
Parallelepiped walk
题目链接用递归把面展开先把一个点移到最底面,之后开始展开操作。整体向右展开,即除了当前底面之外,这个六面体往右边旋转,旋转后以底面左上角为(0,0)整体向左展开,即除了当前底面之外,这个六面体往左边旋转,旋转后以底面左上角为(0,0)整体向前展开,即除了当前底面之外,这个六面体往前边旋转,旋转后以底面左上角为(0,0)整体向后展开,即除了当前底面之外,这个六面体往后边旋转,旋转后以底面左上角为(0,0)如果你想暴力,那情况不能少。 惨痛教训当另一个点转到底面时,就计算出它们之间的值。#de原创 2020-10-22 14:50:07 · 322 阅读 · 1 评论 -
k上升段(DP)
题目地址以1,1为起点设dp[i][j] 为 以i个数全排列中j上升段的个数。特殊的dp[1][1] 为 1转移方程 看上一次某些状态假设上一次的一个状态为 dp[i-1][j]可以把当前的i这个数每次分别插入到每一段的末尾, 即dp[i][j] = j*dp[i-1][j];假设上一次的一个状态为 dp[i-1][j-1]可以把当前的i这个数每次分别插入到除每一段的末尾的地方, 即dp[i][j] = (i-j+1)*dp[i-1][j-1];对于其它状态dp[i-1][j-2]不可能转原创 2020-10-14 21:10:07 · 364 阅读 · 0 评论 -
185: 前缀字符串 (图,思维)
题目地址对于每一种关系(a是b的前缀字符串),我们可以构建出一条有向边 a->b,把所有边连起来之后,我们可以得到一个类似于下面的图会得到一个有多个连通分支的图。转换题意,使得选择某些节点,让任意的两个节点都没有连接关系,且选择的节点最多。只需把一个连通分量中出度为0的点加入集合就可以了。因为这表示这个点不能成为所有点的前缀。怎么保证是最多?证明选择有出度的比没出度的更差就行。选择有出度的,则与他相连的所有点都不能被选取,会导致至少1个无出度和若干有出度的节点不能被选取,而基于构建出来图原创 2020-10-14 11:16:07 · 220 阅读 · 0 评论 -
Jack Straws(叉积 + floyd / 并查集)
题目地址判断线段是否相交ab cd用叉积的性质判断 a与cd,b与cd, c与ab,d与ab的关系(模板可以去找一下)1 floyd 更新联通。把枚举两两线段,判断是否相交,再用floyd去更新,推广出所有线段之间的联通关系。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace原创 2020-10-11 22:09:41 · 351 阅读 · 2 评论 -
swust 649: NBA Finals (DP)
题目地址数据好像有些问题。官方的地址有点难找,所以不能完全验证下面正确。法1dp[i][j] 表示 A赢差i次B赢差j次 A赢得概率,输出dp[n][n]故有状态转移方程为 dp[i][j] = dp[i-1][j] * p + dp[i][j-1] * (1-p)A赢i次B赢j次得概率为 A赢i-1次且B赢j次并且这次A赢 + …代码:int n; cin>>n>>p; for(int i=1;i<=n;i++){ dp[i][0] = 0; dp[原创 2020-10-11 18:13:12 · 553 阅读 · 0 评论 -
Independent Task Scheduling
题目地址思路:dp[i][A] 表示第i件物品,花费A机器A的时间且花费B机器dp[i][A]的时间的最小值dp[i][A] = min(dp[i-1][A-a[i]],dp[i-1][A]+b[i]);1:dp[i-1][A-a[i]] 表示第i件物品用于A机器处理;2:dp[i-1][A] + b[i] 表示用于B机器处理,当前A机器还是要处理A的时间 3:最后一个最优的时间为 min{max(A,dp[n][A]),....,...}4: 不需要初始化dp为INF,因为5: 第一维可以原创 2020-10-07 15:20:19 · 157 阅读 · 0 评论 -
奶牛卧室(同余)
题目地址1: a1a_1a1 = b1b_1b1 (modk)\pmod{k}(modk)2 : a2a_2a2 = b2b_2b2 (modk)\pmod{k}(modk)即 a1a_1a1 - a2a_2a2 = b1b_1b1 - b2b_2b2 (modk)\pmod{k}(modk)当b1等于b2时是错误的,即 a1a_1a1 - a2a_2a2 = 0 (modk)\pmod{k}(modk)故 a1a_1a1 - a2a_2a2 的所有因子都能满足标记出所原创 2020-09-27 20:30:41 · 244 阅读 · 0 评论 -
Euclid‘s Game (更相减损术理解)
题目地址题意:从已经得到的集合里面选取任意两个数,得到的差是以前没出现过的正数,求出集合的最大个数就可以判断对错。gcd(a,b) = gcd(b,a-b) = gcd(a,a-b) = x可以知道,所有类似于(a-b)这种两个数的差值,一定是x的倍数。所以结合里面的元素全是x的倍数,只需求出有多少个。n = max(a,b)/(__gcd(a,b)) - 2.代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);原创 2020-09-11 15:37:03 · 393 阅读 · 1 评论 -
又见GCD(求一组数中任意两个数的最大gcd)
题目:哈特13最近在学习数论问题,然后他智商太低,并学不懂。这不,他又碰到不会的题了。题意非常简单:有n个数字,求出这些数字中两两最大公约数的最大值。你一定要帮助他解决这个问题啊。输入多组输入,约25组,直到文件末尾。每组数据占2行,第一行为数字个数n,2<=n<=100000第二行即为对应的n个数,a1到an,1<=ai<=100000输出输出问题的...原创 2020-04-08 18:01:17 · 2052 阅读 · 0 评论 -
求众数o(1)空间做法
题目:给你一个n个数的数列,其中某个数出现了超过n/2次即众数,请你找出那个数。(注意时空限制)输入第1行一个正整数n。(1<=n<=1000)第2行n个整数用空格隔开。整数的大小不超过int,可能为负。输出一行一个正整数表示那个众数。输入:53 2 3 1 3输出:3时空限制 :1000ms/300kb;没错卡空间 虽然数据比较小,但是这题的目的就是卡空...原创 2020-02-28 18:06:13 · 575 阅读 · 0 评论 -
Escape(有加速铭文)(优先队列)
题目:BH is in a maze,the maze is a matrix,he wants to escape!输入The input consists of multiple test cases.For each case,the first line contains 2 integers N,M( 1 <= N, M <= 100 ).Each of the f...原创 2020-02-22 21:37:56 · 245 阅读 · 0 评论 -
三角平方数
题目:最近毛哥买来一本数论方面的书《数论概论》,这本书上定义了两个很有趣的数:三角数,平方数。但是书上出了一个难题:当三角数和平方数相等时,叫做三角平方数。问你第n个三角平方数是什么。毛哥想了很久都不会,你能帮他找出第n个三角平方数吗?输入多组数组,输入一个数n(1<=n<=25)输出输出有两个数,第n个三角平方数(分别输出是第几个三角数和第几个平方数,中间用空格隔开)输...原创 2020-02-22 21:09:09 · 778 阅读 · 0 评论 -
Calculate Sum-Of-Absolute-Differences
题目:给你N个正整数,求两两之差的绝对值之和。 比如有4个数分别为 3,2,6,5,则答案为 |3-2| + |3-6| + |3-5| + |2-6| + |2-5| + |6-5| =14输入测试有很多组,对于每一组测试:第一行为一个正整数 N( 2<= N <=20000)。第二行有N正个整数,每个数不大于 1000000。输出每组测试输出一行。测试数据保证结果在i...原创 2020-02-25 21:50:39 · 720 阅读 · 0 评论