南昌理工学院ACM集训队
文章平均质量分 63
02PHC
这个作者很懒,什么都没留下…
展开
-
线性基
线性基是什么?一个原序列能求出至少一组线性基线性基是一个集合第一,原序列中的任意一个数都可以通过线性基中的一些数异或得到第二,线性基中的个数是一定的(取决于原序列,下面会讲)它不会重复即线性基中的某些数异或的值不会存在线性基中,或者说线性基中的一些数异或起来不会等于0线性基又有什么作用呢?为什么要求线性基?用于减少时间复杂度线性基的长度大约为log(n)(n为原序列的长度)原序列和它的线性基在异或操作这个层面上是等价的所以用线性基来代替它的原序列来处理就可以了线性基怎么求?d数组代表原创 2021-01-20 16:59:07 · 238 阅读 · 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 · 91 阅读 · 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 · 98 阅读 · 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 · 486 阅读 · 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 · 103 阅读 · 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 · 316 阅读 · 0 评论 -
矩形个数问题(单调栈)
题目传送门首先我们了解一下什么是单调栈(不过神犇们都应该会了)1.定义单调栈是一种可以以 O(n) 的时间复杂度解决类似求数组中某个位置i往左(或往右)第一个比i这个位置大(或小)的数(或位置)的问题的算法。2.怎么做?首先定义一个栈(先进后出)栈中存的是目前还没有答案的数,易得栈中元素递减(不然与栈的定义不符),对于每一次要将元素压入栈,先将栈顶所有大于它的元素记录答案(就是要压入的元素)并弹出,因为我们要求左边第一个,所以以从右向左的顺序入栈(因为是先入栈再记录答案,所以要从元素从答案入栈)原创 2020-09-15 13:27:31 · 644 阅读 · 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 · 105 阅读 · 0 评论 -
拓扑排序(转载)
转载自:添加链接描述拓扑排序1、定义对一个有向无环图(Directed Acyclic Graph简称DAG) G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有转载 2020-08-22 09:34:17 · 155 阅读 · 0 评论 -
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 · 236 阅读 · 1 评论 -
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 · 731 阅读 · 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 · 169 阅读 · 3 评论