04 2022 档案
线段树二分及区间mex
摘要:仓鼠的鸡蛋 思路: 把线段树权值全部置为m,维护区间最大值,每次优先找满足条件的左边的区间 const int N = 500010; int cnt[N]; int a[N]; int n, m, k; int tr[N << 2]; int M = 1; void pushup(int p) {
求区间中不同的数的个数(离线 线段树)
摘要:HH的项链 思路: 离线按照r排序,然后把小于r的数字加到线段树中,同时把出现过的a[j]的位置在线段树中删掉 代码: #define read() FastIO::read() #define clean() FastIO::flush() const int N = 1000010; int a
线段树维护差分
摘要:P1438 无聊的数列 思路: 线段树维护差分数组 code #define ls(x) x<<1 #define rs(x) x<<1|1 struct tree { int l, r; int add, sum; } tr[N << 2]; int a[N], b[N]; void pushup
codeforces round#783 div2 D
摘要:codeforces round#783 div2 D 思路: 首先考虑前缀和为负数和0,肯定是每次只考虑一个数字最优; 然后考虑dp f[i]=max(f[j]+i-j),其中j+1到i的和为正数, 就是在前i个里找前缀和小于si并且最大的f[j],因为f[j]中j已经选择, 所以是j+1到i,使
2021GDCPC (B,K)
摘要:B 思路 看时间复杂度肯定是预处理o1查询,每个数字只能选择一次,可以使用01背包求解 f[i]+=f[i-a[j]*a[j],枚举i时,使用一个变量max,表示上一层枚举到的最大值,如果使用N的话其实好多f[i]并没有更新 代码: int fib[N]; int f[N]; void init()
codeforces round 782 Div2 D. Reverse Sort Sum
摘要:D. Reverse Sort Sum 思路 首先可以观察到每个1都加了n次,所以总共1的个数就是sum/n,然后排完序1都在后面,后面也就好确定,最后一个数字只能有1和n两种情况 1的时候这一位是0,n的时候这一位是1,然后向前移一位,同时把f(a,n)减去,可以使用线段树来维护 代码: void
HDOJ1540地道战
摘要:###地道战 思路: 题目可以转化为,求包含x的最长连续子段 使用线段树合并,因为线段树的左右区间是相邻的 分别维护一个左前缀和右后缀的最大长度 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using
BZOJ#3038上帝造题的七分钟2
摘要:###上帝造题的七分钟2 思路: 数据范围,大概开方5六次之后就变成1,当一个区间全是1的时候就没必要改变,其他暴力修改即可 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using
pairing game 杭银理财杯
摘要:###pairing Game 题意是,从n到1每次删去一对数字,求剩余的相同数字之间的距离 思路: 从1到n开始,每次添加一对数,求出来他们之间已添加的点的数量,同时求出这个点对以前的点产生的贡献,维护三个树状数组 代码: #include <bits/stdc++.h> #define int
abc246(D-F)
摘要:D: 枚举a,二分b,更新最小值 code: void solve(int Case) { int n; int x; cin >> n; int ans = 2e18; auto check = [&](int a, int b) { int x = a * a * a + a * a * b +
BZOJ#1085[SCOI2005]骑士精神
摘要:###[SCOI2005]骑士精神 思路: 迭代加深,启发式剪枝 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using namespace std; #define all(v) begin(v),
BZOJ#1295[SCOI2009]最长距离
摘要:###[SCOI2009]最长距离 思路: 将1的格子变成边权为1,则需要求每个点所能到达的点的最短距离并且不超过t,这里采用01bfs求最短路 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using
BZOJ#1084[SCOI2005]最大子矩阵
摘要:###[SCOI2005]最大子矩阵 思路: f[i][j][k]表示前i行中选择了j个子矩阵,并且第i行的状态式k的j个最大子矩阵的和; k有四种方式,10,01,11,11(两个不属于一个矩阵) 要么承接上一层,要么单独为一个矩阵 代码: #include <bits/stdc++.h> #de
BZOJ#1491[NOI2007]社交网络
摘要:###[NOI2007]社交网络 思路: 使用floyd算法并记录路径, d[i][j]=d[i][k]*d[k][j] 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using namespace s