- 博客(149)
- 收藏
- 关注
原创 解决网页无法复制粘贴(生活小妙招)
事情缘由今天在写学习通的作业的时候,发现答案不能复制粘贴,这种有答案,而无法复制粘贴的痛,谁又能懂呢?每当我们复制题目和粘贴答案的时候,就会跳出一个窗口但是这种问题是难不倒一个学计算机的学生的。我们知道像这种复制粘贴的拦截都是通过JS脚本来实现的。所以我们第一个方法就是从根源来解决这个问题。方法一我们直接禁止网页的JS,这样整个网页的JS代码都没法运行了,这样也可以很轻松的解决问题了。禁止网页JS的步骤注意等写完题目的时候记得打开JS,否则你的网页会变得很莫名其妙,很多东西都无
2022-04-28 20:14:07 7902 1
原创 kuangbin专题每日一题 棋盘问题 POJ-1321
题意给你一个棋盘,棋盘上有两种点一种可以放棋子,一种不可以放棋子。多组读入,每次读入一个n,一个k,n是棋盘的规格,n*n的棋盘,然后k是要放的棋子数,然后还有一个n * n的字符串由.和 # 组成,# 是可以放棋子的,问有多少种放的方法,可以使每一个棋子都不同行和同列。思路我们可以枚举每一个点,然后从这个点开始DFS,然后每次都不同行,列的话就用一个数组来标记,就可以轻松解决了。代码#include<iostream>#include<algorithm>#incl
2021-09-07 09:17:06 286 2
原创 F1 - Nearest Beautiful Number (easy version)(预处理)
题意给你两个数n,k,让你找到大于等于n的最小的k-beautiful数。k-beautiful数就是数字的种类数小于等于k的数。n的范围是1<=n<=1e9.k的范围是1<=k<=2.举个例子 比如 177890 2,得到的最小的2-beautiful是181111.思路刚开始的时候k=1的时候很简单,就直接模拟就可以了,但是当k=2的时候,刚开始我也想直接模拟,可是发现总会少考虑情况,最后看了题解发现我们可以把所有的1-beautiful数和2-beautiful都
2021-09-06 20:46:17 300
原创 E - Polycarp and String Transformation(思维)
题意有一个字符串s,每次删除一个字母,把所有这个字母都删除,然后t=t+s,得到字符串t。现在给你字符串t,让你求出s串和删除的顺序。思路首先第一点,我从后往前看这个t,可以找到删除的顺序,删除的顺序就是字母出现的顺序的逆序。然后我的想法就是枚举字符串t的前缀,这个前缀有可能就是字符串s,就以此枚举,因为知道了删除顺序,看看根据这个前缀能不能构造出t,但是这样的时间复杂度是有些爆炸的。我就开始想一些优化。首先想到的第一个优化就是我们可以先根据字符串t的前缀求t的时候,我们可以先看一下最后构造出
2021-09-06 18:37:25 213
原创 D. Make a Power of Two(DIV3)(预处理+模拟)
题意T组数据,每组数据一个正整数k,k<=1e9,我们可以对k进行两种操作,第一种操作是删除k中的一位数,第二种操作是在k的末尾加上一位数,问用最少多少次操作可以使k成为2的次幂。思路2的次幂一共有60多个,我们只需要全部预处理出来,然后直接一个一个对比就可以了。那一天晚上不知道为啥人傻了,感觉预处理出来以后不能写。。代码#include <bits/stdc++.h>#define ll long long#define fi first#define se secon
2021-09-06 13:14:11 192
原创 后缀数组(学习心得)
后缀数组后缀数组是一种处理字符串的利器,很多字符串的问题都可以通过后缀数组来实现。后缀数组说简单一点就是对一个字符串的所有后缀子串进行排序。我来举个例子,比如字符串banana刚开始的时候它的后缀子串是anaanananaananabanana就是从主串的每个点i到结尾形成的这些子串。后缀数组就是把这些子串按字典序来排个序。aanaananabananananana具体的排序过程看起来非常痛苦,其实我们并不需要掌握是怎么排序的,我们只需要理解排序以后的数组就可以了,具体
2021-09-06 09:20:49 278
原创 hdu4300---Clairewd’s message(扩展KMP)
题意给你一个26个字母的转换表,把密文转换成明文的转换表.举个例子:比如转换表是qwertyuiopasdfghjklzxcvbnm对应的密文q的明文是a密文w的明文是b密文e的明文是e…刚开始的时候一直没搞明白这个转换表.然后再给你一个字符串,字符串是由密文+明文构成的,密文是完整的,明文是有可能缺失一部分的.前面的密文翻译过来以后就是后面的明文.第一个字符串是转换表,第二个字符串是密文+明文的字符串,我们的目标是找出密文和明文的分界线,然后补全后面的明文,(前面的完整的密文就是后面
2021-09-04 16:02:58 177
原创 扩展KMP模板
扩展KMP扩展KMP是一种解决字符串的数据结构,我们假设母串为S,长度为n,子串为T,长度为m,让我们求出所有S的后缀子串与T的最长公共前缀,也就是求出S(i,n)与T(1,m)的最长公共前缀,定义成一个数组就是extend[i]extend[i]extend[i]扩展KMP就是求这个extend[i].具体extend的求法就不具体写了,这里只写求extend的模板.模板用到的数组char T[N]; //子串char S[N]; //母串int next[N];//辅助数组nextin
2021-09-04 11:57:56 145
原创 AtCoder Beginner Contest 213 E - Stronger Takahashi(01bfs)
题意给你一个h∗wh*wh∗w的表格,由#和*组成,#是是障碍不可以走,高桥想从点(1,1)(1,1)(1,1)走到(h,w)(h,w)(h,w),高桥还有一个能力,如果前方有障碍的时候,可以选择一拳把前方2∗22*22∗2的区域打开,打开以后就可以走了,问高桥最少需要几次拳击才可以到达(n,n)(n,n)(n,n)思路一个裸的01-bfs。代码#include <bits/stdc++.h>#define ll long long#define ull unsigned long
2021-08-10 19:55:59 243
原创 FFT(板子)
FFTFFT其实就是求两个多项式的乘积的一个算法,里面具体的证明和思路我还不太懂,只是会用模板。多项式的存储struct Complex{ double x, y; Complex operator+ (const Complex& t) const //复数的运算 { return {x + t.x, y + t.y}; } Complex operator- (const Complex& t) const {
2021-08-08 18:32:13 256
原创 Minimum Sum(单调栈) AtCoder Grand Contest 005
题意给你一个由1~n的序列,a1,a2,a3.....ana_1,a_2,a_3.....a_na1,a2,a3.....an,每个数字都只出现一次,没有重复,让你求由这个序列所有子序列的最小值的和.思路我们求出每一个点影响的最大的左右区间,然后用一点点组合数的知识来写.求出每个点的左右区间用单调栈来实现.注意要开LL.代码#include <bits/stdc++.h>#define ll long long#define ull unsigned long lon
2021-08-08 13:58:22 183
原创 AtCoder Beginner Contest 212-D.Querying Multiset(逆向思维)
题意有三种操作。1.向队列中加一个数x。2.给队列中所有的数都加上x。3.输出队列中最小的数并且从队列中移除。思路我们知道第一种操作和第三种操作用优先队列很好实现,但是第二种操作如果暴力的话是会超时的,我们应该用逆向思维,题目中说的是把队列中的数都加上x,我们可以把后面没有加进来的数都减去x,我们记录一个sum,表示当前队列中的数加的数,当遇到1操作的时候,我们就对这个x-sum,如果遇到操作2,我们就对sum+x,这样就可以o(1)的处理了。代码#include <bits/stdc
2021-08-06 20:13:59 223 2
原创 多校第三场 Rise in Price(模拟)
题意给你一个n∗nn*nn∗n的网格,每个点都有一个ai,bia_i,b_iai,bi,让你求从(1,1)(1,1)(1,1)走到(n,n)(n,n)(n,n)的最优路径,使得∑aij×∑bij∑ a _{ij} × ∑ b _{ij}∑aij×∑bij。思路刚开始我第一时间想到的是用DP转移,但是因为有a,b两个元素,没法转移,而且如果DP的话时间复杂度是o(n2)o(n^2)o(n2)才1e4,时间还绰绰有余,所以我们可以对每个点都存下来一些状态,然后进行转移,我们可以对每个点存100个状
2021-08-06 17:25:27 125
原创 杭州多校第二场-I love exam(背包DP)
题意有n个科目,m个秘籍,每个秘籍可以提升一门课程的分数,和需要学习的天数,在允许挂科P门的情况下可以得到的最多的分数。思路我们先对每一门课程进行背包,求出j天以后能达到的最多的分数。f[i][j]f[i][j]f[i][j]第i门课程,学习了j天能得到的最大分数。dp[i][j][k]dp[i][j][k]dp[i][j][k]在前i门课程下,用了j天,挂了k门课能得到的最大分数。用这两个背包就可以求出最大的分数了。需要注意的是,记得首先把两个数组都初始化为负无穷。代码#include
2021-07-23 21:20:18 363 3
原创 2021杭州多校6955-xor sum(字典树+异或前缀和)
题意给你n个数,由正整数组成,再给你一个k,让你找出区间最小的异或和大于等于k,如果有多个,就输出区间左端点最小的那个,如果没有就输出-1思路首先我们肯定想到用异或前缀和,然后剩下的事情就是枚举一个右端点,然后求另一个满足条件的最小的左端点,但是当时不知道怎么用字典树处理,后来看了题解才知道,我们可以对字典树的每一个节点都存下一个下标的最大值,然后就让字典树用右端点和k的值来找区间最小的大于等于k的值。代码#include <bits/stdc++.h>#define ll long
2021-07-22 10:26:11 246
原创 2021杭州多校第一场KD-Graph(思维+并查集)
题意给你n个点,m条无向带权边,让你把这些点分成k组,分组有一定的要求:如果顶点p和q (p≠q)在同一组中,则p和q之间必须至少有一条路径满足这条路径的最大值小于或等于D。如果顶点p和q (p≠q)在不同的组中,则p和q之间不可能有任何路径满足这条路径的最大值小于或等于D思路我们可以对边进行从小到大的排序,然后让前n-k+1个点组成一个组,剩下的k-1个点组成k-1个组,就对排好序的边进行以此枚举,如果两个点不在同一个集合中就让这两个点并到一起,如果两个点已经在一起了就跳过,直到已经选够了集合。
2021-07-21 13:57:05 175
原创 牛客小白月初赛38-J科学幻想(线段树维护字符串哈希+二分)
题意定义一种关系,如果两个字符串只有一个位置字母不同,也算相等。给你一个字符串,长度为n,有k次操作,第一种操作是改变字符串中的一个字母,第二个操作是查询两个区间是否相等。思路我们知道如果没有修改操作,只有查询操作,我们可以用字符串hash+二分来解决问题,因为只有一个字母不相等的时候才算相等,我们可以通过判断[l1,mid1],[l2,mid2][l1,mid1],[l2,mid2][l1,mid1],[l2,mid2]是否相等,如果相等就说明不同的字母在右区间,就让mid=l+1mid=l+1m
2021-07-20 11:12:12 193
原创 字符串hash
字符串hash以前从来没有真正意义的用到过,所以就一直没有了解过,今天突然遇到一个小东西,但是不知道怎么解决。小问题是这样的:给你一个字符串,给你两个区间,让你判断两个区间内的值是否相等。我当时看到这个直接想的就是直接比较呀。但是看了字符串是1e61e61e6的,有1e51e51e5次查询,如果直接进行比较的话时间复杂度是会超时的。我们肯定需要o(1)的时间来比较两个字符串是否相等,这就需要用到字符串hash了。模板用到的数据const int base=131;//此处p取131 ull
2021-07-19 11:00:52 105
原创 小白月初赛36-D哥三好(DP)
题意思路我们刚开始看到a,b,c的钱数都是小于等于1e4,不管是时间还是空间都没办法处理,但是我们发现请客的钱数只会是300,450,750,他们的最大公约数是150,也就是说他们都是150的倍数,我们可以直接除去150,这样的时间复杂度就可以直接三维DP来转移了。时间复杂度是o(a/150∗b/150∗c/150a/150*b/150*c/150a/150∗b/150∗c/150)dp[i][j][k]dp[i][j][k]dp[i][j][k]表示第一个人有i块钱,第二个人j块钱,第三个人有k块
2021-07-19 10:02:42 141
原创 牛客小白月初赛-卷王之王(优先队列or线段树)
题意给你一个数组,有n个数a[i]a[i]a[i],有m个操作,每次读入一个x,对数组a中小于等于x的数进行加x操作,问m次操作后输出数组元素。0<=x<=1e90<=x<=1e90<=x<=1e9a[i]<=1e9a[i]<=1e9a[i]<=1e9思路我们算一下最多每个数会进行多少次加操作。假如一个元素为1。第一个我们让它加1,变成2。第二次我们让它加2,变成4。第三次我们让它加4,变成8。第四次我们让它加8,变成16。我们发现
2021-07-17 19:54:36 163 1
原创 小白月初赛-杨辉三角形(数论)
题意思路代码#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 99824353;ll qmi(ll a,ll b){ ll ans = 1; while (b) { if (b & 1) ans = ans * a % mod; b >>= 1; a = a * a % mod;
2021-07-17 10:40:28 86
原创 并查集(板子)
并查集初始化 int p[N]; //存储每个点的祖宗节点 for (int i = 1; i <= n; i ++ ) p[i] = i;find函数// 返回x的祖宗节点int find(int x){ if (p[x] != x) p[x] = find(p[x]); return p[x];}合并两个集合 //合并a和b所在的两个集合: p[find(a)] = find(b);...
2021-07-16 16:57:44 232
原创 序列自动机(板子)
序列自动机序列自动机:nex[i][j]nex[i][j]nex[i][j]数组,j的范围为(0~25)即对应26个英文字母。表示原串s的第i位后面那26个字母j出现的最早的位置也就是next指向的是下一个j的坐标,这样的话把next的值带入下一个next[i][j]中的j,就可以一直向下找。nex[i][j]nex[i][j]nex[i][j]数组的初始化int nex[N][26];void init(){ memset(nex,-1,sizeof nex); for(in
2021-07-16 11:35:00 78
原创 C - Manhattan Subarrays(思维)
题意定义一种操作,d(p,q)=abs(xp−xq)+abs(yp−yq).d(p,q)=abs(x_p-x_q)+abs(y_p-y_q).d(p,q)=abs(xp−xq)+abs(yp−yq).给你三个点,p,q,r如果d(p,r)=d(p,q)+d(q,r)d(p,r)=d(p,q)+d(q,r)d(p,r)=d(p,q)+d(q,r)那就说明这三个点是坏的。给你一个序列,每个点都是(bi,i)(b_i,i)(bi,i),让你判断有这个序列有多少好的子序列。长度为1和长度为2的都是好
2021-07-15 15:56:01 411
原创 7的意志 (数位DP)
题意定义一个序列a:7,77,777,7777…clearlove7需要从含有7的意志的数里获得力量,如果一个整数能被序列a中的任意一个数字整除,并且其数位之和为序列a中任意一个数字的倍数,那么这个数字就含有7的意志,现在给你一个范围[n,m],问这个范围里有多少个数字含有7的意志。数位DP裸体代码#include <bits/stdc++.h>#define ll long long#define fi first#define se second#define pb pus
2021-07-15 10:39:10 418
原创 数位DP模板+裸体
题意嘟嘟讨厌38和4,给你一个区间,让你找到区间中所有让人讨厌的数字。记忆化的数位DP代码#include <bits/stdc++.h>#define ll long long#define fi first#define se second#define pb push_back#define me memsetconst int N = 1e5+10;const int MOD = 1e9+7;const int INF = 0x3f3f3f3f;using na
2021-07-14 18:51:57 97
原创 牛客练习赛86 C-取钱
题意给你n种面值的钞票,一定有面值为1的钞票,有q次询问,每次换钱都采用贪心的策略,每次从大到小来给钱。q次询问,每次给一个bib_ibi,问你最多取bib_ibi的钱数下,能拿到的最多是多少张钞票。思路我们知道如果每次想取的钞票数量最多,那肯定是要从小到大的拿钱,就是先拿面值最小的,如果没法拿了再选第二种面值。我们通过找规律可以发现,在每两种面值的钞票之间都会出现一个最大值,我们就是要算出这个最大值,和取到这个最大值时的钱数。然后剩下的询问的时候,我们就通过二分来取最优的解。代码#in
2021-07-12 15:11:29 125 1
原创 st表维护区间最大公约数(板子)
st表维护区间最大公约数int a[N],Log[N],f[N][30];int n,gc;void Getlog()//log预处理{ Log[0]=-1; for(int i=1;i<=2*n;i++) Log[i]=Log[i>>1]+1;}void RMQ()//st表预处理{ for(int j=1;j<=Log[2*n];j++) for(int i=1;i+(1<<j)-1<=2*n
2021-07-11 19:46:19 333
原创 Codeforces Round #731 (Div. 3)
A. Shortest Path with Obstacle题意给你三个点,ax,ay,bx,by,fx,fya_x,a_y,b_x,b_y,f_x,f_yax,ay,bx,by,fx,fy从a点到b点,f点是障碍物,问最少需要多少步。思路直接模拟就可以了。代码#include <bits/stdc++.h>#define ll long long#define fi first#define se second#define pb push_back#defi
2021-07-11 19:43:05 203 1
原创 牛客欢乐赛3 C题-背包
题意给你一个价值为V的背包,给你n个物品,每一个物品都有一个价值和体积,让你求背包装m个物品时,背包里面中位数最大的值。思路当m为奇数的时候,我们很容易发现,背包中的中位数最大值肯定出现在n个物品中,所以我们可以直接枚举每一个物品,然后来判断当前背包是否可以满足条件,我们可以对n个物品按价值排序,这样当我们枚举到一个物品i的时候,我们只需要选出i前面的m2\frac{m}{2}2m个物品的最小体积和i之后的m2\frac{m}{2}2m的物品体积最小值,然后判断是否能选i这个物品为中位数。当m为
2021-07-09 14:09:40 130
原创 Codeforces Round #627 (Div. 3)
B. Yet Another Palindrome Problem题意给你一个序列a,问你能不能找到一个大于等于3的子序列,使这个子序列是回文的。思路只要有三个相同的,就一定是YES,如果有两个相同的,就看这两个下标是否相邻,如果不相邻就YES,然后遍历数组来判断就可以了。代码#include <bits/stdc++.h>#define ll long long#define fi first#define se second#define pb push_back#de
2021-06-23 23:16:11 146
原创 D. Three Integers(暴力)
题意给你三个数a,b,c,你可以对任意一个数进行减一或者加一的操作,使a可以整除b,b可以整除c,问需要进行多少次操作,才能使得到的三个数满足条件,且用的操作数最小,并且给出求出之后的数。题意a的范围是1e4,我们第一层循环直接枚举a改变后的值,第二层循环直接枚举b改变后的值,第三层直接枚举c改变后的值,我们知道改变后的b必须是a的倍数,所以b的枚举只需要满足是第一个循环的倍数就行,第三层同理,这样的时间复杂度是o(1e7)左右,是足够找出结果的。代码#include <bits/stdc+
2021-06-18 18:56:26 400 1
原创 E. Correct Placement(思维)
题意给你n张纸片,每张纸片都有一个长和宽,对于每一张纸片i,我们都需要判断是否能找到另外一个纸片j,使纸片j可以放在纸片i上,切没有任何重合部分,如果存在就输出这个编号j,如果不存在就输出-1思路拿到这个题,我们很容易想到去排序一个长,或者宽,然后再从小到大遍历来判断是否可以找到编号j,但是因为可以改变长和宽的顺序,使这样排序以后找到的并不是完全正确的情况。看了题解以后才发现,我们其实可以把长和宽存一个结构体里面,然后再交换长和宽再存进去一遍,这样排序以后就可以把所有的情况都考虑到。代码#inc
2021-06-09 21:01:30 216 2
原创 D - Omkar and Medians(数据结构+思维)
题意给你一个数组b,问是否有一个数组a,使每一个bib_ibi,都是在a1,a2,a3,......a2∗i−1a_1,a_2,a_3,......a_{2*i-1}a1,a2,a3,......a2∗i−1的中位数。思路我们知道b1,b2b_1,b_2b1,b2很容易就可以用a构造出来,但是在b3b_3b3的时候,就不一定了,只有b3b_3b3在上一个中位数的小于第一个中位数的值到中位数,和上一个中位数到第一个大于中位数的区间内时,b3b_3b3才可能是这一轮的中位数,如果满足,
2021-06-07 21:55:49 286
原创 C. Unstable String(双指针)
题意给你一个字符串s,定义如果一个字符串任意两个位置符号都不同,且只有0,1组成的字符串是不稳定的。定义由0,1,?,组成的字符串,且?可以任意的转换成0和1,使字符串可以变成不稳定的字符串叫做美丽字符串。给一个字符串求有多少子字符串可以形成美丽的字符串。思路假如有一个区间[l,r],如果这个区间内的字符串是美丽的,那以r结尾的美丽子字符串的贡献就是r-l+1.我们每次让右指针向右遍历,如果当前区间是美丽字符串,那以r结尾的子符串产生的贡献就是r-l+1,如果遍历的过程中当前的字符串不是美丽字符
2021-06-05 16:32:01 409
原创 D - Shortest and Longest LIS(构造+贪心)
题意给你一个字符串,由‘<’’>'组成,让你根据这个字符串构造两个由1~n组成的序列,如果s[i]=‘>’,就说明ai>ai+1a_i>a_{i+1}ai>ai+1,根据这个特性构造两个序列,一个序列的LIS是最小的,一个序列的LIS是最大的。思路刚拿到这个题,我就想到了贪心着来构造这两个序列,如果求LIS最大,那我们就尽量从小到大的选择数字,而且需要满足字符串的要求,另一个相反,但是想了好久怎么写代码,而且写的过程中调了很久。#include <bit
2021-06-03 15:06:12 171 1
原创 C. Air Conditioner(区间交集)
题意给你n个客人和一个初始温度m,每个客人有一个到来的时间tit_iti,一个喜欢的最低温度lil_ili一个喜欢的最高温度hih_ihi,每个时刻都可以有三种操作,选择温度不变,升高温度,降低温度,问怎么调节温度,是否可以让所有人都有喜欢的温度。思路看到这个题,我第一眼想到的是维护一个变量m,维护当前的温度,然后每次选的时候都尽量选择最优的方式来调节温度,尽量保证所有人都满足,但是单独维护一个变量很难确定是否当前维护的是最优的。这个题只需要判断是否可以满足所有的客人就可以,也就是每个客人来的
2021-06-03 10:29:34 224 1
原创 C. Boboniu and Bit Operations(思维)
题意给你两个数组a,b,a数组有n个元素,b数组有m个元素。对于每个cic_ici,等于ai∣bja_i|b_jai∣bj(1<=j<=m),让你求c1∣c2∣c3....∣cnc_1|c_2|c_3....|c_nc1∣c2∣c3....∣cn的最小值。1<=n<=200,1<=m<=2001<=n<=200,1<=m<=2001<=n<=200,1<=m<=2000<=ai<=290&
2021-06-02 18:14:54 186 1
原创 牛客欢乐赛1 E题
题意思路首先我们拿到这个题肯定想到的是暴力,也就是每次给一个区间[L,R],我们就枚举区间L,R,然后看需要分多少个段,这样的事件复杂度肯定是会超时的。我们可以用二分+前缀和的方式枚举出每个点能取的最大右端点是什么,然后每次求[L,R]的时候就不用每个点都需要枚举,而是直接可以一个区间一个区间的去看。这样的话其实是可以被卡成和暴力时间复杂度一样的,假如每个区间都只有一个值的话,那我们每次枚举的区间也就每次是一个值,和第一种情况是一样的。倍增我们可以维护出一个st[I][j]表,这个数组的含义
2021-06-01 17:30:06 99
原创 牛客欢乐赛1 D题(动态规划)
题意思路我们看数据范围知道,每一种卡片最多有40张,也就是说这四种卡片的所有情况是40∗40∗40∗40.40*40*40*40.40∗40∗40∗40.,我们并不好判断每次应该选那个点,我们唯一能知道的就是会经过最后一个点,到达最后一个点一共有四种情况,分别是从n-4到n,n-3到n,n-2到n,n-1到n,这四种情况,这种题一般都是要用到动态规划,用局部最优最后推出全局最优。dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l]表示已经用了i张1卡片,j张2卡片
2021-06-01 17:18:13 114
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人