自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tlyzxc的博客

我看到到处是阳光,快乐在城市上空飘扬

  • 博客(22)
  • 收藏
  • 关注

原创 2020 ICPC 南京站

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)E:EvilCoordinate\mathbf{E:Evil Coordinate}E:EvilCoordinate题目大意分析代码F:Fireworks\mathbf{F:Fireworks}F:Fireworks题目大意分析代码K:KCo−primePermutation\mathbf{K:K Co-prime Permutation}K:KCo−primePermutation题目大意分析代码L:Let′sPlayCurling\math

2021-02-26 15:17:28 1876

原创 CodeForces 1492E : Almost Fault-Tolerant Database 思维构造

传送门题目描述n个长度为 m的序列,让你构造一个序列使得这个序列和其他每个序列的相同位置不同数至多为2。分析我们用第一个作为模版,如果剩下的n - 1个都和第一个相差小于等于2,直接输出第一个即可如果最大相差4个,那么就枚举四个不同的位置,选两个,判断合法性如果最大相差3个,就枚举两个位置,判断合法性如果大于四个,无解代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#

2021-02-25 01:44:41 124

原创 CodeForces 1492C : Maximum width 思维

传送门题目描述找一个子序列和已知子序列相同,然后求子序列的最大宽度分析最大宽度肯定出现在上一个的最右边,下一个的最左边,所以只需要正反扫两遍,存一下位置即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) pr

2021-02-23 23:38:58 427

原创 CodeForces 1379C : Choosing flowers 二分

传送门题目描述你想买n朵花,商店提供了m种,第i种花,买第一支可以获得a[i]的价值,之后无论卖多少支,都是b[i]的价值,每种花都无限提供,问你能获得的最大价值是多少?分析挺水的一道题,就是细节挺多的首先,最多只有一朵花会被购买一次以上,这个应该比较好证明,然后我们去枚举被多次购买的花,如果a[j] > b[i],说明j朵花第一次也需要被购买,排个序二分查找一下范围即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#d

2021-02-23 06:08:37 145

原创 CodeForces 666A :Reberland Linguistics DP

传送门题目描述给一个单词,分为前缀和后缀两部分,前缀长度不得小于5,后缀长度只能2或3,请输出后缀的个数和所有的后缀,要求所有后缀均不重复。分析半夜睡不着,感谢猫猫送来的题,让我……更清醒了我们用f[i][j]表示第i位能否接上长度为j的后缀,如果f[i + 2][3] == 1,那么i ~ i + 2的字符串就可以作为后缀,然后如果长度相同的话判断一下后缀是否相同就可以了,最后用一个set去重排序即可代码#pragma GCC optimize(3)#include <bits/st

2021-02-23 01:58:38 135

原创 CodeForces 1385F :Removing Leaves 拓扑排序

传送门题目描述给定一棵树,现在定义一次操作为"选定拥有同样父亲的k个叶节点,并将这个叶节点一起删去"。请问,最多能够进行多少次操作。分析我们贪心的去想,如果有叶节点符合条件,是否存在不需要删除的情况,答案是不会,因为删除的叶子结点去其他节点并不会产生影响,所以所有符合条件的叶子结点都必须要删除所以我们只需要暴力的删除所有符合条件的叶子结点就可以了叶子结点的度数为1,所以我们可以采用拓扑排序的方法代码#pragma GCC optimize(3)#include <bits/stdc

2021-02-22 18:21:28 83

原创 CodeForces 1397E :Monster Invaders DP

传送门题目描述有两种不同类型的怪物和三种不同类型的枪,一个拥有1点生命的普通怪物。一个拥有2点生命的boss。这三种枪是:手枪,对一个怪物造成1点生命伤害,时间r1激光枪,对当前等级的所有怪物(包括老板)造成1点伤害,时间r2AWP,立即杀死任何怪物,时间r3这些枪最初是不装子弹的,Ziota一次只能装1把枪。游戏的等级可以被认为是一个数组a1,a2,…,an,其中第i阶段有ai普通怪物和1个boss。由于游戏的性质,Ziota不能在杀死所有ai正常怪物之前使用手枪(第一种枪)或AWP(

2021-02-20 17:00:24 111

原创 CodeForces 1409E : Two Platforms 二分

传送门题目描述有两块长k的板子,可以在任意整数座标水平放置,问最多有多少小球的投影在板子上分析最后的答案应该只和x坐标有关,和y无关,应该是计算投影我们可以去把x坐标从小到大进行排序,然后枚举一个坐标,可以通过二分计算出他另一个点的位置,如果另一端在x1处,那么另一个位置的起点在何处最优呢,显然x1 + 1 ,x1 + 2 ,x1 + 3… 等都是可以的,所以我们可以预处理出来一个max数组,一块板的位置通过枚举,另一块直接预处理出来代码#pragma GCC optimize(3)#inc

2021-02-20 14:57:11 91

原创 CodeForces 1409F : Subsequences of Length Two DP

传送门题目描述给定长度为n的串S和长度为2的串T,和一个整数k,一次操作你可以将S串中任意一个字符修改为其他字符,最多进行k次操作,问最后S串中最多有多少个子序列T。分析我们分类讨论一下第i位字符修改,不修改的情况,令f[i][j][l]表示前i个字母中修改j次,包含有l个op[0]的情况下,答案总数,然后进行状态转移即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<

2021-02-20 01:39:36 132

原创 CodeForces 1486E : Paired Payment 最短路

传送门题目描述无向图,但是一次至少走两步,权值为两个边边权和的平方。求1到其他每个点的最短距离。分析挺麻烦的一个题首先数据范围里面给了边权不超过50,所以我们可以开一个二维数组d[i][j]表示到某个点的时候,如果他是中间走的那个点,第一条边权为j,那么到i的上一个点的最短路的大小,然后用堆优化的Dijkstra维护一下就好了代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<&lt

2021-02-19 23:34:38 189

原创 CodeForces 1486D : Max Median 二分

传送门题目描述一个长度为n的序列,对于一个区间长度不小于k的子区间,中位数为这个区间排序后的第(k+1)/2个数字。现在求所有的长度不小于k的子区间,中位数的最大值是多少。分析一个区间内,我去枚举一个数x,如果大于等于x的个数比小于x的个数多,那么说明这个区间内的中位数大于等于x所以,我们可以去二分中位数,用前缀和维护区间内大于等于x和小于x的数量,然后二分答案即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define

2021-02-19 22:11:42 204

原创 CodeForces 1490G :Old Floppy Drive 二分

传送门题目描述圆盘上有 n 个数,起初指针在第一个位置,m 次询问,每次询问回答指针至少移动多少次使得指针所经过的所有数的和 >= x(指针不可反向)分析我们假设,最后退出的位置为x,那么x一定在这一圈前缀和最大处或者最大处之前,那么我们减去一圈前缀和最大值,剩下的部分就只能用一整圈的和来弥补,除以一整圈的和,向上取整,最后二分前缀和最大值即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x)

2021-02-19 21:26:32 124

原创 Lost‘s revenge:ac自动机 + 状态压缩DP

分析朴素的思路应该比较容易想,我们去枚举跳到了哪一个位置,然后枚举ATGC出现的次数,然后枚举下一位出现的字母,进行状态转移即可,但是500 * 40 * 40 * 40 * 40的数组显然开不下,所以我们需要进行状态压缩怎么去压缩呢,因为总长度不超过四十,所以我们可以按照每一个字母出现的次数进行压缩,出现次数转换成进制即可,空间为11 * 11 * 11 * 11代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define de

2021-02-18 15:32:51 82

原创 Censored! :ac自动机 + DP

分析如果字符串的长度大一点可以用矩阵快速幂来做,因为数据范围比较小,可以用DP来代替我们去枚举每一位在a自动机中的位置,再去枚举下一位的位置,判断是否打过标记,然后进行状态转移需要注意的是,如果输入字符是负数,需要增加一个偏移量最后需要再写一个大数最后吐槽一句,poj的编译器真老。。。代码#include <cstdio>#include <cstring>#include <queue>#include <map>#include &

2021-02-16 17:34:48 109

原创 Ring :ac自动机 + DP

分析比较裸的DP了,注意一下最后答案输出即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_WARNINGS#define pb

2021-02-14 15:56:44 100

原创 Wireless Password :ac自动机 + 状压DP

分析f[I][j]表示第i位位于j位置的时候所对应的答案,然后枚举第i位的情况,判断会跳到哪里,如果该点打过标记,continue代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);

2021-02-11 23:07:38 82

原创 DNA repair :ac自动机 + DP

分析f[I][j]表示第i位位于j位置的时候所对应的答案,然后枚举第i位的情况,判断会跳到哪里,如果该点打过标记,continue代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);

2021-02-10 17:26:00 71

原创 考研路茫茫——单词情结 :ac自动机 + 矩阵快速幂

分析跟上面一题的思路差不多,加一个容斥就好了我们需要求有目标串的数量,可以计算出不含目标串的数量,然后用总数量去减即可因为需要对2^64取模,可以直接用ull然后再用矩阵快速幂求出等比矩阵的和即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n"

2021-02-10 01:40:31 130

原创 DNA Sequence:ac自动机 + 矩阵快速幂

分析我们去建一个ac自动机,把每一个病毒序列的结尾都打上标记,然后遍历所有的序列,如果这个节点没有打上标记,就遍历他的字节点,如果子节点也没有打上标记,就说明这两个节点之间是可以发生转移的我们用一个矩阵去储存任意两个点之间的转移关系,然后根据离散数学的知识可以得到把这个矩阵n次方之后就是任意两个节点之间转移n次之后的结果,用矩阵快速幂然后计数就可以了代码#pragma GCC optimize(3)#include <iostream>#include <cstdio>

2021-02-09 22:27:42 120

原创 CodeForces 1480D2 :Painting the Array II贪心

传送门分析我们去记录每一个数字出现下一个相同数字的位置,然后取维护两个结尾,如果两个结尾中有任意一个等于当前扫到的位置,就把当前数字丢进去,如果都不等,就看两个结尾的下一个相同数字出现的时间谁最早,然后把当前这一位放到另一个里面去代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x)

2021-02-09 00:02:32 142

原创 CodeForces 319B :Psychos in a Line 单调栈

传送门题目描述有编号为1~N的N个人站成一排(顺序是乱的),每人手中拿着一把枪。每一个时刻,每个人同时瞄准右边的人(如果存在的话),然后如果这个人编号比自己大,则开枪将他打死。因此,一个人可能在开枪的同时被打死。一轮开枪结束后,死亡的人视为离开了队列。那么经过多少时刻才能使得整个序列进入稳定模式—— 即不再有人死亡呢?分析f[I]表示以第i个人为起点需要多少次才能游戏结束,然后倒序维护一个单调栈即可代码#pragma GCC optimize(3)#include <bits/stdc

2021-02-06 20:31:00 99

原创 牛客寒假集训:点一成零 并查集

传送门分析提前预处理出来每一个联通块,然后去维护并查集即可最后的答案是联通块数量的阶乘乘以每一个联通块的数量代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define

2021-02-02 15:03:09 105

空空如也

空空如也

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

TA关注的人

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