![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技巧与思想---思维
小松萘
厉害的人可真多啊
展开
-
Codeforces Round #675 (Div. 2) C - Bargain (推导)
给你一串字符串,从里面删1~n长度的子串之后,剩下的可能得数字的和。比如107,删1,0,7,10,07,107之后剩07,17,10,7,1,0(空串)枚举每个字符串,考虑这一位留下来对答案的总贡献该位的贡献可分为:删除的区间在该位之前的贡献和删除的区间在该位之后的贡献#define int llconst int mod=1e9+7;int f[MX];void init(int n){ f[0]=0,f[1]=1; ll tag=10; for(int i=2原创 2020-10-05 15:09:05 · 640 阅读 · 3 评论 -
算法复习 - AcWing 基础算法
95. 费解的开关(位运算,枚举,递推)翻转格子(1) 同一个地方翻两次没用(2) 翻转顺序无关紧要(3) 第一排翻转情况确定了之后, 第二排的也确定了(因为此时第一排只能第二排改变), 随之第三排可以由第二排确定(4) 所以枚举第一排的翻转情况检查char s[7][7];int add[7][7];void uppdate(int i,int j){ add[i][j]++; add[i+1][j]++; add[i][j+1]++; add[i-1][j]++; add[i原创 2020-10-02 17:33:41 · 146 阅读 · 0 评论 -
Codeforces Round #673 (Div. 2) D - Make Them Equal (构造)
题意思路这种一般都是把值全都加到一个特殊索引上然后再分1 这个索引是特殊索引(1) 操作没有改变数组和sum,如果sum%n就是-1(2) 第一轮把ai变成i的倍数,再-x*i把除a1之外的数字清空,全加到a1上(3) 第二轮把a1均分到每个位置上int a[MX];void solve(){ int n;cin>>n; int sum=0; rpp(i,n) { cin>>a[i]; sum+=a[i]; } if(sum%n) cout&原创 2020-10-02 12:00:40 · 123 阅读 · 0 评论 -
Codeforces Round #673 (Div. 2) k-Amazing Numbers (逆向思维)
题意给你一个数组,对于一个数k,求在该数组所有大小为k的子数组中都出现的最小数字,k从1~n思路看到ai 数据范围1~n,考虑对于每个数字,计算他能满足最小的k为多少,然后做一个最小前缀和。能满足的最小k就是该数字相互之间距离的最大值,记得加上开头0和结尾n+1。代码int a[MX],mx[MX];//相互之间的距离最大值void solve(){ int n;cin>>n; map<int,int>mp; rpp(i,n) mp[i]=0,mx[i]=1;原创 2020-10-02 10:43:27 · 165 阅读 · 0 评论 -
Codeforces Round #672 (Div. 2) C2 - Pokémon Army (hard version)(贪心,维护变化值)
x数组里选一个子数组y(原数组顺序),y1-y2+y3-y4+… 的最大值然后还有q次交换操作,每次修改之后都要输出新的最大值(1)如果没有修改,单纯对于当前数组考虑,我们最后选出来的点肯定是波峰波谷这样子,然后最后一个点一定是波峰,并且最后选出来的一定是奇数个(2)那么最后的答案就是max(0 , a[i] - a[i+1] ) 求和,记得让a[n+1]为0方便统计最后一个波峰 (这里真的妙)(3)这样的话,对于每个操作,维护一下他的变化就行(4)不关流会T#define int lli原创 2020-10-01 22:11:00 · 105 阅读 · 0 评论 -
Codeforces Round #672 (Div. 2) D. Rescue Nibel! (组合数,方案数,优先队列)
从一堆区间里选k个有公共区间的(l,r),有几种选法(1) 按照左端点排序 //线段集合常用操作(2) 枚举每个线段,看当前线段作为k个线段中最右侧的那个的话能有几种方案数,即对于每个线段,枚举他之前的线段中,右端点>=该线段左端点的有多少,如果大于k-1个就组合数,这里统计前面线段的个数用STL随便搞了搞#define int ll const int MOD = 998244353;ll fac[MX];void init(){ fac[0] = 1; for (ll i原创 2020-10-01 17:20:12 · 120 阅读 · 0 评论 -
Educational Codeforces Round 95 (Rated for Div. 2) A. Buying Torches(思维)
题目大意就是开局一根小木棍,然后你可以与商人做生意,用一根木棍换X根木棍也可以用Y根木棍换1块煤,做一个火把需要一个木棍和一块煤,现在需要做K个火把,问总共最少要和好心的商人做多少次交易(MC?)。很简单的,首先必须要拿到K个煤块,所以必须进行K次交换煤的交易(开局手上是没有煤块的)。然后我们需要从商人那交易到足够做火把和交易煤块用的木棍,即k + k * y - 1个木棍(开局自带一个,所以减1),看看总共要交易多少次。void solve(){ ll x,y,k;cin>>x&原创 2020-09-19 22:30:09 · 139 阅读 · 0 评论 -
算法复习 - AcWing快速排序
107. 超快速排序???? ???? ????//题目描述的就是冒泡排序//冒泡排序交换次数为逆序对数//逆序对数又可以通过归并排序求解#define int llint b[MX];int n,a[MX],ans;void merge(int l,int r){ if(l==r) return; int mid = (l+r)>>1; int id=l,id2=mid+1; for(int i=l;i<=r;++i) b[i]=a[i]原创 2020-09-16 20:09:56 · 111 阅读 · 0 评论 -
Codeforces Round #670 (Div. 2) D. Three Sequences (差分,好题)
代码:咕咕原创 2020-09-15 14:07:24 · 83 阅读 · 0 评论 -
Codeforces Round #670 (Div. 2) C - Link Cut Centroids (重心性质)
树的重心最多有两个,且相邻(妙啊)//如果有两个重心,砍掉一个重心的子树,加到另一个重心//否则随便输出一个边int n;vector<int>mp[MX];int mx[MX];//某点去掉后的最大子树int son[MX];//某点为根的子树大小void dfs(int x,int fx){ son[x] = 1,mx[x] = 1; for(auto v:mp[x]) { if(v==fx) continue; dfs原创 2020-09-14 16:45:45 · 137 阅读 · 0 评论 -
Codeforces1405 D. Tree Tag(博弈,树直径,树变链)
题意两个人开始在一个树上,初始位置为a,b,每个人最多走da,db远。问你A能不能追上B题解不管当前是A走,还是B走,他们走到哪,都只会在树上的一条链上移动,所以我们可以只考虑一条链上的情况,A赢有以下几种情况:(1)AB一开始得距离小于da,A直接一步追上B(2)da>=直径的一半,那么只要A站到树的直径中心,可以去树的任意一个地方(3)B被A堵在边边角角的情况当da*2+1>db 时,A胜vector<int>mp[MX];int maxx,dp1[MX],原创 2020-09-12 01:01:36 · 182 阅读 · 0 评论 -
算法复习 - AcWing位运算
快速幂说白了就是对幂数分为二进制后,tmp代表当前位权值(比如21 ,22…)然后如果遇到当前位有贡献(b二进制下该位为1)就加上当前权值void solve(){ ll a,b,p; cin>>a>>b>>p; ll ans = 1,tmp = a; while(b) { if(b&1) ans = ans*tmp%p; tmp = tmp* tmp %p; b>&原创 2020-09-06 12:20:47 · 165 阅读 · 0 评论 -
Codeforces Round #667 (Div. 3) E - Two Platforms (前缀后缀后缀(套娃)
两块板不好考虑考虑一块板,然后用前缀后缀推到两块板int x[MX];int suf[MX],pre[MX];//末端放在第i个,最多接多少//前端放在第i个,最多接多少int mx[MX];//pre的后缀最大void solve(){ int n,k,tmp;cin>>n>>k; rpp(i,n) { cin>>x[i]; suf[i] = pre[i] = mx[i] = 0; }原创 2020-09-05 20:33:28 · 189 阅读 · 0 评论 -
Codeforces Round #666 (Div. 2) D - Stoned Game (博弈,思维)
关键在于,不能选择上一个人选择的堆。考虑有一个特别大的堆mx,他大于所有其他堆的总和,那么先手只要一直拿这个堆就行如果上述条件不成立,那么双方博弈过程中肯定都想拿最大的那个堆,比赛过程是确定的,直接奇数偶数。。。void solve(){ int n;cin>>n; int sum=0,mx = 0; rpp(i,n) { int x;cin>>x; sum+=x; mx=max(mx,x)原创 2020-09-04 11:35:03 · 179 阅读 · 0 评论 -
Codeforces Round #666 (Div. 2) C - Multiples of Length (思维,构造)
这道题首先我们可以把这个数组中的每一个元素都变成n的倍数,然后一起消除就可以了然后我们选择n - 1这个点,把前n - 1个数字都加上(n - 1)* a[i],这样每一位数字都变成了n * a[i],也就是a[i] 的n倍,最后的a[n]因为长度为1,所以也加上(n - 1)* a[n],最后整体减去n * a[i]即可注意两点n == 1的时候需要特判n * a[I]可能会爆int,需要用1ll * 来处理#define int llint a[MX];void solve(){原创 2020-09-04 11:13:39 · 97 阅读 · 0 评论 -
Educational Codeforces Round 94 (Rated for Div. 2) D. Zigzags(枚举,前缀后缀)
枚举四个会超,所以枚举第二个和第三个,第一个和第四个用前缀后缀算#define int ll//枚举第三个和第二个//用前缀找int a[3333];int pre[3333],suf[3333];void solve(){ int n;cin>>n; rpp(i,n) cin>>a[i]; pre[a[1]]++,pre[a[2]]++; for(int i=n;i>3;--i) suf[a[i]]++; int ans=原创 2020-08-28 20:08:12 · 116 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree(DFS,贪心)
???? ???? ????题意:给一个树,一些质因子p,因子乘积为k,要求给每个边一个权值,最后两两点之间的路径和最大,且边权为1的最少,且边权乘积为k,输出最大的两两之间路径和。关键在于计算每条边经过了几次,把经过次数最多的安排大的因子。设size为以该点为根的子树大小//对于不是根节点的点,他到父亲节点的那一条边贡献次数//size[x]*(size[fa] - size[x])所以做一个DFS算size数组即可,还有就是如果边数大于因子树,补1,如果边数小于因子数,把最大的因子合并原创 2020-08-28 15:32:35 · 98 阅读 · 0 评论 -
Codeforces Round #653 (Div. 3) B ~ E1题解
目录B. Multiply by 2, divide by 6题意思路代码C - Move BracketsD - Zero Remainder Array题意思路代码E1 - Reading Books (easy version)题意思路代码B. Multiply by 2, divide by 6题意给你一个数字n,操作有两种n*=2n/=6(只有当n整除6的时候才可以进行此操作)问你最少多少次操作,可以把n变为1,如果不可能输出n思路从质因子分解角度分析:操作一:增加质因子2原创 2020-06-29 00:58:44 · 216 阅读 · 0 评论 -
CodeForces - 1367E Necklace Assembly(循环串)
????♀️ ????♀️ ????♀️题意:从一个长为n的字符串上上选择部分字符(可重新排列)构成一个新字符串,要求新字符串转k次后可以与自己重合。能得到的最长的新字符串为多少转k次可以重合 → 原字符串可以分为k个相同的组转 i 次可以 重合的字符串 → 转 n*i 次也能重合所以枚举k 的因子作为一组的长度,然后枚举有多少组即可void solve(){ int n,k;cin>>n>>k; string s;cin>>s;原创 2020-06-27 15:13:10 · 175 阅读 · 0 评论 -
CodeForces - 1368D AND, OR and square sum(二进制,贪心)
????♀️ ????♀️ ????♀️题意:n大小数组,每次操作可以选择数组中两个元素X,Y,使X = X & Y,Y = X|Y,问你任意次数操作之后数组全部元素的平方的和最大为多少可以看出每次操作是将X中有,Y中没有的bit位给了Y,X中保留着他们都有的bit位,所以我们贪心的让所有bit位尽量在一起即可#define int llvoid solve(){ int n;cin>>n; vi bit(33,0); rpp(_,n) {原创 2020-06-27 09:27:49 · 167 阅读 · 0 评论 -
CodeForces - 1368B Codeforces Subsequences(思维)
???? ???? ????题意:输出一个字符串,其至少要有k个codeforces子序列codeforces共计10个字符,最后输出的字符串肯定是其部分字符重复多次的结果,子序列数目计算方法如下ccoodeforces :221111…所以直接乱模(啊,复健好难 T T#define int llvoid solve(){ int n;cin>>n; char ans[] = "codeforces"; vi add(10,1); int sum原创 2020-06-27 08:37:44 · 408 阅读 · 0 评论 -
CodeForces - 1350E Orac and Game of Life (BFS,思维)
???? ???? ????题意每轮翻转的时候,如果一个格子周围有格子与他相同则翻转,t次查询,问你第p次翻转时x,y位置颜色分析一个格子会变化:其四周有与其相同颜色的格子。然后他们一起变化。下一轮他们还是一样,还会一起变化。而对于其周围与它不同颜色的格子。再它颜色变化后,会变得与它颜色相同。也就是说,下一轮会他们会一起变化。所以只要有一对相邻相同的格子,就会至多通过2000次传染,使得所有格子都变得每轮颜色取反。代码int n, m, t;char a[1111][1111];ll b原创 2020-05-26 14:39:10 · 134 阅读 · 0 评论 -
CodeForces - 1350D Orac and Medians (构造)
???? ???? ????题意每次可选择一段区间,使该段区间等于区间中位数,该操作可进行任意次,问你有没有可能使整段区间等于k分析(1)n =1 时,需满足a = k;(2)n = 2时,需满足两数之中有一个为k且另一个大于等于k;(3)n > 2时,如果存在子区间满足(2),则该区间也满足(4)考虑如何构造出一个满足(2)的区间,对于长度>2的区间,只要存在长为3的子区间满足有两个>=k且整段区间存在k,则该区间可构造出(2),因为我们每次从长为3的该段区间开始,使该段区原创 2020-05-26 10:31:46 · 162 阅读 · 0 评论 -
CodeForces - 1350C Orac and LCM (GCD性质)
???? ???? ????题意:给定一个长度为nn的数组,求gcd{lcm(ai,aj)|i<j}性质:两个整数的最大公因子和最小公倍数中存在分配律:gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))*由此推得gcd1=gcd(lcm(a1,a2)、lcm(a1,a3)、…lcm(a1,an)) = lcm(a1,gcd(a2,a3,…an))gcd2=原创 2020-05-26 09:48:08 · 323 阅读 · 0 评论 -
求区间第k大
int a[MX];void insert(int a[],int l,int r){ for(int i=l+1,j;i<=r;++i) { if(a[i]>a[i-1]) continue; int tmp=a[i]; for(j=i;j>l&&a[j-1]>tmp;--j) a[j]=a[j-1]; a[j]=tmp; }}int divide(int a[],int原创 2020-05-12 21:04:03 · 141 阅读 · 0 评论 -
AtCoder - 4888 Lunlun Number (预处理,BFS)
???? ???? ????题面:求第k个满足:每个相邻位之间相差不超过一的数字从1~9开始BFSvector<ll>ans;ll q[(int)1e7];void pre(){ int l=1,r=0; rpp(i,9) q[++r]=i; while(l<=r) { ll x=q[l++]; if(x>1e11)...原创 2020-04-18 14:46:55 · 242 阅读 · 0 评论 -
CodeForces - 738D Sea Battle (贪心)
(1)计算所有可能放一个船的位置的末端(2)假设把a-1个船放在我们记录的位置集合的后a-1位置,那么必定有一个船出现在余下的位置里,输出即可string s;vector<int>ans;signed main(){ int n,a,b,k;cin>>n>>a>>b>>k; cin>>s; ...原创 2020-04-18 13:52:06 · 128 阅读 · 0 评论 -
CodeForces - 1333F Kate and imperfection (贪心,GCD)
???? ???? ????题意:1到n 的Ii 值定义为:从该数组中选择i个数字,两两之间求gcd的最大值,让这个最大值最小。因为求的是两个数gcd的最小的最大值,所以我们先尽可能的拿素数,素数拿完以后,再拿一个数,必然有至少一对不互质,所以我们要尽量使答案变小,即小的先拿,最后就可以得到从小到大输出的结论。int mx[MAXN];signed main(){ int n;cin>&g...原创 2020-04-14 11:31:08 · 244 阅读 · 0 评论 -
CodeForces - 1080C Masha and two friends(矩形重叠)
两个矩形有重叠:max(x1,x3)<=min(x2,x4)&&max(y1,y3)<=min(y2,y4)(x1y1x3y3为左下角,x2y2x4y4为右上角)#define int llint get_w(int x1,int y1,int x2,int y2)//白色数目{ if((x1+y1)%2==0)//左下角是白色 ret...原创 2020-04-13 09:53:01 · 93 阅读 · 0 评论 -
CodeForces - 1081D Maximum Distance (最小生成树)
???? ???? ????题意有些晦涩难懂。。。(1)给出一张图,存在自环和重边,但是最终有贡献的边是两点之间的最短路(就是一张图的最小生成树)(2)对于每个特殊点,求他到其他特殊点的路径上最长的一条边对答案可能有贡献的边一定两边都有特殊点(从树上来看),这样我们找到所有这样的边,然后找到其中最大的就是答案,因为对于每个特殊点,我们总是可以取到改边另一侧的特殊点从而达到这个答案int f[MX];in...原创 2020-04-12 20:14:51 · 251 阅读 · 0 评论 -
CodeForces - 1082D Maximum Diameter Graph (构造,模拟,链)
???? ???? ????给出n个点的度数上限,求能构造出的直径最长的图(1)把所有度数大于等于2 的拿出来构造一条链(2)剩下的度数为1的点挨个往链上放(3)无法构造的情况就是度数全部为1(此时要排除n=1的情况),或者存在点没地安排TT,CF网站崩了,不知道代码对不对,先放着int n;int nxt[1111];//保存链的信息int du[1111];//某点的剩余度数vector<...原创 2020-04-11 17:07:50 · 143 阅读 · 0 评论 -
CodeForces - 1084E The Fair Nut and Strings (前缀,字典树)
???????? ???????? ????????看到前缀要第一时间想到字典树。给定两个由 ′a′, ′b′ 组成的字符串 a, b,以及两个整数 n 和 k,n表示字符串 a,b 的长度, 要求你最多 选 k 个 字符串 ti 满足 a<=ti<=b(字典序), 并且使得这些字符串的前缀的数量最大。其实就是给你一个有左右边界且叶子数量必须小于等于 k 个的字典树,最多能有多少个节点,我们枚举每一层能作为答...原创 2020-04-11 14:16:32 · 193 阅读 · 0 评论 -
CodeForces - 1084C The Fair Nut and String (方案数)
????♀️ ????♀️ ????♀️就是把每段a(用b分开)分别计算该段哪一个a加答案(或者不加),最后减去一个都没选的const int mod=1e9+7;string s;vi ans;signed main(){ cin>>s; int sum=0; rep(i,sz(s)) { if(s[i]=='b') ...原创 2020-04-10 11:45:36 · 124 阅读 · 0 评论 -
POJ - 2965 The Pilots Brothers' refrigerator (思维)
(1)翻转两次和不翻转是一个效果(2)要翻转某个格子且不对其他格子产生影响,将该格子所在行列全部翻转一次即可(3)累加之后按照奇偶计算答案int ans[11][11];signed main(){ string s[11]; rep(i,4) cin>>s[i]; rep(i,4) rep(j,4) { if(s[i][j]...原创 2020-04-10 11:05:04 · 59 阅读 · 0 评论 -
CodeForces - 1330D Dreamoon Likes Sequences(方案数,位运算)
二进制下每个位只能有一个数字在该位是1,同时由于数组长度不定,所以我们枚举每个位上是哪个数字做贡献(该位与上一位之间有 min(2i+1 -1,d) - 2i +1个数字 ),或者该位不做贡献(min(2i+1 -1,d) - 2i +2),最后减去全部不做贡献的一个方案感觉这道题思路比较格式化,,,记一下#define int llinline void solve(){ int...原创 2020-04-05 13:35:08 · 105 阅读 · 0 评论 -
CodeForces - 1330C Dreamoon Likes Coloring(松弛操作,模拟)
???? ???? ????题意:1~n的墙,第 i 次刷漆是 i 颜色, 要刷 ai 长度,每次刷漆可以覆盖以前的,要求刷满墙,每次刷漆都不能抄过n,且每种颜色在墙上都有。(1)先把每个颜色占1~m的每个地方判断会不会越界(2)然后从后往前每次把前面的颜色放到后面,直到前后重合为止int ans[MX],a[MX];inline int solve(){ int n,m;cin>>...原创 2020-04-05 12:51:11 · 158 阅读 · 0 评论 -
CodeForces - 1330B Dreamoon Likes Permutations (STL,全排列)
???? ???? ????题意:把一个序列从中间切开,分成两个全排列,问你这两个全排列可能的大小利用好set的性质即可int a[MX];inline void solve(){ int n;cin>>n; set<int>s1,s2; map<int,int>mp; rpp(i,n) { cin>>...原创 2020-04-05 11:22:52 · 190 阅读 · 1 评论 -
CodeForces - 1087C Connect Three (构造)
题意:给你三个点的坐标,让你用尽可能少的方块,让这三个点连起来。xy维分开考虑,使这三个点x有序,在最中间的点画一条竖线(保证y维能连接),然后第一个点,第二个点向这条竖线画两个横线。vector<pii> ans;signed main(){ int ax,ay,bx,by,cx,cy; cin>>ax>>ay>>bx&g...原创 2020-03-30 23:07:36 · 160 阅读 · 0 评论 -
CodeForces - 1087D Minimum Diameter Tree (结论题,树的直径,构造)
???? ???? ????贪心的分配,一定是平均地把s分配到每个连接叶子结点的边。int du[MX];signed main(){ int n,s;cin>>n>>s; rpp(i,n-1) { int x,y;cin>>x>>y; ++du[x],++du[y]; } int num...原创 2020-03-30 21:14:54 · 177 阅读 · 0 评论 -
CodeForces - 1089G Guest Student (枚举)
注意k<=a[ 7 ] 的时候:int a[MX];inline void solve(){ int k;cin>>k; rpp(i,7) cin>>a[i]; rpp(i,7) a[i]+=a[i-1]; if(k<=a[7]) { int ans=7; for(int i=1;...原创 2020-03-30 10:58:33 · 370 阅读 · 0 评论