- 博客(59)
- 收藏
- 关注
原创 ICPC-2022网络赛第二场
首先, 对于一个满足条件的区间, 若确定最小值x , 那么该区间内的数字一定是 [x ~ x + len - 1] , 也就是方案数 = len!排完序后访问, l 一定是刚好包括的, 如果 r 也被包括了, 那么就是这个区间, 如果r 没有被包括, 就pop, 直到找到刚好满足的。给一个长度为n的字符串 在字符串内只有 I,C,P 三个字符,有 Q 次询问,每次询问某两个区间内为ICPC的子序列有多少个?第i行, 是将序列 a[1…是 该题的一个单位元, 也就是说, 1%p, 10%p , …
2022-09-29 16:23:55
928
原创 牛客-946B-筱玛爱阅读
题意n本书, 对应n个价格标签, 你可以随便改变价格标签的顺序m个优惠方案, 每个方案, 可以让这个方案中, 价格最小的那本书免费要买完这n本书, 且每本书只能买一次, 问最小花费是多少?
2022-09-20 17:22:18
372
原创 CF1313C2 Skyscrapers (hard version) -单调栈优化dp
给定一个数组A,构造一个数组B,满足,B先增再减(或者只增,只减), 且 bi
2022-07-08 17:36:43
291
原创 洛谷P3201 [HNOI2009] 梦幻布丁 (启发式合并)
什么是启发式合并?题目int a[N], n, m;int fcol[N];vector<int> st[N];int ans = 0;void Merge(int x,int y){ // x -> y // upd ans for(int i :st[x]){ if(a[i-1]==y) ans--; if(a[i+1]==y) ans--; } // upd
2022-03-22 16:07:48
216
原创 Closest Equals离线,树状数组,维护后缀min
int tree[N],n,m;int lowbit(int x){ return x & (-x);}// 维护 后缀minvoid add(int x,int y){ for (; x;x-=lowbit(x)){ tree[x] = min(tree[x], y); }}int ask(int x){ int ans = INF; for (; x<=n;x+=lowbit(x)){ ans =.
2022-03-09 16:55:32
212
原创 牛客寒假1 B炸鸡块君与FIFA22 ST表,log查询
int f[3][N][21];int qsm(int l,int r,int st){ int t = (st%3 + 3) % 3; int ans = st; for (int k = lg(r - l + 1); k >= 0;k--){ if(l + (1<<k) - 1 <=r){ ans += f[t][l][k]; t = (ans%3 +3) % 3;
2022-03-01 20:24:34
238
原创 Codeforces Round #743 (Div. 2) 总结B,C
链接B题目要求;对于b组数中的每一个x,在a中找所有比x小的数的最小权值模拟办法:扫b,对于a,一直加到所有小于b的条件的,优先队列维护最小值/*new year!*/#include <iostream>#include <cstring>#include <string>#include<map>#include<queue>#include<set>#include<algorithm>#i
2022-01-29 17:55:06
942
原创 C.No More Inversions 回文,找规律
链接特性:非回文+回文部分难点:逆序的个数相同从样例开始去推一下,重点放在回文部分,研究它的逆序的个数容易发现,1 2343223432 把它翻转一下,43234这样的逆序的个数是相同的…非回文部分,从小到大排,回文部分从大到小排...
2022-01-28 20:39:28
262
原创 D. Treelabeling 二分图染色
链接/*I think*/#include <iostream>#include <cstring>#include <string>#include<map>#include<queue>#include<set>#include<algorithm>#include<cmath>#include<vector>#define debug(a) cout<<#a&l
2022-01-27 19:18:52
863
原创 D. Frog Traveler bfs优化
链接/*new year!*/#include <iostream>#include <cstring>#include <string>#include<map>#include<queue>#include<set>#include<algorithm>#include<cmath>#include<vector>#define debug(a) cout<<#a
2022-01-27 17:05:47
498
原创 C. BA-String 字符串字典序最小
链接对于a—(1)a----(2)a----(3)再中间插入b,形成几种字符串根据字典序排序的方案构成一个偏序关系不难发现,对于123块,有1>2>3可以看做一种变进制数每一位的权重为n1+1,n2+1,n3+1(1,2,3能放的个数+1 (因为0也算))#include <iostream>#include <cstring>#include <string>#include<map>#include<queue>
2022-01-20 13:34:14
670
原创 D. The Number of Imposters 扩展域并查集
链接const int N = 2e5+10;int fa[2*N]; int get(int x){ if(x==fa[x])return x; return fa[x]=get(fa[x]);}bool query(int x,int y){ if( get(x) == get(y)) return true; return false;}void uni(int x,int y){ int rx = get(x);
2022-01-19 16:13:18
591
原创 C. Permutation Cycle 置换,构造环
不难发现,这是个 i->pi的置换对于样例1,即为置换(6 1)(5 4 3 8 2)(9 7)题目即让构造ax + b y = nx个a次置换,y个b次置换ll exgcd(ll a, ll b, ll &x, ll &y){ if(!b){ x = 1, y = 0; return a; } int d = exgcd(b, a%b, y, x); y -= x*(a/b); return d; .
2022-01-15 15:30:39
376
原创 CF 1056D Decorate Apple Tree
题目大意:有一颗树,可以往节点上挂灯泡(有很多种颜色),定义一个happy节点:这颗节点子树的所有叶子节点所挂的灯泡颜色不同现在问你有1到n个happy节点,分别需要最小多少种颜色来装饰灯泡1.一个结点可以代表一颗子树,n个结点可以代表n个子树2.一个happy结点的cost为该子树的叶子结点数不难得到,k个happy结点,即用前k小的cost的结点可以dfs,得到所有结点的叶子结点,然后排序,从小到大输出即可const int N = 1e6+10;vector<int> .
2022-01-13 17:17:47
166
原创 Educational Codeforces Round 85 C.Circle of Monsters 贪心
最朴素的想法,枚举开始的点,一直按顺序往下(因为每次射击一个,总的花费是 总a[i] - 能够节省的b[i] ,在顺序的情况下,只有一个b[i]被浪费),每个点如果都被前bi-1影响,总花费就是所有的 max(a[i]-b[i-1],0), 断掉的地方,即让起始的地方增加量最小即可找min a[i] - max(a[i]-b[i-1],0)const int N = 3e5+10;ll a[N], b[N];void sov(){ ll n; cin >.
2022-01-12 10:48:23
158
原创 调和级数(筛法原理应用)
for (int i = 1; i <= n;i++){ for (int j = 1; j <= n / i;j++){ //do(i,j,i*j) } }以上代码可以 在 nlogn 的复杂度内,处理出 1~n 所有的数,且包含其约数信息题1:传送门tip: 1<=ai<=1e6int num[N];signed main(){ int n; scanf("%d", &
2022-01-03 17:15:18
566
原创 Secret Santa 模拟
传送门每个人i都想送礼物给a[i],i!=a[i],且结果b[i]从1~n,即错排,尽可能的让i送给a[i]贪心,先让第一个想送给a[i]的i送给a[i],剩下随便排再从头到尾扫一遍,让 送给自己的 i ,送给 本来想送给的 a[i],然后让之前送给 a[i]的 ii, 送给 i#include <iostream>#include <cstring>#include <string>#include<map>#include<queue
2022-01-02 17:01:06
376
原创 牛客练习赛 92 A-D
链接总结:codeforces有点久没有打,思维下降的比较快A题简单构造, 构造一个长度为n(奇数),中位数是A ,平均数是B的数列。把这个数列分为两边,一边是比A小的,一边是比A大的, 由于 A,B > 0 那么 可以构造一半是 -A 另一半是 A + 2* B最后再把差的值加上去B题构造,抽屉模型首先把 零元单独拿出来考虑, (减少干扰,因为最终只要把0放在任意的集合里就可以了)以下都是在考虑 非零元m:一般情况, 满足条件有三种 方便的构造 : 1.每个数是一个.
2021-12-01 10:45:03
214
原创 Educational Codeforces Round 117 D. X-Magic Pair 辗转运算
题目大意给出t组数据,每组数据给出a,b,x三个数对于a,b,可以分别作出两种操作a:=|a−b|b:=|a−b|求问,能否通过一系列操作,使a,b最终的数值满足a=x 或 b=x如果可以满足,输出YES,否则输出NO解题思路容易发现,对于 a > b , 每次因对 a 进行 操作 ,若 有解 即 a - p * b = x , 即 a % b = x%b , a <= b若 无解 ,运算 f ( b,a%b,x)注意 b==0 特判 a == x..
2021-11-23 14:11:20
279
原创 牛客练习赛91A~D
总结:我太菜了链接A:抽屉原理n件物品,构造(m+1)个抽屉,考虑最坏情况,n范围每次变化 n =ceil((double)n/(m + 1));B:
2021-11-15 21:42:30
330
原创 7道cf rating1600
A 模拟先找最大值,然后看有几个能达到这个最大值的,记录下来只有一个,就输出它有多个,再重新扫一遍,看这几个,谁先到达这个值B 暴力(可以写成dp)全部暴力,找最小dp: 我们发现要反复扫这个矩阵,不难想要用对于每个 i–j --m 记录下来dp[i][j][m]表示在i,从j放m个人 ,可以从m-1 转移过来#include <algorithm>#include <iostream>#include <queue>#includ.
2021-08-10 17:46:17
470
原创 kuangbin 最短路刷题 (4) JKL
J正常的dij,但是…poj无优化,所以,vector去存会tle,要用手写链表,或者是链式前向星去搞#include <iostream>#include <cstring>#include <string>#include<algorithm>#include<cmath>#include<cstdio>#include<map>#include<set>#include<vec
2021-08-07 21:03:42
86
原创 kuangbin 最短路刷题 (3) GHI
Gdij板子题#include <iostream>#include <cstring>#include <string>#include<algorithm>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#define ll long long#define PII pair
2021-08-07 15:22:33
97
原创 kuangbin 最短路刷题 (2) DEF
D建两遍图就可以了,正向建图 —x---为起点,到任意点的最短路反向建图,x为终点,任意点到x的最短路ESpfa改一下,判断正环即可,当然,是特定正环 从起点s-----到s,当s再次入队的时候breakint n,m,s;double v;struct Edge{ Edge(){ } Edge(int u,int v,double r,double lo):u(u),v(v),r(r),lo(lo){ } int u,v;double r,lo;};vector &
2021-08-06 21:30:33
109
原创 kuangbin 最短路刷题 (1) ABC
目前已完成ABC小总结: 如果一个问题是单调的,就可以用dij的思想首先,更广泛的去明白“单调”——即不变的,单一的性质譬如,单调增的性质(体现在数上面,随着i向前推进): a i < a i+1最短路当中的单调体现 : ???以B为例, ???A:dij模板题using namespace std;const int N=2100,inf=0x3f3f3f3f;struct Edge{ int u,v,w;};vector <Edge> eg[N]
2021-08-05 15:05:24
117
原创 Codeforces Round #665 ABC
A. Distance and Axis思维:可能性探索题意:在0-A中,找一点B,使 0-B,B-A的差为k通过移动B,不难发现,对于一个0-A 可行解的奇偶性B. Ternary Sequence思维:剃刀法则不难发现,只用考虑,a数组中2的个数,以及b数组中2的个数C. Mere Array思维:数字倍数 + 整体性探索第一步:发现 能够移动的 一定是 min 的倍数 (约数…)第二步: 研究整体 对于 a,min,b 发现一定能够
2021-08-05 14:17:31
110
原创 AcWing 197. 阶乘分解 (质数,数论,勒让德定理)
Sloution题目意思很简单,对N! 进行质因数分解N! 分解出来这底数,一定在2~N之间先找出 2~N中所有质数,然后用勒让德定理,求得幂数#include<bits/stdc++.h> #define ll long long#define PII pair<int, int>#define _for(i, a, b) for (int i = a; i < b; i++)#define For(i, a, b) for (int i = a; i .
2021-07-25 16:27:22
243
原创 AcWing 196. 质数距离 (数论,质数)
Soution#include<bits/stdc++.h> #define ll long long#define PII pair<int, int>#define _for(i, a, b) for (int i = a; i < b; i++)#define For(i, a, b) for (int i = a; i <= b; i++)#define foR(i, b, a) for (int i = b; i >= a; i--)#de.
2021-07-25 16:07:08
83
原创 P1020 [NOIP1999 普及组] 导弹拦截 (线性dp,lis)
Sloution :对于问1: 求最长 下降子序列 (非严格)对于问2: 求最长 上升子序列 (严格)问2:意思是,把一组序列,最少能拆成几个 不上升子序列每一个较高的后面的导弹,都不能被前面的击中,也就是说,能够划分的个数 >= lis画图说明 lis <= 能够划分的个数故 lis = 能够划分的个数#include <iostream>#include <cstring>#include <string>#i.
2021-07-22 10:57:07
167
原创 CF294B Shaass and Bookshelf (贪心,dp,01背包)
Sloution背包+贪心的思想背包的基本模型一般不难,但是如何从题目去构造出背包的模型比较难这题就是先用贪心的思想,去简化问题(然后,发现简化后的问题是一个背包)当然,这题数据量比较小,也可以直接暴力#include <iostream>#include <cstring>#include <string>#include<algorithm>#include<cmath>#include<set>#de..
2021-07-19 10:00:08
151
原创 P2370 yyy2015c01 的 U 盘 (dp,01背包,二分,排序)
Sloution在容量s的情况下,装下尽量多的v,(这个v的条件,是其w要小于接口),达到p的情况下,接口尽可能小。不难发现,v越小,接口越小,所以可以二分但是,其实,可以先排序,对w,用w从小到大去考虑,再去考虑当前f[s]是否到p (我没有想到)二分:#include <iostream>#include <cstring>#include <vector>#include <map>#include <string&.
2021-07-17 10:41:49
94
原创 P1466 [USACO2.2]集合 Subset Sums (dp,01背包)
Sloution将一个集合分为两部分,转换成1个背包,恰好装满sum/2的物品(sum &1==1,为奇数,不存在)ll f[10000];//不开long long见祖宗!!int a[45];int main(){ int n; cin >> n; f[0] = 1; a[1] = 1; _for(i, 2, n + 1) a[i] = a[i - 1] + i; //cout << a[n]; if(a[n]&1){ co.
2021-07-17 09:46:47
253
原创 P2392 kkksc03考前临时抱佛脚( 贪心(划掉),dp,01背包 ,思维)
Sloution!!!写这道题目前,先思考一个问题:把一堆数据,分成两组,让这两组的最大值最小如何求解?如果是简单贪心的话,只考虑局部,比如,让当前选择下达到最小,对于2,3,4这组数据我们会分成2,4 和 3 。但这不是最优的。局部最小 !=整体最小(很多时候,局部最小的贪心,是简单的线性结构,而不是这样的二选一 (二选一可以用dp去写,这题可以dp,但也可以直接 去推导) )从整体出发:想一下,会发现,要让两组数据差不多(偏移量小)的情况下,最小,那么,要让大的的小.
2021-07-17 09:12:55
399
原创 P2415 集合求和(水?dp,暴力)
Sloution一道水?题可以用数论去推。此处理解一下分治(很多时候,分治可以当做dp去推(或者贪心(少些,一般是不想关的子问题)))这里用dpint a[35];ll f[35];int main(){ //freopen("in.txt", "r", stdin); int k = 1; while(cin>>a[k]) k++; f[1] = a[1]; ll cnt = 1; _for(i,2,k){ f[i] += 2*f[i - 1]; f[.
2021-07-16 10:36:58
128
原创 P1734 最大约数和 (dp,01背包,约数,筛法)
Sloution预处理 小于s的每个数的 约数和方案1: 复杂度 nnn \sqrt{n}nnvoid init(){ a[1] = 0; _for(i,2,s+1){ ll sum = 1; for (int j = 2; j <= i / j;j++){ if(j * (i/j) == i){ sum += j; if(j!=i/j) sum += i / j; } } a[i] = sum; } }方案2:筛法改.
2021-07-15 11:02:06
136
原创 P1802 5倍经验日(dp,01背包)
Sloution小于use的时候,f[j]+=lose; //直接写的话,这里可能会忘记大于等于use,f[j] = max(f[j] + los, f[j - us] + win);const int N = 1e6 + 10;ll f[N];int main(){ //freopen("in.txt", "r", stdin); int n,x; cin >> n>>x; _for(i,0,n){ int los, win, us; .
2021-07-15 10:08:43
71
原创 CF1304C Air Conditioner (思维)
Sloution一道简单的思维题贪心思想,在操作第一组数据的时候,要尽量让第二组数据也满足条件下面,研究两组数据把可能操作的范围表示出来,(区间)对于样例1初始0,第一个时间5,那么可操作氛围在[-5,5]又让它,满足【1,2】那么取交集 (最小边去 两区间的最大值 ,最大去最小 ,若l>r而无交集)·-------第一轮结束,发现循环struct Q{ ll t, l, h;}q[510];bool cmp(Q a,Q b){ return a.t < .
2021-07-14 11:49:28
128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人