![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
思维
Aurora141592
这个作者很懒,什么都没留下…
展开
-
[图论]树上启发式合并
https://codeforces.com/contest/600/problem/E#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 10, mod = 1e9 + 7; vector<int> g[maxn];int n,ma,a[maxn],cnt[maxn],fa[maxn],dep[maxn],sz[maxn],son[maxn],to原创 2021-01-14 12:38:02 · 110 阅读 · 0 评论 -
CSU – 1810 – Reverse(计数 + 贡献)
http://fastvj.rainng.com/contest/299737#problem/D把一串数字中的所有区间(有序)分别翻转求和取模,这种题要单独算每位的贡献。对于第i个位置,有i * (i – 1) / 2 + (n – i) * (n – i + 1) / 2个区间不会影响到它,有min(j, n – i + 1)个区间会把j(j < i)翻转到i,有min(i, n - j + 1)个区间会把j(j > i)翻转到i,还有对称轴就在i,有min(i, n – i +原创 2021-01-13 21:10:10 · 77 阅读 · 0 评论 -
洛谷 – 输出逆序数为m且字典序最小的排列(思维)
P1338 末日的传说https://www.luogu.org/problemnew/show/P1338首先,1到n的排列最多有n * (n – 1) / 2个逆序数,我们从小到大考虑每个数放的位置,对于1来说,如果2到n的排列能形成的最大的逆序数大于等于m,那当然是把1放到开头能使字典序最小,然后问题就变成了寻找2到n的一个逆序数为m且字典序最小的排列。否则如果2到n的排列能形成的最大的逆序数小于m,那1就一定不会放在开头,为了尽量使第二小的数2放在开头,这个1一定要产生最大的贡献,那就是放在最后原创 2021-01-09 09:46:39 · 264 阅读 · 0 评论 -
NOWCODER – 出题(思维)
https://ac.nowcoder.com/acm/contest/332/A我思维为啥那么渣啊,判断是否有解也挺重要的首先有解的充要条件为6m <= n <= 9m 设有x个6,则剩下的数有解的充要条件为7(m - x) <= n - 6x <= 9(m - x) 解得7m - n <= x <= (9m - n) / 3if (n < 6 * m || n > 9 * m) cout << "jgzjgzjgz" << e原创 2021-01-09 09:43:07 · 80 阅读 · 0 评论 -
CF – Light It Up(前缀和)
http://codeforces.com/contest/1000一道前缀和傻逼题调半天#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 5;int a[maxn], dif[maxn];ll pre[2][maxn], suf[2][maxn];int main(){ ios::sync_with_stdio(0); cin.tie(0); c原创 2021-01-08 13:58:45 · 233 阅读 · 0 评论 -
[思维]数字1到n的字典序第k小
存个很强的模板,貌似已经快到(O(logn))了ll n, k, cnt = 1; scanf("%lld %lld", &n, &k); k--; while(k){ ll st = 0, head = cnt, tail = cnt + 1; while(head <= n){ st += min(n + 1, tail) - head;原创 2021-01-08 13:55:36 · 192 阅读 · 0 评论 -
CODECHEF – Pouring water(思维)
这题有一个很简单的解法,只要C % gcd(A, B)则必有解,因为假设只从a倒到b,t = gcd(a, b),则b内的水必然可以达到这几个值:0, t, 2 * t, 3 * t, …, b,反过来同理,然后直接暴力模拟,如果a为空就装满然后往b里倒min(a, B – b)的水,因为b满了就不能再倒了,然后每次a -= min(a, B – b),然后如果b满了就把b清空。#include<bits/stdc++.h>using namespace std;int cal(int A原创 2021-01-05 13:25:05 · 158 阅读 · 0 评论 -
CODECHEF – DeliveryMan(思维 + 贪心)
https://cn.vjudge.net/contest/272520#problem/B定义一个结构体,两个成员,分别表示第i个数给x的小费和给y的小费。首先先全部选x,然后按y – x的大小从大到小排序,显然所有为正的值都能更新答案。但是y最多只能选y个,最少要选n – x个,先把n – x个全选上,然后如果y – x大于0再选上即可。#include<bits/stdc++.h>using namespace std;struct e{ int x, y;}a[1000原创 2021-01-05 13:24:36 · 104 阅读 · 0 评论 -
[二分]四个数和为0(标记)
https://www.51nod.com/Challenge/Problem.html#!#problemId=1267如果每个数可以选不止一次那太简单了,但是如果只能选一次呢,就很麻烦,就必须保存每一个sum来自哪两个位置的数,找到和为0的两个sum还要判断是否来自四个不同的点,要把所有相等的sum都判断一次,可以使用lower_bound到upper_bound确定范围。struct e{ int l, r, sum;}a[maxn * maxn];int t[maxn];bool原创 2021-01-05 13:22:34 · 122 阅读 · 0 评论 -
[数据结构]CF – 567D – One-Dimensional Battle Ships(思维 + set模拟)
http://codeforces.com/contest/567/problem/Dset存储区间端点,注意是开区间,每次用lower_bound求出右端点,再把指针自减求出左端点,然后容量减去原区间容量,加上新区间容量,当总容量小于k的时候输出编号即可。int a;int cal(int l, int r){ int len = r - l + 1; if (len < a) return 0; return (len + 1) / (a + 1);}set&l原创 2021-01-05 13:19:34 · 107 阅读 · 0 评论 -
[思维]51nod – 数字0-9的数量
https://www.51nod.com/Challenge/Problem.html#!#problemId=1042这是一道数位dp,然而并不需要用dp写。void solve(ll m, ll a[]){ ll base = 1; while (m / base){ //cur为当前计算的位上的数,left为它左边的数,right为它右边的数。 ll cur = m / base % 10, left = m / base / 10, right原创 2021-01-05 13:18:53 · 69 阅读 · 0 评论 -
CF – gym – 101502 – J. Boxes Game(博弈dp + 记忆化搜索 + 思维)
http://codeforces.com/gym/101502/problem/Jdfs居然两行就能写完?恐怖。定义dfs(l, r)返回区间[l, r]的答案, 先看第一次调用这个函数,这个函数返回max(a[l] – dfs(l + 1, r), a[r] – dfs(l, r – 1)),逗号前面是选择左端点,选择左端点之后dfs(l + 1, r)就是区间[l + 1, r]的答案,由于是x – y,所以第一个人先手选择左端点或右端点,后手取剩余区间最大值,两者相减,取其最大值,之后两个人交换原创 2021-01-04 10:45:16 · 188 阅读 · 0 评论 -
CF – gym – 101502 – F. Building Numbers(思维)
http://codeforces.com/gym/101502/problem/F简直就是思维僵化了啊,居然想着怎么bfs,显然mle+tle。实际上只有+1和*2两种操作,不管怎么样都不会减小,所以可以倒着来看,思考怎样才能最快从x变成1,如果还有减1就不能这样做了。显然一直除2是最快的,但是只有2的倍数才能除2,所以如果是奇数的话次数+1就好了。int f(ll x){ int cnt = 0; while (x){ if (x & 1){原创 2021-01-04 10:36:57 · 86 阅读 · 0 评论 -
[思维]阶乘后面0的数量
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003找有几个5,几个25,几个125,。。。,直到一个都找不到,然后算每个5的贡献就好了。#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ ll n, d = 5, ans = 0, cnt = 1; cin >> n;原创 2021-01-03 14:44:27 · 79 阅读 · 0 评论