各种比赛刷题
文章平均质量分 74
补题,刷题ing.....
荼白777
这个作者很懒,什么都没留下…
展开
-
第十三届蓝桥杯省赛C++B部分题解
统计子矩阵传送门题面思路直接拿二维前缀和去暴力枚举是O(n4)O(n^4)O(n4)的,500肯定跑不过;假设当前我们已经固定了左右边界,只有上下是变化的情况,如下图;那么此时一个子矩形由于左右是固定的,那么相当于给定我们一个一维数组,求连续一段区间和小于等于k的区间数量;这个问题可以使用双指针O(n)O(n)O(n)来解决;那么枚举左右边界是O(n2)O(n^2)O(n2),双指针是O(n)O(n)O(n),那么时间复杂度就是O(n3)O(n^3)O(n3);Code#incl原创 2022-04-11 17:54:32 · 628 阅读 · 0 评论 -
Codeforces Round #779 (Div. 2) D(0-1Trie)
这里放的是Hard的题面,思路Easy和Hard都有前缀知识戳这D2. 388535 (Hard Version)题面Easy版本的不同在于L=0L=0L=0;思路首先考虑Easy版本的情况,那么原序列中必然存在一个000,那么操作以后这个数就是xxx;题目的数据肯定是有解的(因为没有让我们判断无解的情况),那么也就是说我们求出xxx以后,异或每个数得到的必然是序列[L,...,R][L,...,R][L,...,R]的某种排序;那么实际上我们只需要假设当前的数就是xxx,然后去找和它异原创 2022-04-02 20:04:47 · 220 阅读 · 0 评论 -
第45届ICPC昆明刷题
比赛传送门传送门G-Gift题面思路首先有一个坑,2021年的2月是没有29号滴;归纳一下题意,我们对于每个朋友可以有三种选择;不搭理他给他做蛋糕送他礼物不难发现,礼物与做蛋糕是可以独立开来的;我们首先考虑礼物;因为礼物数量很少(至多15),我们可以考虑暴力枚举(选或不选)来完成,花费时间为O(2M)O(2^{M})O(2M),当然也可以用DP来解决;接着假设只有做蛋糕,没有送礼物这一说;f(i,j)表示前i个人,做cake不超过j天得到的最大价值f(i,j)表示原创 2022-03-05 19:34:41 · 570 阅读 · 0 评论 -
The 15th Jilin Provincial Collegiate Programming Contest
传送门题面思路首先按照题目意思打了个暴力dfs;typedef long long ll;const int MOD = 998244853;int qpow(int x,int y){ ll base = x,ret = 1; while(y){ if(y&1){ ret *= base; ret %= MOD; } base *= base; base %= MOD; y >>= 1; } return ret;}#def原创 2022-03-04 13:31:17 · 485 阅读 · 0 评论 -
Codeforces Round #768 (Div. 2) A ~ E
C题及以后有详细的解释,AB略过;A思路不难想到,最大的放一边,最小的放另一边;Code#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;int a[N],b[N];void solve(){ i原创 2022-01-30 12:02:35 · 1176 阅读 · 0 评论 -
Codeforces Round #767 (Div. 2) C~F
C题面思路题目要求我们在满足字典序最大的同时有更多的数字;不难想到,mex(1,n)mex(1,n)mex(1,n)肯定能得到最大的mex;现在我们需要找到一个kkk,使得这个kkk尽可能小的同时满足mex(1,k)=mex(1,n)mex(1,k) = mex(1,n)mex(1,k)=mex(1,n);完成了这一步以后,只需要循环的执行[k+1,n][k+1,n][k+1,n]这一部分即可;基于这个思路,我们维护一个前缀、一个后缀;前缀不断增加,后缀不断减少,直到找到这个kkk为止;原创 2022-01-27 16:41:29 · 525 阅读 · 0 评论 -
Codeforces Round #759 (Div. 2) D、E
D题面思路首先要知道奇排列和偶排列的概念;对一个数列,如果总的逆序数为奇数,则此排列为奇排列,否则为偶排列;对于一次交换swap(i,j)来说,会改变排列的奇偶性,如下图;而题目要我们执行swap(i,j)与swap(j,k);也就是两次交换,因此排列的奇偶性不变;因此,对于排列来说,我们只需要计算逆序对是奇还是偶,偶数则为YES,奇数则是NO;因为这道题可能有重复的数字出现;比如[3,2,3,1][3,2,3,1][3,2,3,1],下面两种换法是等价的;我们可以设第一原创 2022-01-25 16:31:10 · 390 阅读 · 0 评论 -
Codeforces Round #766 (Div. 2)
A思路不难想到,答案只能为0,1,2…或者直接-1Code#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int N = 1e2 + 10;char G[N][N];void solve(){ int r,c,x,y; cin >> r >>原创 2022-01-21 17:22:30 · 376 阅读 · 0 评论 -
Codeforces Round #757 (Div. 2) C ~ D2
C、题面结论nnn个元素的子集的异或和=2n−1∗A=2^{n-1}*A=2n−1∗A其中AAA是所有元素按位或起来的结果思路题目保证每个位置上的元素都会被包含在内至少一次;按位考虑;如果某元素的某一位是111,我们把这个元素(记为xxx)抽出来;那么剩下的n−1n-1n−1个元素,子集有2n−12^{n-1}2n−1;子集中这一位要么是000,要么是111;如果是000的话,我们就选上xxx,那么就得111了;如果是111,那么我们不选xxx,那么还是111;因此如果某一位原创 2021-11-27 11:08:56 · 102 阅读 · 0 评论 -
2021CCPC桂林 GYM
GYM传送门D、Assumption is All You Need题面题意给定数组A、B,允许我们操作若干次使得这两个数组相等;一次操作只能交换逆序的两个元素;如果无法相等,那么输出-1;思路因为只能交换逆序的两个元素;那么小的元素iii,只会被在iii之前的大的元素jjj交换;也就是说,小的元素iii,只会往数组的左边移动;假设我们现在在移动第kkk小的元素(记为uuu),第111小到第k−1k-1k−1小都已经到位了,不能移动了;那么如果目标位置在uuu的后面,那么肯定原创 2021-11-20 16:06:46 · 880 阅读 · 0 评论 -
Codeforces Round #747 (Div. 2) E2 —— 树形DP + 状态机
E2题目思路这题很像皇宫看守这道题;因为我做过皇宫看守这道题,很自然就想到树形DP;我们定义f(i,j)f(i,j)f(i,j)表示以iii为根的子树,状态为jjj所拥有的方案数;当j=0j=0j=0表示当前节点的颜色为任意当j=1j=1j=1表示当前节点的颜色为黄、白;当j=2j=2j=2表示当前节点的颜色为绿、蓝;当j=3j=3j=3表示当前节点的颜色为红、橙;也就是互斥的颜色放在同一组中;我们设jjj为iii的子节点;f(i,0)∗=f(j,1)+f(j,2)f(i原创 2021-10-17 14:44:59 · 86 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3) A~E
前言其中A~C比较简单,就只放代码了;D1,D2,E会有个人理解F和G待补A#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;int a[10];void solve(){ for(int i=1;i<=3;++i) cin >>原创 2021-10-15 17:17:09 · 137 阅读 · 0 评论 -
CCPC网络赛重赛补题
题面题目思路我们将nunhehhehnunhehhehnunhehheh与a...a...a...分离;将nunhehhehnunhehhehnunhehheh看为匹配串,因为aaa的贡献可以直接用组合数学来求;设f(i,j)f(i,j)f(i,j)表示前iii个字符中出现了jjj位的匹配字符转移方程为f(i,j)=f(i−1,j)+f(i−1,j−1)f(i,j) = f(i-1,j) + f(i-1,j-1)f(i,j)=f(i−1,j)+f(i−1,j−1)也就是这一位的匹配字符我们原创 2021-10-11 19:31:06 · 151 阅读 · 0 评论 -
Codeforces Round #741 (Div. 2) Two Hundred Twenty One
题目Easy_Version思路很容易发现,我们将点iii去掉;对于[L,i−1][L,i-1][L,i−1]是没有影响的,而对于[i+1,R][i+1,R][i+1,R]是乘了个−1-1−1;我们设f(i)f(i)f(i)表示将点iii抹去后的区间和是多少;f(i)=s(i−1)−s(l−1)−s(r)+s(i),s是前缀和数组f(i)=s(i-1)-s(l-1)-s(r)+s(i),s是前缀和数组f(i)=s(i−1)−s(l−1)−s(r)+s(i),s是前缀和数组我们想让这个区原创 2021-10-04 16:26:17 · 76 阅读 · 0 评论 -
Codeforces Round #745 (Div. 2) C. Portal
提交情况优化一、优化二依次如下;朴素思路暴力枚举左上点和右下点,然后用前缀和来维护;比赛的时候写的比较乱,这份是TLE的;Code#include <iostream>#include <utility>#include <cstring>using namespace std;typedef long long ll;typedef pair<int,int> pii;const int MOD = 1e9+7;int原创 2021-10-01 23:47:42 · 197 阅读 · 0 评论 -
A.Busiest Computing Nodes
题目思路使用线段树单点修改,区间查询;参考了这篇博客的思路;但是不知道为什么我的代码跑的巨快,只用50+ms思路就是拿一个vector数组来存结束的时间;因为这个时间是比较大的,因此我们需要离散化处理一下;遍历每一个事件的时候;将时间1到event[i].arr1到event[i].arr1到event[i].arr内的vector数组中的计算机释放出来;查询的时候,先判断有无空闲节点;如果没有直接抛弃;否则先查询[idx,k][idx,k][idx,k],如果查不到空闲的;原创 2021-09-21 18:04:25 · 228 阅读 · 1 评论 -
E - Non-Decreasing Dilemma
题目要求两个操作将某点a[x]改成u,即单点修改求[L,R][L,R][L,R]的子数组个数分析这题没有涉及区间修改,因此我们不需要push_down;我们假设子数组的个数为sub很容易想到tr[p].sub = tr[lc].sub + tr[rc].sub那么除了这些还有别的吗?如果当前节点的左子树 可以一直不降到 右子树假设左子树右边的不降长度为tr[lc].rlen,右子树左边的不降长度为tr[rc].llen那么我们每次从左子树取长度为一接到右子树的不降长度上,根节点原创 2021-09-11 16:29:21 · 277 阅读 · 2 评论 -
Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A~D1
D1还没补A暴力即可#include <iostream>#include <algorithm>#include <unordered_map>#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace std;const int N = 1e3+10;int a[N],n,t;int _abs(int x){ return x原创 2021-08-25 16:33:28 · 83 阅读 · 0 评论 -
Codeforces Round #738 (Div. 2) A~D2
D2等待补,如果你是为了看D2,那不好意思233感觉这一次题目好像稍微容易一点,我都能4题0.0A#include <iostream>#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace std;const int N = 110;int a[N];int main(){ SIS; int t,n; cin >> t;原创 2021-08-16 21:28:51 · 66 阅读 · 0 评论 -
Codeforces Round #737 (Div. 2) A~C
A#include <iostream>#include <algorithm>using namespace std;const int N = 1e5+10;const double eps = 1e-6;int a[N];int main(){ int t; cin >> t; while(t--){ int n; cin >> n; long long s原创 2021-08-14 21:27:31 · 64 阅读 · 0 评论 -
An Easy Problem&&两序列相乘的第k大元素
An Easy Problem题目来源两种思路,一种是堆的,一种是二分;堆#include <iostream>#include <queue>#include <vector>#include <utility>using namespace std;typedef long long ll;typedef pair<ll,ll> pll;priority_queue<pll> pq;int ma原创 2021-07-23 18:21:35 · 150 阅读 · 1 评论 -
Codeforces Round #727 (Div. 2)
A给我感觉就是机组流水线的计算…显然,对于任意一个点来说;其贡献的不满意度在最理想的情况下是y/x,y是结束时间,x是间隔y/x,y是结束时间,x是间隔y/x,y是结束时间,x是间隔当n较小的情况下,假设n个点,那么ans=(n−1)+(n−2)+...+1ans=(n-1)+(n-2)+...+1ans=(n−1)+(n−2)+...+1,直接等差数列求和即可;当n较大的情况下,在前面一些点都是处理理想状态,每个点能贡献y/xy/xy/x;而后面的点因为没人继续参赛了,所以提供的贡献会不断下降原创 2021-06-22 21:58:40 · 142 阅读 · 0 评论 -
Fake Math Problem
先线性求出排列数的和S(i)=Ai0+Ai1+Ai1+...+AiiS(i)=A_i^0+A_i^1+A_i^1+...+A_i^iS(i)=Ai0+Ai1+Ai1+...+Aiifor(ll i=1;i<=1e5;++i){ s[i]=(s[i-1]*i+1)%MOD; }可以发现乘积部分用线段树来维护如图所示总体应该是O(nlogn)O(nlogn)O(nlogn)Code#include <iostream>#define l.原创 2021-06-21 13:20:02 · 193 阅读 · 0 评论 -
Codeforces Round #722 (Div. 2) A~E
比赛地址A#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace std;const int N = 1e2+10;int a[N];int main(){ SIS;原创 2021-05-29 16:07:23 · 157 阅读 · 1 评论 -
C. The Sports Festival
题目链接自己做能想到dp,但是并不知道怎么定义状态;看了dalao的题解 来补个题因为题目想要求一个最小的和;那么我们想一想最后一个状态;必然是倒数第二个状态+amax−amin倒数第二个状态+a_{max}-a_{min}倒数第二个状态+amax−amin因为如果amax−amina_{max} - a_{min}amax−amin提前出现了;那么必然多加不止一次的amax−amina_{max} - a_{min}amax−amin因此我们需要最后再加上这个差值;现在原创 2021-05-24 21:03:28 · 287 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3) F2. Guess the K-th Zero (Hard version)
如果我们继续按照简单版的思路也就是直接二分,那么次数会过多然后WA如下#include <iostream>using namespace std;int query(int l,int r){ cout << '?' << ' ' << l << ' ' << r << endl; int tmp; cin >> tmp; return tmp;}int main(){ int n,t原创 2021-05-17 22:56:23 · 85 阅读 · 0 评论 -
广东工业大学第十五届文远知行杯程序设计竞赛补题
地址E 捡贝壳因为数据只到1e5最大,所以我们可以对数据进行分组在这里插入代码片原创 2021-03-27 22:47:17 · 115 阅读 · 0 评论 -
Codeforces Round #698 (Div. 2)
链接比赛地址A#include <iostream>using namespace std;const int N = 1e2+10;int a[N];bool vis[N];int main(){ int t; cin >> t; while(t--){ int n; cin >> n; for(int i=1;i<=n;++i){ cin >> a[i]; vis[i]=0; } int c原创 2021-04-27 22:29:00 · 107 阅读 · 0 评论 -
Codeforces Round #717 (Div. 2)
B题题意给定一个序列,每次可以从中选相邻的两个数;使得这两个数合并成这两个数的异或结果;问最后这个序列能否合并成至少两个相等的数;思路枚举两个区间一个for,枚举三个区间两个for就够啦;所以 O(n^2)就可以跑完了;Code#include <iostream>#include <cstring>using namespace std;const int N = 2e3+10;int s[N];int main(){ int t;原创 2021-04-25 17:35:40 · 87 阅读 · 0 评论