摘要:
思路不是很难,因为宝藏只会在给出的n个点内有,于是只需要在这n个点里面连边,一个点如果能到达另一个点则连一条有向边, 这样用强连通分量缩点后答案就是DAG的最长链。 问题在于暴力建图是O(n^2)的,需要进行优化。 但是这n个点只有三种特殊的点,首先,同一行的点如果类型都是1显然构成了一个强连通分量 阅读全文
摘要:
容易发现,对于牌堆里第x张牌,在一次洗牌后会变成2*x%(n+1)的位置。 于是问题就变成了求x*2^m%(n+1)=L,x在[1,n]范围内的解。 显然可以用扩展欧几里得求出。 # include <cstdio> # include <cstring> # include <cstdlib> # 阅读全文
摘要:
显然每次贪心的走最少消耗的路径即可。那么也就是找出最短路,次短路,,,K短路之后消耗E的能量的最多的路径条数。 也就是裸的A*算法。 #include <bits/stdc++.h> using namespace std; typedef double lf; const int N=5005, 阅读全文
摘要:
一道很经典的DP题。 题意:求n排列中波动排列的种数。 不妨考虑DP,令dp1[i][j],表示1-j的排列中,第一项为i之后递增的波动排列种数。dp2[i][j]表示1-j的排列中,第一项为i之后递减的波动排列种数。 显然有一个性质,dp1[i][j]=dp2[j+1-i][j],将各项用j+1减 阅读全文
摘要:
题意:给出m次n个千足虫的足数信息,确定在第几次测试后可以确定每个千足虫的来历。 我们可以观察到每个测试结果具有异或后依然成立的性质,于是实际上我们只需要从头到尾确定有n个线性相关的向量是在哪一个测试后出现。 也就是说,直到出现了n个线性基,此方程的自由变元的数量才为0,此方程才有唯一解。 所以,依 阅读全文
摘要:
题意: n个硬币摆成一排,问有连续m个正面朝上的硬币的序列种数。 很明显的DP题。定义状态dp[i][1]表示前i个硬币满足条件的序列种数。dp[i][0]表示前i个硬币不满足条件的序列种数。 那么显然有dp[i][1]=dp[i-1][1]*2+dp[i-1-m][0]. 如果前i-1个硬币满足条 阅读全文
摘要:
题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费。花费指的是选择的区间中最大长度减去最小长度。 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭区间,然后线段树的每一个节点表示一个半开半闭区间。 接着我们注意到需要求最小的花费,且这个花费只与选 阅读全文
摘要:
90分,有一个点TLE.... 首先可以证明一个东西,如果从上面一排的某个点bfs一次到最下面一排的饮水点不是一个区间的话,那么最后一定所有饮水点不会被覆盖完的。 证明考虑反证法。 所以从上面一排的每个点bfs一次得到一个区间。题目转化为给出m个区间覆盖m个点的最小区间选择数。 显然是个明显的贪心, 阅读全文
摘要:
这道题的DP的状态设计的很有想法啊。 假如我们一行一行来选择的话,状态将会极其复杂。 如果一列一列来看的话,比如你想选aij,那么第i列的前j个都要选,并且第i+1列的前j-1个都要选。 于是状态就很好设计了,定义dp[n][i][j]表示还剩下n个要选的砖块,当前选择第i列的前j个所能达到的最大分 阅读全文
摘要:
题意:给出一组数,求最小的第k个由这些数异或出来的数。 先求这组数的线性基。那么最小的第k个数显然是k的二进制数对应的线性基异或出来的数。 # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> 阅读全文