摘要:
求一个数组的m段的最大子段和。 dp[i][j] 表示 当前是第i段,且最后一个元素是a[j]时的最大子段和。那么有两种转移,作为第i段的最后一个元素 或者 第i段的第一个元素。 状态转移方程为dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][k]+a[j]) i-1<=k< 阅读全文
摘要:
给定n * n矩阵C ij(1 <= i,j <= n),我们要找到0或1的n * n矩阵X ij(1 <= i,j <= n)。 此外,X ij满足以下条件: 1.X 12 + X 13 + ... X 1n = 1 2.X 1n + X 2n + ... X n-1n = 1 3.对于每个i(1 阅读全文
摘要:
注意建树范围开大一点。 x 先让其 +1 ,树状数组不能维护0 这个点。 int n; int c[32005]; struct Point { int x, y; Point(int _x = 0, int _y = 0) { x = _x; y = _y; } friend bool opera 阅读全文
摘要:
给定字符串,输出所有相等的前后缀的长度。 首先容易想到Next[len2] 必然满足题目要求。 接下来的所有也满足的必然是s2[1 ~ Next[len2]]的前后缀,即是一个递归的过程。 char s1[1005], s2[400005]; int Next[400005]; int len1, 阅读全文
摘要:
题意:给定一个字符串,问最少需要添加几个字符可以使之变为循环序列。 考虑到字符串的最小循环节。 对于len2这个点,若len2 % (len2 - Next[len2]) == 0 则存在最小循环节,长度即len2 - Next[len2]。循环次数 len2 / (len2 - Next[len2 阅读全文
摘要:
和上题类似,同样是区间染色,但是此题范围0 - 8000,不用离散化,暴力统计即可, ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll Lcm(ll a, ll b) { return a / gcd(a, b) * b; } 阅读全文
摘要:
n <= 10000 人贴海报,问最后可以看到的海报的个数。 1<=li<=ri<=10000000 由于范围很大,注意离散化。 bool vis[maxn * 4]; int a[maxn * 4]; int L[maxn * 4]; int R[maxn * 4]; int lazy[maxn 阅读全文
摘要:
区间增加 区间查询和 struct Tree { int l, r; ll sum; }; Tree node[maxn * 4]; ll a[maxn]; ll lazy[maxn * 4]; void Pushdown(int rt, int m) { if (lazy[rt]) { lazy[ 阅读全文
摘要:
n <= 5e5 两种操作:1.询问 L ,R 能否通过修改一个数使得区间gcd为x 2. 修改某点的大小 首先联想到可以用线段树维护区间性质,单点修改。 如果判断1? 如果区间中所有数都是x的倍数,那么只需修改任意一个数变为x就可以。 如果区间中大于一个数不是x的倍数,由于仅仅能修改一次,所以肯定 阅读全文