自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Codeforces 679C Bear and Square Grid 暴力(滑动窗口)

题意:n*n地图,'X'为障碍,'.'可以到达四周相邻的'.'现在给你一次机会:选择某个k*k子矩形将里面'X'变为'.'n,k暴力枚举变化子矩形的左上角,判断和该子矩形连通有哪些联通分量.只要检查子矩形的4个边界即可.O(n^2*k)k*k中可能有和外部相连的联通分量,先加上k*k,然后在内部减小这些连通分量大小,防止重复计算.滑动窗口处理即可.#include u

2017-08-18 10:57:11 795

原创 Codeforces 677D Vanya and Treasure BFS+DP (分段)

题意:n*m地图,保证至少有一个点为a[i][j]=x (x=[1..p]),两点花费为:欧几里得距离.n,m设f[i][j] 从起点到(i,j)(1-a[i][j]已经拿完)的最小花费.相邻两组数量都很大时,转移最坏情况O((nm)^2)cnt[x]*cnt[x+1]>=n*m,最多sqrt对,bfs暴力更新sum(cnt[x]*cnt[x+1]#include u

2017-08-17 17:43:37 552

原创 Codeforces 703E Mishka and Divisors 离散化+DP

题意:给出长度为n的序列a,子序列合法:子序列中每个元素相乘后得到的乘积能被k整除n 设f[i][d]为 前i个数中选出乘积为d的倍数需要的最少个数.f[i][d]=min(f[i-1][d],f[i-1][d/gcd(d,a[i])]+1)  (f[i][x]离散化第二维,因为d每次都转移到自己的某个因子中.最坏情况下只有6720个因子..#include using

2017-08-15 17:59:29 597

原创 Codeforecs 675E Trains and Statistic 贪心+DP

题意:给出n-1个数,a[i]表示: 从i能直接到达点[i+1,a[i]].p[i][j]为i->j的最短路径.n考虑从i出发[i+1,a[i]]这段只需要1,[a[i]+1,max(a[i+1],a[i+2],a[a[i]])]这段最短距离为2a[m]=max(a[i+1],a[i+2],a[a[i]],也就是说若移动次数大于1,第一步肯定移动到m点(m点的下一次选择最多)设

2017-08-14 18:33:58 456

原创 Codeforces 713C Sonya and Problem Wihtout a Legend DP(经典)

题意:给出长度为n的序列a,op:将任意一个数增大/减小1.n当a递增时:a[i]也就是b[i]=a[i]-i非递减.同样b非递减时,a也就是递增的.转为求使b非递减最小代价序列b非递减,则最后b中元素都为原来的某些元素,假如x!=b[k] 则通过逆操作把x变为相邻某个b[k] 操作减少,单调性不变.设dp[i][j]:前i个元素变非递减,第i个元素为原来第j大时的最小代价

2017-08-11 19:43:46 614

原创 Codeforces 705D Ant Man DP(贡献)

#include using namespace std;typedef long long ll;const int N=5e3+5;const ll inf=2e16;int n,s,t,x[N],a[N],b[N],c[N],d[N];ll dp[N][N];ll solve(int i,int j,int k){ if(i==n) { if(j==0&&k==0)

2017-08-11 01:31:17 410

原创 Codeforces 707D Persistent Bookcase 暴力(bitset)

题意:书房有n个架子,每个架子有m层.q次操作.op1:第i个架子的第j层放一本书, op2:拿走第i个架子的第j层上的书.op3:反转第i个架子:将第i个架子中有书的拿走,没书的放书.op4:把书房恢复到第k次操作后的状态.n,m离线:因为每次暴力更新加上bitset优化区间翻转后复杂度为O(mq/32).则把每个op看成图中的结点.第i次若进行op4则将i连到x结点

2017-08-11 01:26:06 382

原创 Codeforecs 705C Working Routine 模拟(链表)

题意:n*m矩阵,q次操作,每次给出两个矩形的左上角坐标,及宽度和高度.交换这两个不相交的矩形.n,m题意限制的很紧,一条直线上不会有属于不同矩形的格子.每个格子存其右边和下面元素,交换两个子矩形不改变其内部指针,变得只有其四周一圈的指针O(q*(n+m))#include using namespace std;typedef long long ll;const int

2017-08-08 20:48:05 379

原创 Codeforecs 700D Connecting Universities 构造

题意:n个结点的树,其中有2k个标记点,每个点只能配对一次,将标记点配对后,每问k对标记点距离累加和最大为多少?,n,k首先一条边u-v的贡献最多为min(sz[v],2*k-sz[v).其次每条边都能达到这个上限.从深度大的边开始check,假如存在u-v小于上限,则说明以v为子树中,至少有一个配对点(a,b).v之外的子树中有配对点(c,d).将(a,c),(b,d)配对,贡献增加.当

2017-08-08 09:05:08 307

原创 Codeforces 698C LRU 概率+状压

题意:有一个箱子最多装k件物品,现在有n件物品,第i件物品被询问的概率为pi,当第i件物品被询问时,如果第i件物品不在箱子里面,则把第i件物品加入到箱子中,若箱子物品数量>k,则移除最早添加进来的物品.问10^100次查询后,每个物品在箱子中的概率? n,k询问10^100次,物品最多只有20个,所以可以说箱子最后肯定有k个物品问题转化为求最后状态为S的概率,初始时抽到k种不同

2017-08-07 15:38:39 423

原创 Codeforces 696C PLEASE 概率(推公式)

题意:3个杯子,中间杯子放着炸弹.每一轮从左/右选一个杯子和中间杯子交换(等概率).问n轮后,中间杯子有炸弹的概率? n=a[1]*a[2]..a[k] k第i轮要想在中间则第i-1轮一定不能再中间 所以设dp[i]:i轮后在中间的概率.dp[i]=(1-dp[i-1])*0.5 a[i]因为最后答案要写成分数形式p/q.发现q每次都增大2.dp[i]=(1-dp[i-

2017-08-06 12:10:23 455

原创 Codeforces 689E Mike and Geometry Problem 思维

题意:n条线段[li,ri],f[l,r]为线段[l,r]的长度,问任意k条线段交集长度的累加和?n,k若点p被m条线段覆盖,则对答案贡献C(m,k),点的数量很多,转为计算f[i]:正好被i条线段覆盖的点有多少个?答案为:f[i]*C(i,k)(i=k..n),端点最多2n个,利用前缀差分.一段一段算即可(同一段中的点被覆盖次数相同)#include using namespa

2017-08-05 10:15:35 371

原创 Codeforces 687C The Values You Can Make DP

题意:全集A为n个a[i],若有某个集合B其和为k,则B的任意一个子集C定义其元素之和x为合法n,k,c[i]设dp[i][j][k] 表示前i个数能凑出子集和为j,和为j的集合又有子集和为k考虑第i个数是否加入,加入到集合j时,又分是否加入集合j的子集.dp[i][j][k]|=dp[i-1][j][k]|dp[i-1][j-a[i][k]|dp[i-1][j-a[i]][k-a

2017-08-03 21:25:34 455

原创 Codeforces 651E Table Compression 拓扑序

题意:给出n*m矩阵a,要求把矩阵a压缩成矩阵b.b的元素尽量小.并且满足下列条件若a[i][j]若a[i][j] 1a[i][j]和其同行同列有着拓扑序,则从a[i][j]最小的开始填,每次维护行/列的最值即可.但同行同列中若有相同的? 把这些同行同列相同的数用放到同一个集合,并查集维护要取的值即可.#include using namespace std;typ

2017-08-02 21:43:44 389

原创 Codeforces 665E Beautiful Subarrays (01Trie)

题意:n个元素a[i],问有多少个区间[l,r] 满足a[l]^a[l+1]..a[r] >=k.n枚举区间结尾r,如何快速找到有多少个前缀si满足si^sj>=k?num[u]:记录有多少个前缀经过该结点,查询时保存当前异或和val,若val+(1=k若val+(1=k 相反结点子树中任意个前缀都满足,累加其num[u]后,跳到相同结点上继续查询.O(nlogX)#inc

2017-08-02 11:40:14 375

原创 Codeforces 834D The Bakery DP(线段树维护)

题意:k个盒子,n个蛋糕,第i个蛋糕为种类a[i],每次把连续一段的蛋糕装到某个盒子中.价值为该盒子里蛋糕种类不同的个数 n设dp[i][j]:前j个蛋糕放到i个盒子中的最大价值,f(x,j)为[x,j]中蛋糕不同的个数.dp[i][j]=max(dp[i-1][x-1]+f(x,j)) 用线段树维护dp[i-1][x-1]+f(x,j) 先把dp[i-1][1-n]插入到线段树中,随着j

2017-07-31 12:26:01 341

原创 ARC 064F Rotated Palindromes DP(回文移位,循环节)

题意:给出n,k.问有多少个长度为n的序列a满足:1i.e:1,1,2,2 左移一次-> 1,2,2,1. n,k不考虑移位总共有k^(n/2)个回文,每个都可以操作n次,得到n个合法序列.如何去掉重复的?回文串的循环节肯定为回文.按照回文串的最小循环节长度来更新答案若回文串的最小循环节长度为c,经过c次操作后,得到c个序列当c为偶数时,重复数为一半,奇数时,无重复

2017-07-30 17:38:55 863

原创 HDU 6053 TrickGCD DP(筛法)

题意:给出序列a,a[i]1=2设dp[x]:gcd为x的个数 则b中每个元素都为x的倍数 b[i]若a[i]/d=k贡献为k,则和它相同贡献有cnt[kd,(k+1)d-1]个,则总共贡献k^cnt.最后容斥减掉gcd为jx的部分(j>1).O(nlog^2n)#include using namespace std;typedef long long ll;c

2017-07-27 21:22:50 711 1

原创 HDU 4906 Our happy ending 状压DP

题意:给出n,k,L,问有多少种长度为n的序列,其0n,k某些和最多就20种,状态压一压,第i位二进制为1代表序列和可以为i,设dp[i][s] 长度为i状态为s的方案数.每次加入x(x大于k的数有cnt个 则长度+1,s->s转移到自己就有cnt种方案#include using namespace std;typedef long long ll;const

2017-07-26 18:34:02 374

原创 HDU 4901 The Romantic Hero DP(计数)

题意:n个数a[i],两个集合s,t,s中下标最大的小于t中下标最小的(s的元素都在t元素的左边),问s中元素的异或和等于t中元素的and和的方法数,n,a[i]a[i]这样计算明显有重复,因为1-p  q-n 这两个方案可以在 前缀i,i+1中对应的方案出现(q>>i pd[i][x] 集合s最后一个数为i时异或和为x的方法数,同时处理出前缀i异或和为y的个数来转移状态.则集

2017-07-26 14:18:51 354

原创 HDU 4888 Redraw Beautiful Drawings 最大流(唯一性)

题意:n*m矩阵 告诉每行的和,每列的和,问每个格子只能填0~k时 是否有解,若有唯一解 输出该解.n,m每行i每列j看作一个点,i->j的容量为k 流量就相当于a[i][j]源点连接每行,容量为行和.列连接汇点,容量为列和.若有解 则一定能跑出最大流,(行累加和等于列累加和,源点流出要等于汇点流入) 若残余网络中存在长度大于2的环,沿着环每条边流量++(反向边流量++时,撤销

2017-07-24 17:10:25 358

原创 AGC 018C Coins 贪心(排序)

题意:n个人(n=x+y+z) 每个人有金银铜三种颜色硬币a[i],b[i],c[i]个,问向x个人拿金,y个人拿银,z个人拿铜,只能向每个人要一次,最多能拿到多少硬币? n先考虑每个人只有两种硬币的情况,按照a[i]-b[i]从小到大排序后,因为j>i时 a[j]+b[i]>a[i]+b[j] 任意一个金都应该选在任意一个银之后才能能最优.把c累加进ans,(a,b,c)就转换成(a

2017-07-24 10:34:20 401

原创 Codeforces 825F String Compression DP(最小循环节)

题意:字符串s,s能压缩成c1s1c2s2..cksk时,表示把s1写c1次,s2写c2次...能得到s|s|设dp[i] 前缀i压缩后的最小长度dp[i]=min(dp[i],dp[j]+"s[j+1]..s[i]") 最后一段肯定用最小循环节来表示求出后缀i的next数组时,就能知道i-j(j>=i)最小循环节的长度#include using namespace s

2017-07-23 14:21:40 402

原创 HDU 4870 Rating 概率DP(高斯消元)

题意:初始rating为0,每次比赛有p的概率变为min(x+50,1000),(1-p)的概率变为(x-100,0).0.3S的下一个状态为S'=ax+by,E(ax+by)=aE(x)+bE(y)rating不超过1000 设dp[a][b] rating为a,b时 有一个号等于1000时 参加比赛次数的期望因为每次用较小的一个,比赛的最后一步肯定为(950,950)->(

2017-07-22 18:28:31 374

原创 Codeforces 463D Gargari and Permutations DP(LCS变形)

题意:k个1~n的排列,求这k个排列的LCS.k法1:因为序列为排列,设dp[x]以x结尾能得到最长的LCS.当x出现k次时 说明x能作为结尾 枚举能接在其前面的数即可 O(k*n^2)#include using namespace std;typedef long long ll;const int N=1e3+20;int dp[N],a[N][N],n,k,po

2017-07-22 10:43:50 413

原创 Codeforces 478D Red-Green Towers 构造+DP

题意:用r个红方块和g个绿方块构造高度为h的楼时,要满足第i层有i个方块,并且相同层的方块颜色相同.方块可以不全部用完r,g首先最大高度h(1+h)所以当红色用r个时,剩下sum-x肯定小于等于g 把g按照若干组分割,得到一个合法法案.已知高度h,剩下就考虑那些层涂红色,若红色用了x个 则要知道[1,h]个数中 选某些个数其和为x的方法数并且剩下sum-x个要#incl

2017-07-21 11:29:43 381

原创 Codeforces 341D Vessels 线段树 OR Set

题意:n个碟子,第i个碟子能装a[i]水,若第i个碟子装满,则多余的水流到下一层碟子,下一层依次类推初始碟子为空,m个操作,op1:第x个碟子装p单位水,op2:询问第k个碟子有多少水.n,m法1:第i个碟子装水,二分最远能流到第x个,用线段树将i~x-1置为0.将x置为res-val.(res=sum[i~x])查询时直接query(x,x) O(nlog^2n) #

2017-07-20 11:20:30 391

原创 Codeforecs XOR On Segment 线段树(区间异或,求和)

题意:区间每个数异或X,区间求和,n,m开20个线段树,第i个维护[l,r]内第i位为1的个数即可,ans+=(1lazy标记偶数次时为0.#include using namespace std;typedef long long ll;typedef pair ii;const int N=1e5+20;const ll inf=2e15;ll n,m,a[N];st

2017-07-18 22:58:43 1307

原创 Codeforces 219D Choosing Capital for Treeland DP(Tree)

题意:n个点n-1条有向边,f[x]为把x点设为首都的代价即:要反转多少条边 使得x能达到任意一个城市.n标记边方向后 建立有根无向的树,dfs算出f[1],因为fa,u的f值只差(fa,u)这条边的方向,所以fa和son的f值相差正负1,自顶向下DP一次即可#include using namespace std;typedef long long ll;const i

2017-07-18 14:41:37 307

原创 Codeforces 401D Roman and Numbers 状压DP

题意:给出数n,m.问有多少个x 满足x%m==0 x和n包含相同的数字(无前导0,顺序可以不同)?n最多18位数字,用18位二进制表示当前状态,第i位为1则表示n的第i位数字被使用,答案为dp[(1按最后一个添加进集合的数字转移状态,注意(a[1],a[3]) (a[3],a[1])被重复计算 答案在除以每个数字出现次数的排列.#include using namesp

2017-07-18 13:04:38 326

原创 ARC 061E すぬけ君の地下鉄旅行 最短路(拆点)

题意:n点m条边的线路,每条边有编号c[i],一条路径的代价为:第一条边代价1+该路径上相邻边编号不同的对数.n,m=2e5,c[i]n的最短路?拆点:原图中u-v 编号为c,则在新图中建立u-(u,c)边权值为1,表示换线,同时(u,c)-(v,c)边权值为0则新图中相邻同一条线路花费为0,换一次线总共花费为2,跑最短路ans/2即可.#include using

2017-07-17 12:25:56 1078

原创 ARC 078F Mole and Abandoned Mine 状压DP

题意:n点m条边的无向图,删除第i条边花费c[i],问1到n只有一条路径时所需要的最小花费?n设dp[S][x] 定点1(只经过集合S中的点)只有一条路径到达x时最多能保留价值的边转移dp[S][x]时 要保证1->x路径上所有的边都是Bridge 保留c[x][u] 若其余u->S的边存在,则1->u构成多条路径   集合Y(包含x),则不能存在和S-{x}相连的边

2017-07-16 11:43:22 772

原创 ARC 058E 和風いろはちゃん 状压DP(bit)

题意:长度为N,每个元素为1~10的某一个,总共有10^N种序列,现在给出N,X,Y,Z 问有多少个长度为N的序列满足其有四个下标x,y,z,w 使得a[x]+a[x+1]..a[y-1]=X,a[y]+a[y+1]+..a[z-1]=Y,a[z]+a[z+1]+.a[w]=Z,N若找到四个下标,则剩余元素可以任意.暴力枚举第一个x出现的位置和三段的长度即可确定一类解.因为其余

2017-07-15 16:43:25 3648

原创 Codeforces 831D Office Keys 二分+贪心

题意:n个人在一条直线上,有终点p和k把钥匙,每把钥匙只能拿一次.n,k二分答案,确定时间后能得到每个人拿钥匙的范围区间[l,r],接下来就是判定每个区间是否能配到一把钥匙?因为区间长度相同 左端点排序后 最左区间拿最左钥匙即可.#include using namespace std;typedef long long ll;typedef pair ii;const

2017-07-14 13:21:04 625

原创 ARC 060F Best Representation KMP(循环节)

题意:定义一个字符串合法:当该字符串没有循环节存在,给出string s,令F=(f1,f2..fm) 满足fi为s的某一部分.f1,f2,..fm连起来为s.并且任意fi为合法|s|求最小m 利用next求出最小循环节,若f[i]=1 则m=len,若len%(len-f[len])!=0 则m=1其余有循环节情况,都可以按照前len-1个分一组,最后一个字符分一组 则m

2017-07-12 22:35:45 526

原创 Codeforces 479E Riding in a Lift DP+前缀和

点击打开链接题意:n个点1~n,初始在a点,禁止到b点,操作:每次可以从x到y点,当且仅当x!=y并且|x-y|问k次操作后能得到多少个不同的序列? n,k设dp[j][i] 从i开始,操作j次能得到的方法数mx=|i-b|-1,当mx>=1时:dp[j][i]+= dp[j-1][i-mx~i+mx]用前缀和优化到O(N^2)即可#include using n

2017-07-11 19:32:39 324

原创 ARC 060E 高橋君とホテル 倍增+二分

题意:一条直线上有n个点x[i],x[i+1]-x[i]Q次询问,问从a[j]点跳到b[j]点的最少操作次数?n对每个询问:初始为i 令l=i+1,r=b[j] 二分最远能到达的点 最坏情况下O(QNlogN) TLE..其实每次操作就是把a[i]变到最右边一个满足,r[a[i]]-a[i]每次查询就是求最少的r...r(r(a[i]))>=b[i]设r[k][

2017-07-11 15:41:59 424

原创 Codeforces 400D Dima And Bacteria 暴力+Floyd

题意:n点,m条带权边的无向图,每个顶点属于k类中的某一类,定义合法,同一类中的任意两点存在代价为0的路径,若合法,求出d[i][j]矩阵,表示第i类到第j类的最小代价.n,m同一个类有c[i]个点 则要有c[i]*(c[i]-1)/2条权值为0的路径.相同type转化时,不会经过非0边首先把边权为0两个端点扔到同一个联通分量中,算出该联通分量中每个type的个数,更新该typ

2017-07-11 10:59:08 316

原创 Codeforces 451D Count Good Substring 规律+DP

题意:当融合s中连续相同字符后,s'为回文 则s合法 例如"aabba" 融合后 "aba"给出string s,只包含字符a,b,|s|方法1:设dp[i][0/1] 以i结尾,长度为偶/奇数的合法子串个数.明显s[i]=s[i-1]时, dp[i][0]=dp[i-1][1]因为只有'a','b'两种字符 最后a结尾的回文肯定为 a,aba,ababa,abababa 

2017-07-10 16:54:57 317

原创 Codeforces 514C Watto And Mechanism 哈希

题意:给出n个string,m次询问,判断string s是否和n个string中的某一个正好有一个位置不同.n,m总的字符串长度不超过1e5正好要有一个位置不同,因为不同字符在某个位置上只有两情况,把string插入到set中 暴力枚举位置后查询 O(|s|^2logn) set比较字符串要|s|...TLE..计算string的hash值,插入到set 枚举不同位置

2017-07-10 11:08:36 455

空空如也

空空如也

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

TA关注的人

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