
题解
文章平均质量分 54
02PHC
这个作者很懒,什么都没留下…
展开
-
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 · 338 阅读 · 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 · 265 阅读 · 0 评论 -
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 · 534 阅读 · 3 评论 -
区间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 · 184 阅读 · 0 评论 -
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 · 397 阅读 · 0 评论 -
基础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 · 151 阅读 · 0 评论 -
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 · 184 阅读 · 0 评论 -
概率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 · 692 阅读 · 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 · 773 阅读 · 1 评论 -
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 · 203 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 193 阅读 · 0 评论 -
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 · 346 阅读 · 0 评论 -
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 · 315 阅读 · 0 评论 -
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 · 441 阅读 · 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 · 980 阅读 · 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 · 229 阅读 · 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 · 1285 阅读 · 6 评论 -
线性基
线性基是什么?一个原序列能求出至少一组线性基线性基是一个集合第一,原序列中的任意一个数都可以通过线性基中的一些数异或得到第二,线性基中的个数是一定的(取决于原序列,下面会讲)它不会重复即线性基中的某些数异或的值不会存在线性基中,或者说线性基中的一些数异或起来不会等于0线性基又有什么作用呢?为什么要求线性基?用于减少时间复杂度线性基的长度大约为log(n)(n为原序列的长度)原序列和它的线性基在异或操作这个层面上是等价的所以用线性基来代替它的原序列来处理就可以了线性基怎么求?d数组代表原创 2021-01-20 16:59:07 · 288 阅读 · 0 评论 -
数位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 · 128 阅读 · 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 阅读 · 0 评论 -
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 · 579 阅读 · 0 评论 -
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 · 147 阅读 · 0 评论 -
寻找段落(单调队列)
题目转载的思路:直接二分找答案,复杂度(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 · 389 阅读 · 0 评论 -
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 · 842 阅读 · 0 评论 -
矩形个数问题(单调栈)
题目传送门首先我们了解一下什么是单调栈(不过神犇们都应该会了)1.定义单调栈是一种可以以 O(n) 的时间复杂度解决类似求数组中某个位置i往左(或往右)第一个比i这个位置大(或小)的数(或位置)的问题的算法。2.怎么做?首先定义一个栈(先进后出)栈中存的是目前还没有答案的数,易得栈中元素递减(不然与栈的定义不符),对于每一次要将元素压入栈,先将栈顶所有大于它的元素记录答案(就是要压入的元素)并弹出,因为我们要求左边第一个,所以以从右向左的顺序入栈(因为是先入栈再记录答案,所以要从元素从答案入栈)原创 2020-09-15 13:27:31 · 777 阅读 · 0 评论 -
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 · 143 阅读 · 0 评论 -
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 · 770 阅读 · 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 · 257 阅读 · 3 评论 -
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 · 332 阅读 · 1 评论