自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SuperBrother打鼹鼠

Vijos/ Vijos / 题库 /SuperBrother打鼹鼠这是一道二维树状数组的裸题目#include <bits/stdc++.h>using namespace std;int n,m;int c[1026][1026];int lowbit(int x){ return x&(-x);}void update(int x,int y,int z)//将(x,y)的值+z{ for(int i=x;i<=n;i+=lowbit(i))

2021-03-30 21:21:59 177

原创 校门外的树:持续打板子

校门外的树传送门又是一道树状数组经典题目分析:首先这道题,你有可能想到的是区间打标记,似乎跟树状数组扯不到一点关系。但我们需要建模。题目说在[l,r][l,r][l,r]这个区间里种植一棵树,那么可以这样理解:就是在l,rl,rl,r这两个点上打上一个标记。怎样体现是这个区间呢?我们就用一对(),当然你用0和1也行。打上标记后,我们来看:rrr左边(前边)的左括号((( 代表从开头到rrr的树种类数;lll左边的右括号))) 代表从开头到lll种了多少棵树。具体情况见下图:我们可以发现l

2021-03-28 16:40:23 130

原创 AtCoder 196 C,D

C - Doubled传送门题目意思很简单:就是问1-N中有多少个像12341234,1212,3434这样的折叠的数又是解释跟没解释似的N最大是10^12,其实我们直接暴力一半10610^6106就行了。将每一个数构造出它的折叠数,看是不是在1-N以内就行了。#include <bits/stdc++.h>using namespace std;typedef long long ll;ll rebuild(ll x){ ll num=1,y=x; while(y)

2021-03-28 11:53:10 165

原创 传纸条:看似很巧实则套路

P1006 [NOIP2008 提高组] 传纸条题目地址分析:此题可以用搜索但是判断两条路有没有重叠是有一点小麻烦的,本人直接切正解:DP我们排两个哨兵从左上走到右下,两条路去探索。这样的话,dp应该是四维的,分别记录两个点的坐标:f[x1][y1][x2][y2]f[x1][y1][x2][y2]f[x1][y1][x2][y2] 存的是最大好感度但我们又可以省一维。因为两个指针的横纵坐标之和是一定的。因为每次只能向下或向右走,所以每次不是横坐标+1,就是纵坐标+1,也就是说对于每个哨兵,

2021-03-28 11:39:15 154

原创 CF 1497:A-C2

Codeforces Round #708 (Div. 2)A题B题C1C2A. Meximization其实说白了,这道题就是把数组按从小到大输出,重复的放在最后本人用的set,略显复杂#include <bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--) { int n; set<int> s1; multiset<int&gt

2021-03-25 21:55:49 130

原创 重拾树状数组

树状数组(本文会详细介绍树状数组,萌新也可以轻松看懂)引言在做题过程中,我们有时会要维护这样一个前缀和数组:Sum[i]=a[1]+a[2]+a[3]+.......+a[i]Sum[i]=a[1]+a[2]+a[3]+.......+a[i]Sum[i]=a[1]+a[2]+a[3]+.......+a[i]不难发现,如果我们修改了其中一个a[x]a[x]a[x]的值,那么Sum[i]的值会随之改变;如果我们修改了其中一个a[i]a[i]a[i]的值,那么Sum[i]+Sum[i+1]....

2021-03-24 18:45:03 111

原创 家谱问题:map解决!

P2814 家谱传送门分析:这题用hash和并查集也可以解,但hash实在太麻烦,会把人写死,由于本人最近在连map,就不管并查集了。fa[1]=2fa[1]=2fa[1]=2 意思是 111 的父亲是 222.fa[“Rodney”]=Georgefa[“Rodney ”]=Georgefa[“Rodney”]=George 同理对于最后查询而言,假设查询SSS的祖先,stringstringstring ss=sss=sss=s,如果ss出现在father数组中,ss=fa[s]ss=fa

2021-03-22 19:42:57 123

原创 AtCoder 195 B,C,D

AtCoder 195https://atcoder.jp/contests/abc195/tasksC - Commac题题面很简单,就是三位一断,加逗号。问1到n这些数中,一共要加多少个逗号?翻跟没翻差别不大n是<=10^5,所以可以直接暴力。D - Shipping Center我们有n个背包,m个盒子。每个背包都会有个容量和价值,每一个box也会有一个容量。然后会有q个查询,每个查询中,都会给个l,r,意思是这个区间的box都不可用,问用剩余盒子装出的最大价值为多少?

2021-03-22 19:07:05 241

原创 AK 的故事之英语学习篇:hash&map

解法一:map程序一看就懂,前提你要会map简单说一下mapmap<key,value> mpmap<string,float> mpmp["apple"]=2.6;mp["pear"]=4.5;cout<<mp["apple"]; Code:#include <bits/stdc++.h>using namespace std;int main(){ map<string,bool> mp;...

2021-03-20 08:10:50 251 1

原创 集合元素问题:初识hash

前置知识:何为哈希?假设现在要存一个数组a[1,7,20000000,3289,10]很简单,你可将他们存在a数组里。但这样查找就会很不方便,尤其是当数很多的时候,你要开着循环一遍遍找(当然也可以采用二分)或者你又说为了能O(1)找到这个数是否存在,你可用打勾数组。即读进来5,在a[5]=1;但如果读进来一个很大的数,假设是1000000,你就要开一个很大的数组在a[1000000]=1;但其实最后只有三个数,你却开了这么大一个数组,岂不是浪费?这就要用到hash了hash[mo

2021-03-20 07:52:16 132

原创 加强版密码锁:xxsQAQ

加强版密码锁

2021-03-20 07:32:40 420

原创 一题多解之守望者逃离

P1095 [NOIP2007 普及组] 守望者的逃离此题有较为多种解法:DP,贪心,数学解法本文章只介绍其中的两种DP做法和贪心做法解法一:二维DP解法二:一维DP解法三:贪心做法

2021-03-19 22:57:51 170

原创 栓奶牛:二分更胜DP一筹

栓奶牛解法一:二分很明显题目说了:最小值最大,满足单调性,因此可以二分解释一下:题目要求:距离最近的奶牛之间的距离尽可能大。那么也就是说,两头奶牛要尽量间隔的远一些,即间隔大一点,组数少一点。此时有一个小贪心,那就是第一个桩子肯定要选。我们二分题目所求的最大距离(间隔),如果这个间隔k,可行的话,我们要继续看再大一点可不可以,这就是l=mid+1;如果k不行,意味着,间隔太大了,那么我们要调小,就是r=mid-1;这就是所谓的单调性。二分的复杂度是非常优秀的logn,完全不用担.

2021-03-18 18:21:35 314

原创 优先级队列:先来后到?不存在!(全面)

优先级队列 priority_queue

2021-02-21 18:02:16 174

原创 贪心大礼包1

简单贪心P2240 将金币单价从高到低排序P1803将结束时间从早到晚排序P1223数学手法,写过题解,不再赘述P1090合并最小的两个,优先级队列(从小到大)priority_queue<int,vector<int>,greater<int> >q;P3817特殊处理第一个,因为要最小,把它吃到只剩x个就行了,然后照例处理依次往后P1106中间的某个数,假设是a[i],如果a[i]>=a[i-1]&amp..

2021-02-20 22:16:37 98 2

原创 DFS序

DFS序什么是DFS序呢?顾名思义,深搜序号。不要小瞧他,若运用得当,在线段树等实现中,是可以省空间的。首先,对于一张图的DFS,我们是知道的。void dfs(int x){ vis[x]=true;//标记已来过 for(int i=head[x];i;i=e[i].next)//链式前向星 { int v=e[i].to; if(vis[v]) continue; dfs(v); }}这段代码访问每个点和每条边恰好一次(如果是无向边,正反方向各访问一次)按

2021-02-20 21:00:31 119

原创 AtCoder ABC 190 ABCD

a

2021-02-08 19:15:17 356 2

原创 AtCoder 189 ABCDE(思路+代码)

AtCoder ABC189 简单记录…A题#include <bits/stdc++.h>using namespace std;int main(){ char c1,c2,c3; cin>>c1>>c2>>c3; if(c1==c2&&c1==c3) cout<<"Won"; else cout<<"Lost"; return 0; } B题#include <bits/st

2021-01-28 19:30:22 352

原创 火柴排队:离散化&逆序对

A : 1 3 4 2code: 1# 3# 4# 2#//这里code表示的是排名,例如1是最小的排第一位,所以是1#;2是第二小的排第二位,所以是2#

2021-01-17 15:58:53 192 2

原创 AtCoder 184 E

184 E题目地址虽然是E题,但其实就是一个标准的bfs不用走重复路线,因为bfs总是选择最优,走重复毫无意义具体细节,在代码里标注了。#include <bits/stdc++.h>using namespace std;#define please return#define AC 0struct node{ int x; int y; int step;//步数 };node make_node(int d,int e,int f){ node ret;

2020-12-21 20:01:53 124

原创 AtCoder 184 C

AtCoder 184C - Super Ryumahttps://atcoder.jp/contests/abc184/tasks/abc184_c典型的分类讨论①1或0步到直接特判。②2步到与终点距离不大于3的点存在数组A,与起点距离不超过3的点存在数组B。(1)横坐标值差与纵坐标之差的奇偶性相同;(判断斜线的可能性)(2)对于A中的一个点可以一步走到终点;(3)对于B中的一个点可以一步走到起点;(4)A与B有共同区域。③把棋盘按照国际象棋的方式黑白染色,容易发现两次斜.

2020-12-13 20:50:44 273

原创 AtCoder 183 C

AtCoder 183 Chttps://atcoder.jp/contests/abc183/tasks/abc183_c题目大意:有n个城市,从第i个城市到第j个城市,所需的时间是T[i][j]。你现在要从第一个城市出发,遍历所有城市,并最后回到第一个城市。问在这所有路径中,所需的时间总和正好等于k的有几条?n最大是8,问题不大。解法1:全排列分析样例1,我们就能发现:头尾两个1肯定是雷打不动的,只是中间的2 3 4在全排列。我们可以用next_permutation()函数全排

2020-12-13 20:42:51 146

原创 闲情偶记1

Q1: You may have heard the classical story about Goldilocks and the 3 bears. Little known, however, is that Goldilocks ultimately took up farming as a profession. On her farm, she has a barn containing N cows (1 <= N <= 20,000). Unfortu...

2020-11-08 19:17:05 288

原创 P1223 排队接水 题解

P1223这道题其实是道数学题,代码不长遵循原则:快的先来首先先分析一下样例:56 12 1 99 1000 234 33 55 99 812我们将他们的下标标注一下:1 2 3 4 5 6 7 8 9 10然后排序:1 12 33 55 56 99 99 234 812 1000下标跟着数字走就变成了这样:3 2 7 8 1 4 9 6 10 5所以这样题目要求输出的一种排队顺序解决再来,我们现在得到如下有序数列:1 12 33 55 56 99 99 234 81

2020-09-27 20:01:01 296

原创 郊游活动

题面:有 n 名同学参加学校组织的郊游活动,已知学校给这 n 名同学 的郊游总经费为 A 元,与此同时第 i 位同学自己携带了 Mi 元。为了方便郊 游,活动地点提供 B(≥n)辆自行车供人租用,租用第 j 辆自行车的价格为 Cj 元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管 理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多 有多少位同学能够租用到自行车。解法:本题采用二分法。对于区间[l, r],我们取中间点 mid 并判断租用到自行 车的人数能否.

2020-09-23 21:57:02 1358

原创 AtCoder 176 E

E - Bomber题目网址首先考虑导弹所在最多的行和列,然后如果交叉重叠那就行+列-1即可。但后来发现可能会有很多组同样多的行和列,这时候如果一个一个去判断将会很慢(30万)但其实如果你看到题目说的导弹最多数量为30万,你就会发现本题关键。#include <bits/stdc++.h>using namespace std;int p1,p2,a[300005],b[300005];set<pair<int,int> > st;vector&l

2020-09-15 20:19:30 85

原创 AtCoder 176 C

C-Step题目网址题目解释:给你一个有n个数的数列,保证每第i个数都要>第i-1个数,如果小于那么第i个数要一直加到第i-1个数的值为止,这就是题目中所说的要添加的板凳数。代码很简单:#include <bits/stdc++.h>using namespace std;typedef long long ll;int n,a[200003],last;ll ans;int main(){ cin>>n; for(int i=1

2020-09-14 20:58:23 117

原创 AtCoder 176 D 求各位大佬帮忙

D - Wizard in Maze题目网址题目解释:简单来说就是有一个H*W的格子,你有两种走法:1.上下左右走 2.在5*5的格子里穿梭(消耗魔法)问最少需要用多少魔法才能走到目标格子双端队列这题解法应该就是双端队列,能走方案1不走方案2方案1放在队首,方案2放在队尾。还请大佬帮我看一下我的程序到底哪里有问题?#include <bits/stdc++.h>using namespace std;int h,w,sx,sy,ex,ey;int ma..

2020-09-14 20:23:02 120

原创 AtCoder 177 D题

D-Friends题目连接简单翻译:有n个人,给你m条事实:如果a和b是朋友,b和c是朋友,那么a和c也是朋友。现在想要把这n个人分成若干个小组,每个小组中的每一个人都不是朋友,至少要分多少组?简单并查集求并查集中最大的元素个数便是最少的分组数量。#include<bits/stdc++.h>using namespace std;const int N=2e5+5;int n,m,ans,fa[N],sum[N];//fa[i]表示元素i的父节点 inl..

2020-09-13 18:02:08 162

原创 POJ 2411 Mondriaan‘s Dream

Mondriaan's DreamPOJ题目一道看起来超级难,但代码很短的状压DP还是用01来刻画图,每一个11的小正方形是0,所以说横着放的12的长方形0的个数总会是2的倍数,也就是说不可能有连续的奇数个0;竖着放的1*2的长方形看做是1,比如说第1行是1,那么第二行的那个位置就是0,竖着放,上下各一半嘛。f[i,j]表示第i行的形态为j时,前i行的方案总数,j是用十进制数记录的N位二进制数。第i-1行的形态k能转移到第i行的形态j,只有一下两种情况:1.j和k位与运算的结果.

2020-08-11 21:23:09 144

原创 P1879 [USACO06NOV]Corn Fields G

P1879 [USACO06NOV]Corn Fields Ghttps://www.luogu.com.cn/problem/P1879首先这道题,一般的区间DP状态不太好设计,很难确定父子关系。这道题有很鲜明的特征:1.01矩阵2.1 ≤ M ≤ 12; 1 ≤ N ≤ 12所以这就使人很容易想到状压DP。下面详细说说:f[i][j]表示前[i]行的状态为j时的合法方案数mp[i]刻画的是土地possi[i]判断是否合法步骤:1.读进来土地,把它二进制转十

2020-08-11 20:59:05 224

原创 P4819 [中山市选]杀人游戏

Tarjan缩点https://www.luogu.com.cn/problem/P4819这题想必大家很容易想到图论建模。每个人都是一个结点,与他认识的人连一条边,每过一个点我们就能这样扩展下去。我们需要使警察被杀的概率小,简单贪心:尽量去找认识人多的人询问,即找到联通较多边的那个结点询问。我们可以求出途中所有的强连通分量,用tarjan算法缩点,然后找出所有入读为0的点。但这题有一个小坑,那就是有一个点是可以不用去查的。举个例子:假设有100个人,已经查过了99个人,那么剩下来那一个人不用查

2020-08-10 22:29:52 198

原创 匈牙利算法:二分图最大匹配

P3386 【模板】二分图最大匹配https://www.luogu.com.cn/problem/P3386#include <bits/stdc++.h>using namespace std;const int MAX=1000+5; int n,m,e,ans;int par[MAX];//匹配点的编号 bool vis[MAX];//是否被搜索过 bool ga[MAX][MAX];//邻接矩阵, "true"代表有边相连 bool find(int a)/

2020-08-10 16:47:57 128 1

原创 最大连续子序列和

最大连续子序列和是一个十分规整的dp举个例子:-2,11,-4,13,-5,2显然,在这个情况下,11+(-4)+13+(-5)+2=20是最大的和。也很显然,这个问题可用暴力直接扫,但效率极低,数据一大,就完全TLE所以这就要用到高效率的DP(动态规划)f[i]表示以a[i]结尾的最长连续子序列和,会有以下两种情况:1.序列中只有一个元素,即a[i]开头,a[i]结尾。那么f[i]=a[i]2.序列中有多个元素,比如说从前面某处x开始(x<i)一直到a[i]结尾(a[x]

2020-08-10 16:18:08 126

原创 P1894 The Perfect Stall

P1894 The Perfect Stallhttps://www.luogu.com.cn/problem/P1894这是一道较为规整的匈牙利算法:#include <bits/stdc++.h> using namespace std;const int MAX=200+10;int n,m,ans,cow[MAX];//cow[i]代表第i个牛栏的牛bool vis[MAX],love[MAX][MAX];//vis是已搜查过,love记录喜爱的牛栏编号inl

2020-08-10 16:15:05 129

原创 洛谷月赛 Div 2

P6746 『MdOI R3』OperationsA题:不是特别难得模拟+较为规整的高精度,比平常的高精度要简单很多#include <bits/stdc++.h>typedef long long ll;using namespace std;ll k,x,last=10000;ll a[10005];int main(){ cin>>k>>x; if (k==0) cout<<x+1<<endl;//两个特判

2020-08-09 22:20:44 313

原创 加分二叉树

加分二叉树LOJ链接洛谷链接1.本题还是采用DP的做法。2.f[i][j]表示顶点i到顶点j所组成的子树的最大值3.root[i][j]表示根编号4.具体细节在程序里//加分二叉树,f[i][j]表示顶点i~顶点j组成的子树的最大值,root是编号 #include <bits/stdc++.h>using namespace std;typedef long long ll;ll f[35][35],root[35][35];inline ll se

2020-08-08 10:40:11 143

原创 洛谷P1352 没有上司的舞会 题解

没有上司的舞会https://www.luogu.com.cn/problem/P13521.造树 2.DP2.1 f[x][0]表示以x为根,x不参加,所得的最大快乐指数。x不参加,那么他的下属y可以参加也可以不参加,所以f[x][0]=max(f[y][0],f[y][1])2.2 f[x][1]表示以x为根,x参加,所得的最大快乐指数。x参加了,那么他的直接属下y将不能参加,所以f[x][1]+=f[y][0];#include <bits/stdc++.h>usi

2020-08-08 09:08:42 223

原创 [USACO12MAR]Tractor S

Tractor S洛谷题号思路:本题数据不是很大,顶多1000^2;再加上本题没有要求路径最短,只是要求最小挪动干草堆的代价。最好的解法就是:01BFS1、两个队列,一个是代价为0的队列,一个是代价为1的队列。2.进行BFS,不断改进松弛3.大思想:尽量走没有干草堆的地方,避开有干草的地方,直到走不下去为止。#include <bits/stdc++.h>using namespace std;const int MAXE=1002;struct Poin.

2020-08-05 21:38:30 307

原创 简单分块3

分块3https://loj.ac/problem/62791.查找前驱用lower_bound 就可以解决了。2.放在set集合里做,会更方便3.其他步骤跟之前的分块一样直接上代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAX=50000+5;int n,blo;int a[MAX],bl[MAX],tar[MAX];set<int&gt

2020-08-01 22:08:19 117

空空如也

空空如也

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

TA关注的人

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