摘要:
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 思路: 首先考虑前缀和为负数和0,肯定是每次只考虑一个数字最优; 然后考虑dp f[i]=max(f[j]+i-j),其中j+1到i的和为正数, 就是在前i个里找前缀和小于si并且最大的f[j],因为f[j]中j已经选择, 所以是j+1到i,使 阅读全文
摘要:
B 思路 看时间复杂度肯定是预处理o1查询,每个数字只能选择一次,可以使用01背包求解 f[i]+=f[i-a[j]*a[j],枚举i时,使用一个变量max,表示上一层枚举到的最大值,如果使用N的话其实好多f[i]并没有更新 代码: int fib[N]; int f[N]; void init() 阅读全文
摘要:
D. Reverse Sort Sum 思路 首先可以观察到每个1都加了n次,所以总共1的个数就是sum/n,然后排完序1都在后面,后面也就好确定,最后一个数字只能有1和n两种情况 1的时候这一位是0,n的时候这一位是1,然后向前移一位,同时把f(a,n)减去,可以使用线段树来维护 代码: void 阅读全文
摘要:
###地道战 思路: 题目可以转化为,求包含x的最长连续子段 使用线段树合并,因为线段树的左右区间是相邻的 分别维护一个左前缀和右后缀的最大长度 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using 阅读全文
摘要:
###上帝造题的七分钟2 思路: 数据范围$10^{12}$,大概开方5六次之后就变成1,当一个区间全是1的时候就没必要改变,其他暴力修改即可 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using 阅读全文
摘要:
###pairing Game 题意是,从n到1每次删去一对数字,求剩余的相同数字之间的距离 思路: 从1到n开始,每次添加一对数,求出来他们之间已添加的点的数量,同时求出这个点对以前的点产生的贡献,维护三个树状数组 代码: #include <bits/stdc++.h> #define int 阅读全文
摘要:
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 + 阅读全文
摘要:
###[SCOI2005]骑士精神 思路: 迭代加深,启发式剪枝 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using namespace std; #define all(v) begin(v), 阅读全文
摘要:
###[SCOI2009]最长距离 思路: 将1的格子变成边权为1,则需要求每个点所能到达的点的最短距离并且不超过t,这里采用01bfs求最短路 代码: #include <bits/stdc++.h> #define int long long int _ = 0, Case = 1; using 阅读全文