自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

binarycopycode

人百我一,人万我十,舒服了

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

原创 poj1739 Tony‘s Tour

http://poj.org/problem?id=1739普通通路问题,左下角走到右下角,那么只要在上面加两层壳,一层全不可走,一层全可走,那么总左下角走到右下角是一条路径且他和从外面这层壳的唯一路径走形成了一条回路,问题就转换成了直接求回路,就等同于模板题了https://blog.csdn.net/liufengwei1/article/details/108114948#include<cstdio>using namespace std;typedef long lo

2020-08-27 12:21:46 154

原创 codeforces1208F Bits And Pieces

https://codeforces.com/contest/1208/problem/F首先肯定是枚举a[i]然后找到能使a[i]或起来最大的(a[k]&a[j]),因为a[j]&a[k]是被绑定的。那么问题就转化成了如何快速找到能使a[i]最大的(a[k]&a[j]),那么我们从高位到低位考虑,如果这一位a[i]中是0,那么肯定想要或上这一位使得答案变大,其实就是看这一位的超集有没有两个数字他们的位置都在i的右边就行了。那么很显然问题转化为了一个超集的高维前缀和,每一

2020-08-27 02:13:28 189

原创 ARC 100 E - Or Plus Max

https://atcoder.jp/contests/arc100/tasks/arc100_c问题可以转化为f[k]=max(a[i]+a[j])(i|j==k),那么答案就是f[k]的前缀最大值于是用高维前缀和就可以做了,枚举每一个j=0-n,如果i>>j&1,那么用i^(1<<j)的值去更新i位置上的值因为i^(1<<j)也是i的子集,i的两个子集或起来还是i的子集#include<bits/stdc++.h>using nam

2020-08-27 00:04:06 240

原创 codeforces1401E Divide Square

https://codeforces.com/problemset/problem/1401/E这题关键是知道什么时候矩形会增加。。。首先4个边框围成的矩形先ans=1第一种是如果一条中间的线横跨整个对边,那么ans++第二种则是如果一条线与另一条线在中间有交点,则ans++以为x,y互不相同,那么一定是一条直线和一条竖线形成交点,由于这条直线和这条竖线都是连接到某一边的边界的,那么一定会新增一个矩形#include<bits/stdc++.h>using namespa

2020-08-26 20:57:33 163

原创 codeforces1400D Zigzags

https://codeforces.com/contest/1400/problem/D感觉这题是个div3A难度的题啊怎么放在D的位置大家都5分钟秒了啊。。。枚举a[j],a[k],那么他们对答案的贡献就是(1,j-1)中a[k]的数量乘以(k+1,n)中a[j]的数量,用个前缀后缀和数组维护下就好了#include<bits/stdc++.h>#define pb push_backusing namespace std;typedef long long ll;c

2020-08-26 00:35:46 239

原创 codeforces1400E Clear the Multiset

https://codeforces.com/contest/1400/problem/E据说是群友前几天才做到的腾讯笔试原题?还是抄的以前cf的原题?https://codeforces.com/problemset/problem/448/Csb题目又想了一年,某bhu牛逼网友14分钟过了,基础dp功力还是不够。。。设f[i]为i是用2操作单选过来的,前i个拿完的最优值,g[i]为i是用1操作从之前某个地方延续过来的,前i个拿完的最优值f[i]=min(f[i-1],g[-1])+(

2020-08-26 00:35:41 295

原创 hdu1693 Eat the Trees

http://acm.hdu.edu.cn/showproblem.php?pid=1693这题是之前只有一个哈密尔顿路径问题的弱化版,那么只需要2进制状态就行了,有线连过来或者无就行,而且可以全部跑完最后记录状态为0的树,不用在最后一个位置记录答案。但是我在最后一个位置记录答案时wa了一发,加了一个判断最后这个位置除了j-1和j位是1其他全是0才过,但按道理我每次设为1都判断了下面和右边是不是0,应该不会出现问题啊。。。不是很懂,写了个对拍还没拍出来,建议拍到明早#include<bi

2020-08-25 02:32:04 145

原创 hdu4804 Campus Design

http://acm.hdu.edu.cn/showproblem.php?pid=4804其实这种放骨牌的题好像也可以直接状压,不过挺难受的,还不如直接插头DP轮廓线只需要用1和0来标记是否有拓展到右边或下边的1*2骨牌,然后再把已经放了的1*1压进状态里,及bit+=num*mi[m+1]就行了注意一个细节,当你选择横着放的1*2的骨牌时,由于影响的是下一个位置,需要判断一下是否下一个位置被从上一行往下的骨牌给覆盖了。转移就是如果当前格子被左边或者右边或者本身就不能放的话,直接把j-1和

2020-08-24 22:36:04 149

原创 hdu3507 Print Article

http://acm.hdu.edu.cn/showproblem.php?pid=3507可以很容易得写出线性dp转移dp[i]=min{(s[i]−s[j])2+dp[j]+M)}(j∈[0,i−1])dp[i]=min\{ (s[i]-s[j])^2+dp[j]+M)\}(j\in[0,i-1])dp[i]=min{(s[i]−s[j])2+dp[j]+M)}(j∈[0,i−1]),其中s[]为前缀和数组那么直接把平方拆开,把只与j有关的放到斜率优化dp式子的左边。可以得到式子dp[j]+s[j

2020-08-24 18:31:41 132

原创 High Buildings KickStart2020 Round E

https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ff47/00000000003bef73特判一下1 2的情况然后如果我们需要A-C个2放在左边给左边的人看,B-C个2放右边给右边的人看,C个n放在中间给两个人都看,剩下不足的位置就放1,但是1一定要被挡住,所以C>2时1就放在C中间,如果A-C>0就放在左边的2和n中间,B-C>0就放在右边的n和2中间,否则则无解#include&l

2020-08-24 02:35:30 172

原创 Toys KickStart2020E轮

https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ff47/00000000003bede9#problem首先考虑无限的情况,设sum为e[i]之和,那么当所有的玩具都满足sum-e[i]>=r[i]时,就可以无限那么我们先假设存在无限的情况,思考如何找出最小删除多少个物品可以发现条件是sum>=e[i]+r[i],那么对于最大的e[i]+r[i]如果他不满足,则必须把他删掉,为什么不删其他非

2020-08-24 02:27:35 192

原创 fzu2321 竞赛图 2020福州大学校赛重现

http://acm.fzu.edu.cn/problem.php?pid=2321竞赛图中如果存在环,那么肯定存在三元环,手画一下四元环,发现只有四元环没有三元环是不可能的然后说明必须是DAG,那么DAG一定可以知道每个人的排名,那么我们dfs这个排名,然后去拓扑排序一下,每个点rudu没有归零说明这些边需要反过来,然后记录一下最小值就好#include<cstdio>#include<algorithm>#include<vector>#defin

2020-08-23 21:28:25 219

原创 fzu 2320 切割逆序对 2020福州大学校赛重现

http://acm.fzu.edu.cn/problem.php?pid=2320显然是切得越多答案越小那么就从左到右枚举切一刀的位置,维护两个树状数组,左边的数字情况和右边的数字情况。那么向右挪动一位,就相当于把a[i]从右边换到左边,那么就减去a[i]与右边数字组成逆序对的数量,加上a[i]与左边组成逆序对的数量就行了。#include<cstdio>#include<algorithm>#define pb push_backusing namespa

2020-08-23 21:18:28 164

原创 hdu6875 Yajilin 2020杭电多校第9场

http://acm.hdu.edu.cn/showproblem.php?pid=6875调了一个晚上,其实就是在求哈密尔顿路径的板题https://blog.csdn.net/liufengwei1/article/details/108114948的基础上加上一维状态表示那个插头是黑色方块,只有左插头和上插头都不是黑色,才能新增一个黑色方块。然后有几个地方注意一下,左插头是1,右插头是2时,一定不能加进队列,因为要保证剩下的方格是一个完整的哈密尔顿路径,所以特判当i=n,j=n-1时,如果右边

2020-08-22 22:53:29 254

原创 hdu6883 Coin Game 2020杭电多校第十场

http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1007&cid=888由于一个机器可以选择a,a+b和2*a+b,那么其实一个机器可以拆成两个物品,a和a+b,他们任选一个或者两个都选,都是可以的,所以就不需要判断机器冲突了。接下来就可以直接递推了,dp[i]->dp[i+1]的时候,是直接拿一个还没选的a,还是丢掉一个以前选的最小的a,拿一个当前剩下最大的a+b。#include<bits/stdc+

2020-08-20 17:06:00 359

原创 洛谷P5056 【模板】插头dp ural 1519

https://www.luogu.com.cn/problem/P5056学习了模板题https://www.cnblogs.com/y2823774827y/p/10140757.html关键在于知道b1b2是你枚举的那个方块左边和上边的插头,b1是竖着的边的插头,b2是横着的边的插头。然后1表示是一个条线左端点,2表示是1条线右端点,用4进制来存012的状态,再讨论状压的转移,8种情况怎么转移#include<bits/stdc++.h>using namespace

2020-08-20 02:51:47 229

原创 hdu6866 Linuber File System 2020杭电多校第八场

http://acm.hdu.edu.cn/showproblem.php?pid=6866又从wcy聚聚那学到了QAQ这题比赛的时候猜想一定是选l[i]或者r[i],然而存在加法问题,就完全不知道怎么办然而可以转化一下,设dp[u][i]为u的子树,从1到u的路径上所有点的加的值是i时,这棵子树中最小的修改值的次数枚举u的一个儿子v中所有的可能值dp[v][j], 如果j=i,也就是说从u到v时不需要修改v的值,否则需要修改也就是+1,那么dp[u][i]+=v的最小值就行了。我们发现

2020-08-18 02:12:18 232

原创 codeforces1392F Omkar and Landslide

https://codeforces.com/problemset/problem/1392/F这题的关键是观察出无论何时,至多只有一对是相同值的考虑没有相同值的时候,如果某个时刻出现了a[i]+2=a[i+1]的时候,假设a[i-1]和a[i+2]都无法滑坡了,那么此时会出现a[i]=a[i+1]但是由于a[i+1]<=a[i+2]+1的,此时a[i+1]+1<=a[i+2],于是就不会出现两个同时存在的相同的位置,一开始是严格递增没有相邻位置相同的,出现一个相同的也最多只有一对,

2020-08-17 21:44:11 214

原创 codeforces1392E Omkar and Duck

https://codeforces.com/contest/1392/problem/E每走一步,曼哈顿距离都是在减小的,所以我们对于到达终点相同曼哈顿距离的点(反对角线),相邻两个一个放2^i,一个放0,那么你到了每个点只能向右走或者向下走,其中有一个是0,一个是2^i,就可以判断下一个点走到哪了。#include<bits/stdc++.h>#define pb push_backusing namespace std;typedef long long ll;cons

2020-08-17 03:24:39 189

原创 codeforces1392D Omkar and Bed Wars

https://codeforces.com/contest/1392/problem/Dsb题写了一年,写的巨复杂把入度为1的不合法的点拿出来讨论就行了,如果两个相邻的都是不合法的,直接换一条边改两个,否则就该当前这个不合法的边有更简单的写法,直接把连续的L或R拿出来,长度/3就行了我的代码就别看了,写得巨丑#include<bits/stdc++.h>#define pb push_backusing namespace std;typedef long long

2020-08-17 03:21:15 272

原创 codeforces1398F Controversial Rounds

https://codeforces.com/contest/1398/problem/F太神了从后往前预处理出每个位置向后最远多少个连续的mx[i],然后我们加入a[mx[i]]中,存相同的最多连续相同mx[i]的所有下标然后用一个并查集维护对于下标idx来说,最近的能走>=x的位置是哪里,然后直接跳到那里,然后idx+=x处理完x的答案后,我们枚举a[x]中的所有下标,把他们的f[i]=i+1,这个意思也就是下次求x+1的答案的时候,必须跳过这个位置,因为他不能走x+1,由于从小到

2020-08-15 17:34:24 299

原创 codeforces1398E Two Types of Spells

https://codeforces.com/contest/1398/problem/E设当前有cnt个光之符卡维护3个set,c表示最大的cnt个符卡,f1表示不是c中的剩下的火卡,l1表示不是c中的剩下的光卡那么答案就是c中的所有卡的值*2+剩下的卡的值,sum为所有卡的值,sum1位c中卡的值,ans=sum+sum1接下来我们就只需要维护c中总是所有卡中最大的cnt个就行了,当前szc!=cnt都判断一下,然后如果剩下的卡中有比c最小的卡大的就替换一下注意特判特殊情况,维护一个

2020-08-15 00:41:08 172

原创 1002 Breaking Down News 2020杭电多校第8场

http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=886这个榜歪到天上去了,LCT过120队,这题线段树裸题过30+队这题就是dp[i]只能从dp[i-R]---dp[i-L]这段转移过来,那么对前缀和离散化一下,把前缀和当下标维护一棵权值线段树,记录区间段最大的dp值,注意这题由于可能有重复的前缀和,所以不要unique,就是排序然后就可以让一个位置的sum[i]确定一个下标,就不用考虑重复的问题了。

2020-08-13 17:00:59 467

原创 codeforces1394B Boboniu Walks on Graph

https://codeforces.com/contest/1394/problem/B我们知道对于C的任意一组选择,最后每个点都只有一个出度,然而这题要保证最后所有点可以走到自己,那么这等价于每个点都只有一个出度和一个入度。然后我们枚举每条边(u,v,l),把{out[u],rank(l)}给v,表示如果最后选择为c[out[u]]=rank(l),那么v这个点将会多一个入度,显然对于一个点v,所有这些选择之间必须选择一个,但不能选择多个,因为必须保证入度为1,所以他们是互斥了,用一个set表示

2020-08-13 00:41:30 280

原创 codeforces1391E Pairs of Pairs

https://codeforces.com/contest/1391/problem/E本来以为写完D题下班了,结果队友给我讲课E题卧槽这不是标准dfs树题?现场没写完,艹,血亏100分,5月份的时候补了两道这种dfs树的题,就是建一棵dfs树出来,要么满足一种情况,要么满足另一种情况。这题就是建dfs树,如果有深度>=(n+1)/2,那么直接输出,否则则每一层分别匹配,由于深度<(n+1)/2,每层最多浪费一个,那么至少还剩(n+1)/2个点可以匹配上#include<b

2020-08-11 21:41:34 207

原创 hdu6850 1007 Game 2020杭电多校第7场

我们考虑最长的一条边,如果某个人先手选了这条边两个端点的一个,那么另一个人立刻选另一个,就结束了然后把所有最长的边去掉后,又变成了一个子问题,还是把剩下的边中最长的选出来,这样递归下去那么最后如果只剩1一个点没选,那么1无论选其他的哪个点,都是先手选了一个"最大"边的端点,他必输否则先手必赢#include<bits/stdc++.h>using namespace std;long long x[2005],y[2005];int vis[2005];struct N

2020-08-11 17:23:33 1118

原创 C Decrement on the Tree 2020 牛客暑期多校训练营(第十场)

https://ac.nowcoder.com/acm/contest/5675/C每条边有一些权值,每次选择一条路径全部减1,最多选多少条路径。我们把问题转换为最少多少个路径的端点,路径数就是段点数/2,对于一个点,我们考虑他连接的所有边,如果mx<=sum/2,那么只要两条边能匹配起来,他本身就不用作为一个端点,那么此时作为端点的数量就是sum&1,如果mx>sum/2,那么最大的那条边是匹配不完的,作为端点的数量就是2*mx-sum。修改维护的话就用个multiset搞搞就

2020-08-10 21:52:27 186

原创 codeforces1391D 505

https://codeforces.com/problemset/problem/1391/D每个偶数长度的正方形都有奇数个1,那么存在长度为4的正方形肯定不行那么把<=3的那一维状压,然后扫描另外一维进行状态转移就行了,根据状态算出这几个变成这个状态s的代价,枚举上一个位置的几个的状态t,如果满足2*2的正方形奇数个1,那么就可以从上一个位置的t状态转移到当前的s状态#include<bits/stdc++.h>#define pb push_backusing na

2020-08-10 01:55:43 269

原创 1003 Range k-th Maximum Query 2020 年百度之星·程序设计大赛 - 复赛

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=892&pid=1003考虑求最大值的构造方法,先把a数组从小到大排序我们思考对于第一段长度为l的,要让更大的答案覆盖更多的区间,就肯定后k个从大到小倒序放,也就是在l-k+1的位置开始放a[n],a[n-1]....a[n-k+1]放到a[l],那么第一个区间的答案就为a[n-k+1],然后这个a[n-k+1]可以一直拓展到右坐标为l+l-k的位置,然后从右坐标

2020-08-09 22:07:25 272

原创 1002 Binary Addition 2020 年百度之星·程序设计大赛 - 复赛

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=892&pid=1002第2种操作肯定只会操作1次,而且在i位置操作必须让前i位都变成1后再全变0向后进1位,才可能比直接换更优。你让S的一堆0变成1以后,再把他们全变0,如果之后要再进行一次操作的话,又要把他们全变1,肯定不优,那么最多操作一次那么我们枚举每一个i,算出前i位变为1的答案,跟总答案比较一下就行了,肯定中间有很多不太好的答案,但是扫过去总能找到

2020-08-09 22:01:24 288

原创 1001 Battle for Wosneth 2020 年百度之星·程序设计大赛 - 复赛

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=892&pid=1001把p/100当做每次alice攻击b掉的血量,那么b会在m/(p/100)天死亡,由于是alice先手,那么b的攻击天数会是m/(p/100)-1,那么它能让alice掉的血就是(m/(p/100)-1)*q/100,然后把alice命中m次加的m血加上就是答案#include<bits/stdc++.h>#define p

2020-08-09 22:01:21 262

原创 H-Sort the Strings Revision 2020牛客暑期多校训练营(第三场)

https://ac.nowcoder.com/acm/contest/5668/Hp[i]%10==d[i],那么经过这次操作是不变的那么把s0-sn为中会变的拿出来,按顺序建笛卡尔树,下标为k+1,val为p[k],因为越前面对字典序影响越大,而且p是0-n-1的排列,所以笛卡尔树不会有问题然后dfs笛卡尔树,每个节点将一段区间分为了两部分,根据变化后数字变大还是变小了,去考虑先dfs右子区间还是先dfs左子区间,ans[i]的编号也就是优先dfs到的顺序的编号#include<

2020-08-09 17:47:15 163

原创 洛谷P4755 Beautiful Pair 笛卡尔树上启发式合并 主席树计数

https://www.luogu.com.cn/problem/P4755这题思路挺简单的,写起来有一点长对整个序列构建笛卡尔树,每个节点大于他的左子树和右子树的所有值,那么就可以对笛卡尔树进行dfs,回溯时启发式合并两个子树,根节点就是最大值,枚举小的那边每个位置a[i],计算出每一个位置所能够接受的a[j]的上限,然后用主席树去另一个区间求区间内满足1-a[j]上限的个数,就是跨过a[u]并以a[u]为最大值的美丽的数对的数量#include<bits/stdc++.h>u

2020-08-08 21:27:06 267

原创 J The Escape Plan of Groundhog 2020牛客暑期多校训练营(第九场)

https://ac.nowcoder.com/acm/contest/5674/J枚举上边界和下边界,从左到右扫枚举当前的列为右边界,要求有多少个左边界满足左边界也是没有空位的,而且横着的两条边也不为空,而且这个区间的有桌子和没桌子的差值最多是1,那么就维护一个(有桌子-没桌子)数量为值的前缀和,然后把当前列为右边界能连接的到左边界前缀和差1的数量就行了,这个用个桶维护数量就行#include<bits/stdc++.h>using namespace std; inline

2020-08-08 17:10:08 308

原创 E Groundhog Chasing Death 2020牛客暑期多校训练营第九场

https://ac.nowcoder.com/acm/contest/5674/E考虑x和y的每个共有的质因子在答案中的幂次q,ans*=p[k]^qr[k]为p[k]在x中的幂次,s[k]为p[k]在y中的幂次枚举i=a->b,然后i*r[k]<j*s[k],那么gcd中关于p[k]的幂次就是i*r[k],反之就是j*s[k]由于q可能很大,注意幂次是要%phi(mod)也就是%(mod-1)注意特判当x=mod,y=mod的情况#include<bits/s

2020-08-08 17:05:06 172

原创 codeforces1393D Rarity and New Dress

https://codeforces.com/contest/1393/problem/D先每一列从上往下扫再从下往上扫,得到每个位置向下最远多少,向上最远多少,然后取min得到他在竖直方向最大多少然后每一行从左往右扫再从右往左扫,由于他的形状特性,那么当前位置可最多拓展的图形个数就是min(l[i][j-1]+1,h[i][j],r[i][j+1]+1)#include<bits/stdc++.h>using namespace std;typedef long long l

2020-08-08 00:44:47 216

原创 C sequence 2019牛客暑期多校训练营(第四场)

https://ac.nowcoder.com/acm/contest/884/C听说这题是笛卡尔树,发现去年这题是队友写的,来补一补然而完全不想用笛卡尔树写,单调栈多爽对于a[i],找出他为最小的l[i]和r[i],然后如果a[i]<0,就跨过i的找前缀和相减最小值,否则则找区间和最大值辣鸡题目卡st表要写线段树#include<bits/stdc++.h>using namespace std;typedef long long ll;const int

2020-08-07 22:11:30 153

原创 洛谷 P1377 [TJOI2011]树的序

https://www.luogu.com.cn/problem/P1377二叉搜索树的性质:1.父节点一定比子节点早出现。2.左子树的值<=根<=右子树的值笛卡尔树的性质:1.父节点的值一定比子节点小 2.左子树出现早于根节点早于右子树那么如果我们把二叉搜索树的值换成下标,下标换成值,那么就是一笛卡尔树了。这题要求字典序最小,显然就是求二叉搜索树的前序遍历中的权值顺序,那么也就是求笛卡尔树中的下标顺序。#include<bits/stdc++.h>using

2020-08-07 17:27:57 207

原创 洛谷P5854 笛卡尔树模板

https://www.luogu.com.cn/problem/P5854这题1e7的输入,只开500ms时限,太毒瘤了,写标准的笛卡尔树要加了读入优化,改成register ++i要387ms,去掉register写i++要488ms,不开读入优化过不了,可能要改成普通的单调栈,那就没有到模板题的意义了啊笛卡尔树就是下标是第一维,权值是第二维,前序遍历顺序满足下标顺序,树的结构满足第二维权值小根堆于是构建笛卡尔树的方法跟单调栈差不多,从左到右去跟前面的比较一下,然后确定他的儿子和父亲是谁

2020-08-07 15:32:54 423

原创 洛谷P3964 [TJOI2013]松鼠聚会 切比雪夫距离转曼哈顿距离

https://www.luogu.com.cn/problem/P3964切比雪夫距离为max(|x-o.x|,|y-o.y|),曼哈顿距离为|x-o.x|+|y-o.y|当我们要求n个点的到1个点的切比雪夫距离和最小,显然有个max值是不好求的,那么可以通过(x,y)->((x+y)/2,(x-y)/2)的坐标变换变成曼哈顿距离,然后分别求每个点为终点的x和y的距离之和,sort一下扫一遍就好了#include<bits/stdc++.h>using namespace

2020-08-07 00:51:31 203

空空如也

空空如也

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

TA关注的人

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