自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 Educational Codeforces Round 134 (Rated for Div. 2) E. Prefix Function Queries(KMP优化)

KMP优化

2022-08-30 16:44:06 243 1

原创 NC21587:回文子序列计数(dp)

动态规划,牛客

2022-08-16 20:52:30 403

原创 CF:1214D.Treasure Island(有向图必经点)

有向图必经点

2022-06-28 22:00:45 306

原创 CF:1667B. Optimal Partition(dp好题:线段树优化dp)

题目链接题面:题面:题面:题意:题意:题意:给定一个长度为n的数组,将其分成若干个连续的子数组。求每个子数组的价值之和的最大值。每个子数组的价值:对于s(l,r)=al+al+1+...+ars(l,r)=a_l+a_{l+1}+...+a_rs(l,r)=al​+al+1​+...+ar​若s(l,r)>0,则价值为r−l+1若s(l,r)>0,则价值为r-l+1若s(l,r)>0,则价值为r−l+1若s(l,r)=0,则价值为0若s(l,r)=0,则价值为0若s(l,r

2022-05-21 18:36:04 394

转载 CF:E. Bored Bakry

题目链接题面题面题面题意题意题意给定一个长度为n的序列,找出最长的区间满足:al&al+1&...&ar>al⊕al+1⊕....⊕ara_l\&a_{l+1}\&...\&a_r>a_l\oplus a_{l+1}\oplus....\oplus a_ral​&al+1​&...&ar​>al​⊕al+1​⊕....⊕ar​题解该题解充分利用了异或的性质,比较好。#include <bits/s

2022-05-20 12:02:19 129

原创 CF:D. Toss a Coin to Your Graph...(二分+拓扑判环)

题目链接题意:题意:题意:给定一个有向图。nnn个点,mmm条有向边,和一个限制的kkk。第二行输入nnn个数字,代表每个点的点权a[i]a[i]a[i]。找出一条长度为kkk的路径,使得所有经过点的点权的最大值最小。题解:题解:题解:二分答案,记为mid。然后对于点权大于mid的点不去遍历。只遍历点权小于等于mid的点。并判断这个图是否存在链长大于等k的链,或者是存在环。如何只遍历小于等于mid的点呢:记录每条边,对于每次的mid,去建一个新的图。然后在这个图中跑。判环:用拓扑排序来判环。当从

2022-05-15 15:07:33 443

原创 CF:1445 D. Divide and Sum(思维+组合数学)

题意:的给个2*n长度的数组,将其划分为两个长度为n的数组分别给p和q,要求满足p为不上升序列,q为不下降序列。定义一个函数f(p,q)=∑i=1n∣xi−yi∣f(p,q)=\sum_{i=1}^{n}|x_i-y_i|f(p,q)=∑i=1n​∣xi​−yi​∣;计算所有fff的和,并对998244353 去模。**题解:是个结论题。所2n的数进行排序,得到一个新的序列,记为数组a。可以发现按照上面的顺序随意取n个数给p,然后剩下的数全给q,就构造出了这样的序列。然后就是求f的问题。这里

2022-05-09 11:50:15 365

原创 CF1446:Xor Tree(字典树好题)

题目链接#include <bits/stdc++.h>using namespace std;const int maxn=2e5+5;int a[maxn];int n,idx;int son[maxn*35][2];int f[maxn*35];void insert(int x){ int p=0; for(int i=31;i>=0;i--){ int t=(x>>i)&1; if(!s.

2022-05-08 22:13:01 201

原创 Codeforces Round #787 (Div. 3)E~G

E.并查集题意:给定字符串a,对a可以执行一下操作:选择一个在字符串中出现的字符,将所有出现在该字符串中的该字符向前翻转。例如:‘c’替换成’b’,‘a’替换成’z’给定一个最大操作数k。在操作次数不超过k的情况下把a的字典序变得最小。题解:从前往后遍历,对将字符i尽可能的减小,将每个字符最后变成的最终态用并查集进行维护。本人未使用并查集的模板,但用type数组维护的方式和并查集类似。#include <bits/stdc++.h>using namespace std;co

2022-05-06 11:31:51 581

原创 CF:1674 G. Remove Directed Edges

题目链接题意:给出有向无环图,删去若干条边,使得满足以下两个条件:(1)对于每一个结点,其出边比原来少,除非初始出边就为0;(2)对于每一个结点,其入边比原来少,除非初始入边就为0;操作后,选择一个点集S,S中的任意两个元素u,v都满足:u能到v或者v能到u。请得到最大的|S|题解:由于是个有向无环图。所以S中的点一定是从u能到v,而v到不了u。那么S集合一定是一条链上的所有点;发现了这个问题后就好写了,可以发现用dp做。状态表示:f[u]表示操作后以u为起点的最长链

2022-05-03 13:25:58 462

原创 CF:1626C. Monsters And Spells

题目链接题解:从后往前枚举,每个点所跨越的维度为p=k[i]-h[i]+1,即p为i点至少的起点。记录每个点的起点后。从n-1点往前遍历;假如遍历到i点,判断i+1的起点是否覆盖了k[i],若覆盖了,则i和i+1的起点为两者起点的最小值,后面同理。所以相当于维护一些连通块。用并查集维护。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=105;int n;

2022-05-02 21:15:06 174

原创 CF:1632C. Strange Test(思维)

题目链接两种情况:1.a一直加,加到一定程度与b或等于b2.b一直加,加到一定程度与a或等于b加的最长情况为两数之差。#include <bits/stdc++.h>using namespace std;int a,b;void solve(){ cin>>a>>b; int ans=b-a; for(int i=a;i<b;i++){ if((i|b)==b){ ans

2022-05-02 19:44:50 384 1

原创 CF:1633D. Make Them Equal(广搜+背包)

题目链接题意:有一个大小为n的整数数组a。最初,数组所有元素都为1.可以执行如下操作:选定一个i和任意的x(x>0)然后把ai=ai+[ai/x](向下取整)执行所有操作后,若ai==bi,那么你可以得到ci个金币。通过执行不超过k次的操作使得获得最大的金币数量。1->bi的最小操作数,用广搜得到。所以用广搜预处理1->1000的所有最小操作数,然后来一遍01背包即可。细节处理:由于k太大了,但是可以发现任意一个1->bi的操作数最多为20左右,所以最多操作数

2022-05-02 18:29:54 273

原创 CF:1659 Line Empire(思维+贪心)

题目链接由于国王的首都搬迁的过程,一定不会往回搬迁。所以枚举所有的搬迁的位置pos。然后0~pos是征服一个,搬迁一个,pos~n是只有征服。以此算出最小值。#include <bits/stdc++.h>using namespace std;const int maxn=2e5+5;typedef long long LL;int n,a,b;LL w[maxn],s[maxn];LL get_num(int i){ return w[i]*(a+b)+(s

2022-05-02 17:21:24 234

原创 CF533B Work Group(树形DP、)

题目链接状态表示:f[u][0/1],以u为根节点,有人数偶数(0表示)或奇数个(1表示)的最大权值这道题其实是状态只有两种的树上背包。但是第一次做这个题的时候。真的不会想到用树上背包来做,因为他又一个下属必须是偶数的限制条件在那里。就会感觉不能用背包。但没想到用初始化f[u][1]=负无穷,来防止了这种情况。这点就是这道题的精妙之处。通常状态下会将f[u][1]=a[u]初始化为该点的权值,f[u][0]=0初始化为空(即0);但是这样的话,之后转移的时候f[u][0]会从f[

2022-04-29 11:01:51 206

原创 CF847E Packmen(二分答案+贪心)

题目链接该题在DP的题单里,但却没有想出用DP的解法。题解里也基本都是二分的解法。但是大部分的题解的特判特别多,这边用了思路比较简单的贪心方法。贪心方式绝对没有问题,虽然本人没有证明出来,但理解后就会发现思路比较简单,代码短,且一定正确。1.首先对每个食物'*'找到它后面最近的人'P'所在的位置,若没有的话那么位置记为0.存在post数组中。2.二分答案,记为mid。主要是check如何判断。3.从前向后遍历,会有两种情况:1->如果先遇到食物'*',那么说明post.

2022-04-25 19:11:44 312

原创 CF855C Helga Hufflepuff‘s Cup(树形dp:用辅助数组来完成状态转移方程)

题目链接该题的状态表示挺好想的。就是f[i][j[k]表示以i为根的子树有k个最高值。其中j有三个状态:j=0时,表示i点的值为小于最高值j=1时,表示i点的值为等于最高值j=2时,表示i点的值为大于最高值初始状态下f[i][0][0]=k-1;f[i][1][1]=1;f[i][2][0]=m-k;(m表示有多少种颜色)但是在写状态转移的时候发现若正常的状态转移要有一些限制条件。比如:在u从v中转移过来是f[u][0][j]+=f[u][0][j-k]*(f[u][0.

2022-04-25 12:01:40 213

原创 CF82D Two out of Three(状态转移方程难表示)

题目链接洛谷:CF82D Two out of Three状态转移方程有点难想。看了题解才知道的。题解链接#include <bits/stdc++.h>using namespace std;typedef pair<int,int>PII;const int maxn=1050;int n;int a[maxn];int f[maxn][maxn];struct Node{ int d,v,x,y;};Node path[maxn][.

2022-04-25 09:47:00 186

原创 CF Global Round 20:F1. Array Shuffling(最少交换顺序)

题目链接:F1. Array Shuffling题面:input222 141 2 3 3output1 23 3 2 1题意:给定长度为n的数组a,求一个数组b。可以对b进行交换的操作变成a,记对数组b通过交换变成a的最小操作次数为x。要求构造一个数组b,使得b变为a的最小操作次数最大。此处有一个结论:排序算法-最少交换次数证明_玉曦的博客-CSDN博客_交换次数最少的排序算法结论就是:如果想要把a[i]->b[j],我们就建立一个条件i-&.

2022-04-24 13:46:59 2045

原创 TZOJ:2592 Trick or Treat on the Farm(tarjan求最大闭合路径)

题目链接:TZOJ:2592Trick or Treat on the Farm题面:样例输入:41323样例输出:1223该题的图和TZOJ:6024信息传递的图几乎一模一样;就是在信息传递的基础上加了个自环的情况。题中要求从每个点出发直至走到走过的点的时候的最大点数。可以发现每个点的出度一定是1,所以每个点一定会一直向外走直至走到环。由于对有向图进行tarjan缩点后一定会变成一个拓扑图。那么可发现由于每个点一定会向外延申直至到环,所以这

2022-04-03 11:57:57 214

原创 TZOJ:6024信息传递(tarjan求最小环(无环套环))

题目链接:TZOJ:6024信息传递题面:样例输入:52 4 2 3 1样例输出:3从题中可以分析出,每个点的出度有且仅有1。那么可以发现任意一个点向外只能伸出一个方向,最后若形成一个环的话。这个环内一定不存在更小的环了。即不存在环套环的情况。(见下图)像这样1->2->3->4->1是一个环,而2->3->2又是一个环,且在前面一个环的内部。不会存在这种环套环的情况。这样的话用tarjan缩点后求出的每个强连通..

2022-04-03 10:05:26 622

原创 牛客:NC25138子串查询(字符串专题)

链接:NC25138子串查询

2022-03-22 21:54:14 315

原创 TZOJ:7536 A Maze Game(双端队列--步数带限制的广搜)

题目链接:TZOJ:7536A Maze Game题面:样例输入1:4 53 21 2......***....***....样例输出1:10CF原题。双端队列板子题把。(没学双端的最好先学了)就是最短路的思想:把向左移和向右移都看成是权值为1的边,向上或向下移动权值为0.那么可以发现这个图的权值只有0或者1。可以用双端队列来做。如果向左或向右移,把点放到队列后边,向上或向下移动,把点放到队列前边。#include <bits/st

2022-03-15 12:23:29 399

原创 TZOJ:5899桃子的主席树(主席树+LCA+离散化)

题目链接:桃子的主席树题目:样例输入:8 5105 2 9 3 8 5 7 71 21 31 43 53 63 74 82 5 10 5 210 5 311 5 4110 8 2样例输出2891057没学过主席树的话,最好先去学一下主席树,这道题并不是板子题。板子题的话可以看AcWing中的第k小数此处链接:AcWing255.第K小数以样例为参照,描述该题的解题过程:若以1为根节点,那么树的形状就如上图。那.

2022-03-09 12:38:54 240

原创 ZOJ:4160:Fair Distribution(第18届浙江省省赛)--整数分块

题目链接ZOJ:4160:Fair Distribution题面:样例输入:33 1210 68 20样例输出 :042对整除分块的详解不赘述,可以看这篇博客,讲的很好:整出分块讲解中“[x/y]”表示x整除y该题中将式子做出转换。可以发现n只能减,而m只能加,那么假设n最终减到x,那么m要加到某个最近的能整除x的位置,该位置即为([(m-1)/x]+1)*x,那么最终步数为n-x+([(m-1)/x]+1)*x-m;将式子进行整理,便可得到答.

2022-03-04 11:13:58 375

原创 牛客NC13885:Music Problem(用bitset优化)

牛客NC13885:Music Problem题面:bitset<限定的长度> bit;bitset不用担心长度会爆,对于过长的数字,会自动截取限定的长度,所以初始的长度只要限定能用上的长度即可;那么对于bit|=bit<<x来讲相当于把之前各种的数都加一个x然后bit|=bit>>3600相当于把多余3600的那部分对3600进行取模,后再加到bit中;最后只要判断bit[3600]这个位置是否存在即可#include <bits

2022-02-03 22:37:24 742

原创 牛客:NC19158失衡天平(01背包的拔河问题)

该题有点像双塔DP,有待之后确认.牛客NC19158失衡天平题面:状态表示:f[i][j]:表示前i个物品中差值为j的最大重量.属性:Max状态计算:f[i][j]=max(f[i-1][j] , f[i][j+a[i]] + a[i] , f[i][abs(j-a[i])] + a[i]);三者的最大值初始化为负无穷因为初始状态f[i][j]的值不一定为0,而应该是一个不存在的值.所以应该是负无穷代码:#include <bits/stdc++.h>

2022-02-03 16:55:16 722 1

原创 TZOJ:2710过河(引入TZOJ:5996小凯的疑惑)

题目链接:TZOJ:2710过河TZOJ:5996小凯的疑惑y总的视频讲解:AcWing484过河(视频讲解)题面:动态规划:状态表示:f[x]表示到达第x位置所需踩到的最少石子数集合:最小值状态计算:可知对于每个x位置,都一定是前面的[S,T]的位置跳过来的.所以f[i]=min(f[i],f[j]+a[i])(i-T<=j<=i-S).但是这道题的L非常大.如果L<=10000的话,时间复杂度就可以过去.会发现,该题中M不大,也就是说如果

2022-02-02 15:11:15 647

原创 TZOJ 6721:levil的苹果树(树形dp)

题面样例输入:31 21 31 2 3样例输出:6题目中:采摘利益=两个苹果其中一个苹果的成熟值 * 两个苹果在苹果树上的距离;所以定义状态表示f[i]为以i为该苹果的成熟值时采摘利益最大的集合.那么如果求出了其余点距离i的最远距离lmax,那么f[i]=a[i]*lmax;所以该题就转换成了求树上每个点到其他点的最远距离.最后取个max就行了.这与AcWing1073树的中心写法几乎一样.然后讲一下二次扫描.用d1[i]和d2[i]数组分别记.

2022-01-30 18:19:34 353

原创 TZOJ: 5845:A^B的约数和(二分法求等比数列前n项和)

题面第一步:对A进行质因数分解,并将其存入map中map<LL,LL> maps;void get_prime(int n){ for(int i=2;i<=n;i++){ if(n%i==0){ int ans=0; while(n%i==0){ n=n/i; ans++; } maps[i

2022-01-29 15:51:20 648

原创 (第九届图灵杯K题金牌厨师)差分维护当前位置连续大于len的区间(二分+差分)

输入样例:5 53 51 22 52 54 5输出样例:3可以发现答案是满足用二分来快速寻找答案的.至于证明,这里不予以证明.关键的问题在于判断在二分中的答案判断其正确性.假设检验的答案是x.如果能找到至少x个区间的交集元素数量一定是大于等于x,那么x答案就是正确的.由于区间是连续的,所以交集的数也一定是连续的.那么问题就变为对于一个确定的区间,求出包含这个区间的普通区间数.用差分来维护这个数量.通过差分数组a来维护当前位置是否存在连续大于len的区..

2022-01-18 21:32:43 475

原创 (牛客每日一题)NC20241:扫雷MINE(计数DP)

题意:扫雷游戏。但面积只有n行2列,第二列给出了数字,代表周围(仅限第一列中)有几个雷。在第一列中填雷,使得第一列中雷的数量满足第二列对应的数字。求有多少种摆放雷的方案数。题解:用dp来做。f[i][2][2][2],i代表第i个位置,三个2分别表示,i位置前面,i位置,i位置后面是否有雷,有雷就是1,无雷就是0。初始化:初始化第零个位置,当第一个位置雷数量为0时f[0][0][0][0]=1;当第一个位置雷数量为1时f[0][0][0][0]=f[0][0][0][1]=1;

2021-11-19 12:41:25 3201

原创 Mio visits ACGN Exhibition——计数DP+滚动数组(江西省ICPC省赛)

计数DP题,求方案数。状态转移方程为:dp[i][j][k],表示第i行,第j列,恰好有k个0时的路径数量;可知0<=k<=i+j-1,因为最多走i+j-1个方格,所以对应的0的数量最多也就是i+j-1;如果数据不大的话,状态转移方程:dp[i][j][k],表示跑到第i行,第j列恰好有k个0时的路径数量当(i,j)==0时,dp[i][j][k]=dp[i-1][j][k-1]+dp[i][j-1][k-1]当(i,j)==1时,dp[i][j][k]=dp[i-1]

2021-11-17 18:18:19 183

原创 HDOJ:4738:Caocao‘s Bridges(割桥重边)

判边为祖先#include <bits/stdc++.h>using namespace std;const int maxn=1e3+5;const int inf=0x3f3f3f3f;int n,m,cnt,tot,res;int head[maxn],dfn[maxn],low[maxn];struct Edge{ int v,w,nxt;}edge[2000010];void add(int u,int v,int w){ edge[cnt].

2021-11-14 09:39:54 315

原创 (牛客每日一题)NC25256:张老师的游戏

必胜态:a1^a2^...^an=x≠0;必败态:a1^a2^...^an=0;必胜态转必败态:假设x的最高位为第k位。那么至少存在一个ai的第k位也为1;则ai^x<ai;所以从ai中取走x-ai^x个石子,那么剩下ai^x个石子;所以a1^a2^...^ai^x^...^an=x^x=0;那么必胜态就转为了必败态了#include <bits/stdc++.h>using namespace std;int main(){ int n; wh

2021-11-11 18:42:16 1754

原创 (牛客每日一题)[SHOI2008]小约翰的游戏JOHN(Anti-Nim)

这是一道裸Anti-Nim游戏先手必胜条件(满足下面两个其中一个就行):*每一块石子的数量都为1,且总SG值为0时*至少有一块石子的数量大于1,且总SG值不为0时#include <bits/stdc++.h>using namespace std;int a[100];int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int t;cin>>.

2021-11-11 17:04:40 2426

转载 博弈论进阶之Anti-SG游戏与SJ定理(转载)

转载:博弈论进阶之Anti-SG游戏与SJ定理 - 走看看本内容会涉及到Anti-Nim,Anti-SG与SG定理前言Anti-Nim游戏是这样的有两个顶尖聪明的人在玩游戏,游戏规则是这样的:有(n)堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿),拿走最后一个石子的人失败。问谁会胜利博弈分析Anti-Nim游戏与Nim游戏唯一的不同就是两人的胜利条件发生了改变,不过这并不影响我们对结论的推导对于这个游戏,先手必胜有两种情况当每堆石子都只有一个,且游戏的SG

2021-11-11 16:47:58 224

转载 博弈论进阶之SG函数(转载)

转载地址:博弈论进阶之SG函数 - 自为风月马前卒 - 博客园SG函数个人理解:SG函数是人们在研究博弈论的道路上迈出的重要一步,它把许多杂乱无章的博弈游戏通过某种规则结合在了一起,使得一类普遍的博弈问题得到了解决。从SG函数开始,我们不再是单纯的同过找规律等方法去解决博弈问题,而是需要学习一些博弈论中基本的定理,来找到他们的共同特点那么就先介绍几个最基本的定理(也可以叫常识)吧基本定理ICG游戏1.游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己最有利。2.当有

2021-11-11 16:45:16 142

原创 TZOJ:6624:取石子游戏2(集合-Nim游戏取石子方法)

首先这道题一看就是一道裸裸的集合-Nim游戏。关键在于必胜态的情况下面那两个数怎么输出了。我这里小提一下集合Nim游戏的解题方式:对每一堆石子求他的sg值,再把每一堆的sg值^起来就行。所以很明显对于sg(a1)^sg(a2)^...^sg(an)=res如果res≠0,说明就是必胜态,等于0说明是必败态。必胜态的时候,该怎么取石子呢?很明显,必胜态要必胜的情况下,必须是取完后把必胜态转为必败态。即(假如在ai堆中取了x个石子)sg(a1)^sg(a2)^...^sg

2021-11-11 12:57:14 2865

原创 TZOJ:3359: 石子游戏-B(给定取石子范围)

打表找规律,或者写几个sg答案来找规律。解博弈论的题目看数据范围。一般数据范围在1000以内可以用sg函数解决。若在10000以内sg函数不一定能解,时间复杂度不好说。10000以上,sg函数就很难说了,一用就超时。这时候就要暴力打表找规律。这道题数据范围达到int了,打个表找找规律。找到了x%(m+1)==0时就是Lost,否则就是Win。#include <iostream>using namespace std;int n,m;int sg(int x){

2021-11-10 20:49:35 455

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除