- 博客(38)
- 收藏
- 关注
原创 Codeforces Round #745 (Div. 2)C Portal
1.处理出f[i][j][k]f[i][j][k]f[i][j][k],表示第iii行从第jjj列到第kkk列里有多少个0002.容易想到O(n4)O(n^4)O(n4)的做法,枚举矩形的上边在第iii行的第jjj列到第kkk列,下边在第sss行但是题目最多只能O(n3)O(n^3)O(n3)3.考虑优化,将枚举上边和下边所在行的时间复杂度O(n2)O(n^2)O(n2)优化成O(n)O(n)O(n)假设枚举到了第iii行,mnmnmn表示前i−1i-1i−1行价值的最小值(但不包括第iii行的价值
2021-09-30 21:37:19
334
1
原创 HDU-6962 I love tree(树链剖分+线段树)
思路:如果是对区间[l,r][l,r][l,r]进行操作的话,对于x∈[l,r],w[x]+=(x−l+1)2x∈[l,r],w[x]+=(x-l+1)^2x∈[l,r],w[x]+=(x−l+1)2,令k=l−1k=l-1k=l−1,那么w[x]+=(x−k)2w[x]+=(x-k)^2w[x]+=(x−k)2,把括号拆开−>x2−2∗x∗k+k2->x^2-2*x*k+k^2−>x2−2∗x∗k+k2,那么就需要维护3个对于ttt次修改后的线段树∑i=1t1\sum_{i=1}^{
2021-07-26 08:49:05
263
原创 2021年HDU多校第二场第4题-6964 I love counting
思路:先用莫队统计每个块内的数的种类和每个数的种类再从高位到低位判断a,b,ca,b,ca,b,c之间的关系首先sss表示到 jjj 这一位满足aaa ^ s=bs=bs=b仅考虑第jjj位1)bbb的jjj这一位为1,a1,a1,a的jjj这一位为111那么只要c的j这一位为1,都能满足ccc ^ a<ba<ba<b2)bbb为1,a1,a1,a为000,那么只要ccc为000,都能满足ccc ^ a<ba<ba<b3)bbb为000,a为111ccc
2021-07-23 10:51:29
495
2
原创 2021年HDU多校第二场第11题-6971 I love max and multiply
maxa[i]maxa[i]maxa[i]表示maxmaxmax(a[j])(a[j])(a[j])(jjj&i=ii=ii=i)由于可能出现负数,所以还要处理最小值预处理出maxa,maxb,mina,minbmaxa,maxb,mina,minbmaxa,maxb,mina,minb#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using
2021-07-22 19:15:56
532
3
原创 矩阵(kuangbin专题十九)
HDU-5015题意:有一个矩阵横排第一行初始是0,233,2333,23333…,然后给出计算公式a[i][j] = a[i - 1][j] + a[i][j - 1],然后给出了n和m和第一列的各值要求计算a[n][m]的值。可以得出#include<iostream>#include<cmath>#include<algorithm>#include<cstring>using namespace std;typedef long
2021-07-14 09:05:07
156
原创 区间DP练习
POJ-2955题意:给定括号字符串,求最长合法子序列dp[i][j]dp[i][j]dp[i][j]表示以i为开头,长度为j的区间内的最长合法子序列dp[i][j]dp[i][j]dp[i][j]能由2种方式转移过来1)如果s[i]==s[i+j−1]s[i]==s[i+j-1]s[i]==s[i+j−1]dp[i][j]=max(dp[i][j],dp[i+1][j−1]+2)dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2)dp[i][j]=max(dp[i][j],
2021-07-12 16:37:25
178
原创 Codeforces Round #732 (Div. 2)D-AquaMoon and Chess
题意:给定01字符串,1表示这个位置有棋子,0表示这个位置为空,可以跳棋,就是1可以跨过一个1到0上,问最终状态有几个思路:首先能看出2个连续的1可以一直相互跳,那么可以让这些1都往前跳比如100110110010011011001001101100---->111110000011111000001111100000但是100110111010011011101001101110只能变成---->111110001011111000101111100010可以发现111110001
2021-07-12 00:36:49
393
原创 基础DP练习
HDU-1024题意:把一个数组分成不相交的恰好m段,求最大字段和dp[i][j]dp[i][j]dp[i][j]将前iii个数分成jjj段的最大值2种情况1)第i个数自成一组2)第i个数和第i-1个数在同一组dp[i][j]=max(dp[i−1][j],dp[k][j−1])+a[i](1<=k<=i−1)dp[i][j]=max(dp[i-1][j],dp[k][j-1])+a[i](1<=k<=i-1)dp[i][j]=max(dp[i−1][j],dp[k][j
2021-07-08 15:52:02
144
原创 Codeforces Round #730 (Div. 2)C. Need for Pink Slips
期望dp#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<cmath>using namespace std;const double eps = 1e-7;int t;double c, m, p, v;double dp(double c, double m, doub
2021-07-08 09:27:33
182
原创 概率DP练习
第一题题意等价于:由x个1,y个0组成的全排列01字符串某个位置与前一个位置不同的数量期望,第一个的前面一个数默认位1思路:先求出x和ydp[i][j][k]中表示第i个位置位j的,且前面i个数中有k个1的状态到达终点的期望值答案为dp[0][1][0]#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;typ
2021-07-06 10:22:55
228
2
原创 第十三届四川省赛 J - Ants
思路:1)2只蚂蚁碰面后视为穿过即可2)n只蚂蚁每走了2*L路程后回到原来位置,那么先算出要先走多少个周期,再模拟最后一步即可3)ql存往左走的蚂蚁的位置,qr存往右走的蚂蚁的位置#include <iostream>#include <cmath>#include <cstring>#include <cstdio>#include <queue>using namespace std;typedef long long l
2021-06-03 13:01:16
678
3
原创 第十三届四川省赛 I - Monster Hunter
题目链接总体思路:二分加贪心贪心思路:1)先把3用完先把3用在血量大于等于3且血量为奇数的怪物上,使其变成一个偶数且不浪费再把3用再血量大于等于6的怪物上(一次要用2个),保证这个怪物的血量还是偶数,且不浪费再把3用再血量最多的怪物上2)再把2用完把2用再血量大于等于2的怪物身上,保证不浪费再把2用再血量为1的怪物身上(只剩下1了)3)最后把1用完#include<iostream>#include<algorithm>#include<cstring
2021-06-01 21:54:18
725
1
原创 银川打铁记
早上9点到了,发现密码还没到,过了一会漂亮的志愿者送来密码,翻题过了好久看到有人过了A,队友马上翻译,WA了2发,后来我发现队友理解错题意了,我自己翻译,一小时完成签到心态爆炸。看到榜一大哥们已经过了3题了,队友开E,我开J。不久我开始敲,wa了,后来发现没毛病啊,一顿乱试去掉了末尾空格就过了(赛后说是选手的问题,不要空格你倒是在题目里说啊!),卒。我开K,看不懂题意,盲猜找最短能表示单词的前缀,敲了个主席树板子,不出意外WA了,回过头去看题目完全看不懂啊,队友交E交的心态爆炸,让我去写,我写完继续WA,一
2021-05-16 18:54:00
239
4
原创 Educational Codeforces Round 108 (Rated for Div. 2)D Maximum Sum of Products题解
以iii为中点先交换区间大小为3的再交换区间大小为5的再交换区间大小为7的以此类推这样是O(n)O(n)O(n)就能求出以iii为中点的所有翻转情况#include<cstring>#include<algorithm>#include<iostream>#include<vector>using namespace std;typedef long long ll;const int N=5e3+10;int n,a[N],b[N
2021-04-30 10:12:40
198
原创 Codeforces Round #717 (Div. 2) C. Baby Ehab Partitions Again
首先sumsumsum如果为奇数输出000,否则再判断能不能凑出sum/2sum/2sum/2。如果能,很关键的一点是,如果序列中存在一个奇数,那么删除这个奇数,剩下的sumsumsum为奇数,凑不出2个子序列,如果不存在奇数,那么让每个数除2,因为都是等比例缩小,不会影响。一直重复,直到找到一个奇数为止#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=110,M=N*2000;i
2021-04-22 09:05:38
202
原创 Codeforces Round #716 (Div. 2)C - Product 1 Modulo N
首先与n不互质的数是一定不选的,先用mul存下1~n-1中所有与n互质的数的积, gcd(mul,n)=1gcd(mul,n)=1gcd(mul,n)=1令p=mulp=mulp=mul modmodmod nnn,能得出gcd(p,n)=1gcd(p,n)=1gcd(p,n)=1,如果ppp恰好为1,那么直接输出。否则去掉ppp这个数,为什么这样就行了呢?mul=k∗n+pmul=k*n+pmul=k∗n+p ,mul/p=k/p∗n+1mul/p=k/p*n+1mul/p=k/p∗n+1,只要证
2021-04-20 12:23:43
137
2
原创 Codeforces Round #712 (Div. 2)ABC题解
A题,遍历每个位置,找到在这个位置对称的位置是否为’a’,如果不是那么把’a’插在这个位置#include<bits/stdc++.h>using namespace std;int t,n;int main(){ scanf("%d",&t); while(t--) { string s; cin>>s; n=s.size(); int p=-1; for(int i=0;i<n;i++) { if(s[n-1-i]!='
2021-04-04 09:27:51
188
原创 CodeCraft-21 and Codeforces Round #711 (Div. 2)ABC题解
A题,至少能找到个gcd=2gcd=2gcd=2的,只要222个都是偶数就行#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+10;int t;ll n;int main(){ scanf("%d",&t); while(t--) { scanf("%lld",&n); while(1) { ll x=n,res=0; whi
2021-03-30 12:55:59
345
原创 Codeforces Round #709 (Div. 2, based on Technocup 2021 Final Round)ABCD题解
A题 每个方格破一条边即可#include<bits/stdc++.h>using namespace std;int t,a,b;int main(){ cin>>t; while(t--) { cin>>a>>b; cout<<a*b<<'\n'; } return 0;}B题 对于一对a[i]<a[i+1]a[i]<a[i+1]a[i]<a[i+1],c=a[i+1]−a[i]+
2021-03-22 13:12:06
308
原创 线段树练习
题目一:FZU - 2297不可用求逆元的方法来求,因为a在(mod p)情况下的逆元存在的充要条件为a与p互质,由于要除的数在前面乘过,可以考虑线段树。把叶子节点(1~n)的值赋值为1,父亲节点的值为做儿子的值乘右儿子的值,乘时把这个i这个节点改为x,除时,把x这个节点改为1,根节点就是答案#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using na
2021-03-21 19:35:37
113
1
原创 Educational Codeforces Round 106 (Rated for Div. 2)ABCD题解
A题,按照题意判断一下就行了#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+10;int t,n,m,a[N],b[N];bool vis[N];int main(){ scanf("%d",&t); while(t--) { int k1,k2,w,b; scanf("%d%d%d%d%d",&n,&k1,&k2,&
2021-03-19 14:35:04
434
3
原创 Codeforces Round #708 (Div. 2)A,B,C1,C2,E1题解
A题 把从小到大排序再把重复的排到后面#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+10;int t,n,m,a[N],cnt[110];int main(){ scanf("%d",&t); while(t--) { memset(cnt,0,sizeof cnt); scanf("%d",&n); for(int i=1;i<
2021-03-18 08:02:29
967
2
原创 Codeforces Round #707 (Div. 2)A~C题解
A题,模拟#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e2+10;ll a[N],b[N],t[N];int main(){ int T; scanf("%d",&T); while(T--) { int n; ll tt=0; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld%l
2021-03-13 19:47:51
224
1
原创 Codeforces Round #706 (Div. 2)ABCD题解
A题找回文,中间部分可以不满足回文要求#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int t,n,k,a[N];char s[110];int main(){ scanf("%d",&t); while(t--) { scanf("%d%d%s",&n,&k,s+1); int x=0; for(int i=1;i<=n/2;i++) { if
2021-03-11 09:15:54
1284
6
原创 线性基
线性基是什么?一个原序列能求出至少一组线性基线性基是一个集合第一,原序列中的任意一个数都可以通过线性基中的一些数异或得到第二,线性基中的个数是一定的(取决于原序列,下面会讲)它不会重复即线性基中的某些数异或的值不会存在线性基中,或者说线性基中的一些数异或起来不会等于0线性基又有什么作用呢?为什么要求线性基?用于减少时间复杂度线性基的长度大约为log(n)(n为原序列的长度)原序列和它的线性基在异或操作这个层面上是等价的所以用线性基来代替它的原序列来处理就可以了线性基怎么求?d数组代表
2021-01-20 16:59:07
287
原创 数位dp
数位dp用来解决一个大范围内满足一些条件的算法常常伴随着记忆化搜索一起用dfs从最大的值开始往小搜索(这是重点)题目一代码中 f 的含义:比如一个范围是1~6325其中1~1000 和 1001 ~2000和2001 ~3000和 3001 ~4000和5001 ~6000中满足题意的个数是相同的(不需要多次算,算一个就可以了,碰到直接加),而4001 ~5000和6001 ~6325要单独算那么当千位为6时下一位(百位)的范围只能是0~3同理如果千位为6,百位为3时,下一位(十位)的范围只
2021-01-14 15:21:08
126
1
原创 C. k-Amazing Numbers
题目思路:枚举每个数所需最大距离,再更新这个距离下的最小数#include<bits/stdc++.h>using namespace std;typedef long long ll;inline ll read(){ ll s=0,w=1;char ch=getchar(); while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();} while(ch>=48&&ch<=5
2020-10-04 17:00:29
126
原创 P1496 火烧赤壁(离散化)
离散化就是把大数用小数表示,需要用到时再换回大数的操作,因为数据范围很大,直接用大数肯定会T的。这题的数据只存在大小关系,所以用C数组来存点(1,2,3,4,5,6…表示大小顺序)#include<bits/stdc++.h>using namespace std;typedef long long ll;int n,m;ll ans,c[40010];int a[20010],b[20010];bool f[40010];ll find(ll x){for(int i=1;i
2020-09-25 11:50:53
575
原创 P2882 [USACO07MAR]Face The Right Way(差分枚举)
题目思路:记F为1,B为0枚举k,遇到0就反转k个单位,但暴力复杂度为n^3会T用差分复杂度n^2#include<bits/stdc++.h>using namespace std;const int N=5010;int n,kk,m;bool a[N],B[N];char c;int main(){ m=N; cin>>n; for(int i=1;i<=n;i++) { cin>>c; if(c=='F')a[i]=1
2020-09-22 16:40:39
146
原创 寻找段落(单调队列)
题目转载的思路:直接二分找答案,复杂度(n *logn)我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正,如果有说明还有更大的平均值。用前缀和和单调队列维护。然后用单调队列求出sum[i]-min(sum[i-t]~sum[i-s]),然后判断是否大于大于0即可。核心代码:#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int head,tail,n,s,t,a[
2020-09-22 14:15:27
387
原创 STL大根堆小根堆
题目#include<bits/stdc++.h>using namespace std;#define mp make_pairtypedef pair<int,int>pill;priority_queue <pill,vector<pill>,less<pill> > Q;const int N=2e6+10;int n,k,a[N];int main(){ cin>>n>>k; for(int
2020-09-15 15:18:38
840
原创 矩形个数问题(单调栈)
题目传送门首先我们了解一下什么是单调栈(不过神犇们都应该会了)1.定义单调栈是一种可以以 O(n) 的时间复杂度解决类似求数组中某个位置i往左(或往右)第一个比i这个位置大(或小)的数(或位置)的问题的算法。2.怎么做?首先定义一个栈(先进后出)栈中存的是目前还没有答案的数,易得栈中元素递减(不然与栈的定义不符),对于每一次要将元素压入栈,先将栈顶所有大于它的元素记录答案(就是要压入的元素)并弹出,因为我们要求左边第一个,所以以从右向左的顺序入栈(因为是先入栈再记录答案,所以要从元素从答案入栈)
2020-09-15 13:27:31
766
原创 HDU6702 ^&^
题目传送门题目给你A,B,求使 (A xor C) & (B xor C)最小时C的值C可能有多个值输出最小的C思路:记ansi=(Ai⊕Ci)(Bi⊕Ci),⊕为异或运算,x⊕y=xy’+yx’,xx′=0,x*x=x.ansi=(AiCi′ +Ai′ Ci)(BiCi′ + Bi′ Ci )=AiCi′ BiCi′ +AiCi′ Bi′ Ci+Ai′ CiBiCi′ +Ai′ CiBi′ Ci化简后ansi==AiBiCi′ +Ai′ Bi′ Ci;当Ai=1且Bi=
2020-09-12 16:17:38
141
转载 拓扑排序(转载)
转载自:添加链接描述拓扑排序1、定义对一个有向无环图(Directed Acyclic Graph简称DAG) G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有
2020-08-22 09:34:17
200
原创 2020多校第八场
2020多校第八场(南昌理工ACM集训队)1003#include <bits/stdc++.h>using namespace std;#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);typedef long long ll;const int INF=0x3f3f3f3f;int main(){ int t; scanf("%d",&t); while(t--){
2020-08-15 14:43:32
768
1
原创 题记
记一些比较有意思的题第一题:2020多效第6场第一题题目链接#include<bits/stdc++.h>using namespace std;const int N=2e5+5;const int mod=1e9+7;typedef long long ll;inline ll read(){ ll s=0,w=1;char ch=getchar(); while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar(
2020-08-08 13:25:26
255
3
原创 状压DP(入门)
题目一链接题目意思就是:给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组。(n<=18)解题思路:用二进制枚举+dpg[i]表示状态为i时当前背包剩余的体积f[i]表示状态为i时所用最少的背包数代码如下:#include<bits/stdc++.h>using namespace std;const int N=20;const int M=1<<18+5;int n,m,a[N],f[M],g[M];int main
2020-08-01 15:00:01
298
1
原创 2020 年百度之星三
2020 年百度之星·程序设计大赛 - 初赛三1001:Problem Description学皇来到了一个餐馆吃饭。他觉得这家餐馆很好吃,于是就想办个会员。一共有 nn 种会员充值卡套餐,假设学皇这餐饭的消费为 aa 元,选择第 ii 种套餐,需要充值 b[i] * ab[i]∗a 的钱,这次吃饭可以打 c[i]\times 10c[i]×10 折,由充值的钱支付(即这次吃饭只需要从充值金额中扣除 a\times c[i]a×c[i] 元)。以后用剩余的充值的钱吃饭不再打折。请问学皇应该选择哪个
2020-07-27 10:09:19
331
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人