自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Codeforces 501C Rational Resistance 迭代+思维

点击打开链接题意:有无数个单位1的电阻 要求每次用单位电阻和构造的电阻并联或者串联 求阻值为a/b(a,b首先并联总电阻小于任意一个分电阻得:如果当前电阻小于1,则最后步骤为并联,否则为串联迭代直到a或者b==1即可 迭代时发现竟然是求gcd的过程(表示好神奇..),复杂度为O(log(max(a,b)))おもしろい#include using namespace std

2017-02-28 20:31:04 365

原创 Codeforces 257C View Angle 几何(角度)

点击打开链接题意:给出n个点坐标 n因为角度要尽量小,则必然有两个相邻的点落在边界上,分别枚举两个相邻的点作为边界,因为相邻,所以中间无其它点 剩下的角度360-d包含了剩下所有的点. #include using namespace std;const int N=2e5+30;const double eps=1e-6;const double pi=acos(-1

2017-02-28 15:00:15 317

原创 hdu 3065 病毒持续侵袭中 AC自动机入门题

点击打开链接题意:给出母串s长度aho中记录模式串出现次数,用AC自动机进行匹配即可 ac自动机时间复杂度:  假设有N个模式串,平均长度为L;文章长度为M。 建立Trie树:O(N*L) 建立fail指针:O(N*L) 模式匹配:O(M*L) 所以,总时间复杂度为:O( (N+M)*L )。#include using namespace std;typede

2017-02-27 16:30:12 306

原创 Codeforces 510C Fox And Names 拓扑序+判环

点击打开链接题意:给出n个string 每个长度为l,n,lsi和si+1第一个不相等的为u,v.若u!=v 则令边为u->v 表示字母v大于字母u 建好图之后,dfs判断图中是否有环 如果图中无环,最后按照拓扑序输出方案即可 #include using namespace std;typedef long long ll;const int N=2e3+20;v

2017-02-27 15:02:26 265

原创 hdu 6016 Count The Sheep 思维

点击打开链接题意:n男m女 n,m,k首先由于关系只有B-G G-B 所以最后的路径为 G-B-G-B 调换就有(B-G-B-G)  记录boy的friend,和girl的friend个数,枚举第二个人得到第一个人的选法 枚举第三个人得到第四个人的选法 枚举中间两个人 也就枚举了所有的边 复杂度为O(K)将G-B-G-B个数*2即可 #include using na

2017-02-26 19:05:48 278

原创 Codeforces 779D String Game 二分

点击打开链接题意 给出string s,t t为s的子序列,现在按照数组p的顺序,删除s中的字符,求最多删除多少次使得t仍然为s的子序列?如果删除到第i步不成立 则显然删除到j(j>i)肯定也不成立删除到第i步成立 则在往前面也可能成立 二分最多能删除到第x次 记f[i]为s的第i个字符第几次被删除,则f[i]#include using namespace st

2017-02-26 18:40:00 333

原创 Codeforecs 493C Vasya and Basketball 贪心+二分

点击打开链接题意:有a,b两队人数为n,m枚举b队得2分的人数为x 则d设置范围为b[x]~b[x+1]-1之间 显然在这之中取最小,使得a得三分的尽量多,在a二分找到最后一个#include using namespace std;typedef long long ll;const int N=2e5+20; ll a[N],b[N];int main(){

2017-02-25 13:58:32 393

原创 hdu 2896 病毒侵袭 AC自动机入门题

点击打开链接题意:给出若干个模式串n建立字典时 把单词结尾设为编号,设p[i]为模式串是在某个母串中出现,对每个母串跑AC自动机即可 #include using namespace std;typedef long long ll;const int N=201*500; int flag;struct Aho{ int chd[N][128],v[N],f[N],las

2017-02-25 12:38:22 308

原创 Codeforces 777C Alyona and Spreadsheet DP

点击打开链接题意:n*m数组 n*m明显DP,dp[i][j] 第j列以i行开头的最长递增长度 dp[l][j]>=r-l+1 ? n*mb[i][j] 保持每行最大的解 每次判断best[l]>=r-l+1即可#include using namespace std;typedef long long ll;const int N=2e5+20;int a[N],

2017-02-24 21:12:29 382

原创 hdu 2222 Keywords Search AC自动机模板题

点击打开链接题意:给出母串S 长度小于1e6 ,和字典, 问s中出现的dic单词有多少个?KMP是当字典中单词个数为1的情况 若单词个数很多 则复杂都O(n*m)显然不行 于是AC自动机就来啦~参考AC自动机=KMP+TrieAC自动机主要就3个部分:     1 把所有模板插入到Trie中,建立大的状态转移图 2 建立失败指针:    根结点的失败指针指向自己

2017-02-24 17:07:09 282

原创 Codeforces 776D The Door Problem 二分图判定

点击打开链接题意:n个开关,m扇门(n,m注意到一个门只被两个开关控制 若门初始为0 则控制它的两个开关状态相反,门初始为1则 要求控制的两个开关状态相同,才能可以把门置为1.以开关为顶点,(u,v)的边为被(u,v)控制的门的初始状态, dfs做二分图染色,判断每条边(每扇门)是否都能被满足即可#include using namespace std;typedef lo

2017-02-24 14:04:27 657

原创 Codeforces 776C Molly's Chemicals 前缀和

点击打开链接题意:给出n个数,|ai|线段最大和为1e14,k最多开50次幂吧2^40 -1只有1,-1求区间和为x的个数,枚举右端点,合法的左端点l满足,满足前缀和l=pre[r]-x,用map保存前缀和为i的个数即可 #include using namespace std;typedef long long ll;const int N=2e5+20;cons

2017-02-24 13:53:03 378

原创 Codeforces 415D Mashmokh and ACM DP

点击打开链接题意:长度为l的合法序列为 bi|bi+1 &&bi一开始想用逆事件,至少有一个不合法的个数来算 结果有些序列被重复计算,于是还是正面求解吧....dp[k][x] 长度为k的序列 开头为x时的合法个数dp[k][x]=sigma(dp[k-1][y]) y>=x &&x|y y为x倍数所以时间复杂度为 O(knlogn) #include using

2017-02-23 09:22:14 401

原创 Codeforces 165C Another Problem On Strings 尺取 Or 前缀和

点击打开链接题意:给出串s,长度尺取:以l为左端点成立的子串,若第一次在r成立 最后一次在y成立(r后的第一个1在y+1) 则个数为y-r+1第一次在r成立,[l,r]成立 [l+1,r-1]肯定不成立  dp记录i后的第一个1 复杂都为O(2*n)#include using namespace std;typedef long long ll;const int

2017-02-22 14:19:22 308

原创 Codeforces 467C George and Job DP

点击打开链接题意:n选一条线段和最大 ai非负,长度肯定要最长 前i个,选a[i]时,a[i]为最后一段的末尾dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+C) #include using namespace std;typedef long long ll;const int N=5e3+20;ll a[N],p[N];ll dp[N]

2017-02-21 15:56:40 328

原创 Codeforces 340C Tourist Problem 数学+DP

点击打开链接题意:固定起点是0,给出一个序列表示n个点,所有点都在一条直线上,其中每个元素代表了从起点到这个点所走的距离。已知路过某个点不算到达这个点,则从起点出发,到达所有点的方案有许多种。求所有方案走的总路程/方案数,输出分子、分母,要求不含约数容易得到方案数为n!,n求总的路程和,考虑边的出现次数:(0,ak)(n-1)! ,多少条路径包含边(u,v) 从(n-1)个位置

2017-02-21 14:45:38 389

原创 Codeforces 768C Jon Snow and his Favourite Number 构造

点击打开链接题意:n个数字 k次操作(n,k注意到每次操作时都将数组排序,ai,x令f[y]为y的出现次数 只要知道每次多少个y保持不变 多少个y变为y^x 重复k次后,求出答案 O(k*1024) #include using namespace std;typedef long long ll;const int N=2e5+20;int n,k,x,a[N

2017-02-21 08:52:48 341

原创 Codeforces 768B Code For 1 二分+区间查询

点击打开链接题意:给出n1 则把n变为n/2,n%2,n/2,问[l,r]内1的个数?f[n]为n展开后得到的数字个数: f[n]=2*f[n/2]+1 迭代化解得到 f[n]=2^(log(2,n)+1)-1d[n]=n%2+2*d[n/2] d[1]=1,容易归纳得到n展开后会得到n个1 要求查询的区间为[l,r] 从起始区间(n,1,1+length(n)-1

2017-02-21 06:04:54 762

原创 POJ 2096 Collecting Bugs 概率DP(期望)

点击打开链接题意:n种病毒,s个系统 每次能在某个系统下发现某个病毒,求发现n种病毒&&每个系统至少发现一个病毒所需要的期望次数? 令d[i][j]表示当前发现了i种病毒&&发现j个系统中至少有一个病毒时,离目标(n,s)所需要的期望次数然后根据E(aA+bB+cC+dD+...)=aEA+bEB+....;//a,b,c,d...表示概率,A,B,C...表示状态  

2017-02-20 17:35:31 351

原创 Codeforces 219C Color Stripe 贪心

点击打开链接题意:给出一个字符串,只包含k种字符,问最少修改多少个字符(不增长新的种类)能够得到一个新的字符串,这个字符串满足相邻的字符没有相同的。最多有n-1对要修改,当k>=3  s[i]!=s[i-1] 则修改s[i]最优,因为可以消去的对数>=1当k==2时 AAB,BBB 显然无法贪心 因为k==2的合法情况只有"ABABAB","BABABA"统计错误少的方案输出即

2017-02-20 13:49:29 659

原创 Codeforces 118D Caesar's Legions DP

点击打开链接题意:a个1,b个2 问连续的1不能超过c&&连续的2不能超过d的方法数(a,b最后一个数要么为1或者2 则设计状态dp[a][b][1 or 2][c or d],前a个1和前b个2 末尾连续k个1或者2个的方法数 dp[a][b][1][k]= segma dp[a-k][b][2][1~min(b,d)]    (...2,1..111)#include u

2017-02-19 18:09:39 285

原创 hihoCoder 1151 骨牌覆盖 递推+矩阵幂

点击打开链接题意:3*n棋盘 用1*2骨牌覆盖 用方法数 ?(n最后一列有三个 每格是否被覆盖,转换成8种状态设矩阵M[i][j] 增加一列后,最后一列的状态从i->j的方法数 (使得前面列都填满)A[i][j]前0列最后一行为i->j的方法数  则最后答案为A*(M^n) :A[7][7]#include using namespace std;typedef lon

2017-02-19 11:50:57 367

原创 Codeforces 767"B" The Queue 模拟

点击打开链接题意:给出n个人的到达时间,总的服务时间为[s,e],每个人的需要t秒服务时间,问选择一个时间到达使得等待时间最少?先计算等待时间需要0 只能为[S,E]中间有free时 选择free到达即可否则 先计算第i个人的开始服务时间b[i]   b[i]=b[i-1]+t枚举成为第i个人被服务 则到达时间最晚为a[i]-1 等待时间最少则为:b[i]-(a[i]-1)

2017-02-19 10:14:33 499

原创 UVA 861 Little Bishops 组合数学

点击打开链接题意:n*n board,对角线棋子相互攻击,问放k个棋子的合法方案首先想到黑白棋盘根据(i+j)的奇偶性上色,容易得出白色区域不会攻击黑色区域则在白色区域中放i个 黑色区域中放k-i个 如何转化成同行同列相互攻击?将棋盘顺时针旋转45°则攻击方式则由对角45°变为垂直和水平,之后dp求解即可 #include using namespace std;t

2017-02-18 17:00:49 349

原创 Codeforces 246C Little Girl And Maximum 差分

题意:n个数,m次询问 n,m最后的累加和可以写为:ans=segma(a[i]*f[i])每次询问l,r时 如何快速计算f? 用线段树区间更新使f[l]~f[r]同时加上1,最后单点查询计算出f,比较麻烦利用差分,每次更新时:c[l]++,c[r+1]-- 最后计算i的前缀和,即可求出i被包含在多少条线段(询问)中啦 ai因为a[i]·b[j]+a[j]·b[i]-a[i

2017-02-18 14:08:37 582

原创 hihoCoder 1142 三分求极值

点击打开链接三分法介绍    在区间内用两个mid将区间分成三份,这样的查找算法称为三分查找,也就是三分法,三分法常用于求解单峰函数的最值。   二分法适用于单调函数,而单峰函数用二分明显不太好了,对于有些单峰函数,可以求导后转化为单调函数,从而使用二分,然而很多情况求导是很麻烦的,这时就需要用到三分了题意:给出抛物线y=ax^2+bx+c 和点(x,y

2017-02-18 11:20:27 486 1

原创 Codeforces 339D Xenia and Bit Operations 线段树

点击打开链接题意:输入n和m分别表示有2^n个数和m个更新,n,m明显线段树 由于xor和or运算是交替进行的 只要保存子区间的运算方式,即可知道该结点是用那种运算啦#include using namespace std;typedef long long ll;const int N=2e5+50;int a[N];struct node{ int l,r; in

2017-02-17 19:36:01 598

原创 POJ 1201 Intervals 差分约束系统

点击打开链接题意:给出n个线段[ai,bi] n=ci  首先设S[i]表示 集合Z中小于等于i的元素个数 则条件可以转换为 S[bi]-S[ai-1]>=ci条件转化为S[ai-1]-S[bi]若答案为M,则S[mx]-S[mn-1]>=M -> S[mn-1]#include #include #include #include using namespac

2017-02-17 16:51:06 265

原创 Codeforces 430C Xor-Tree DFS,奇偶性

点击打开链接题目大意:给你一棵有n个节点的树,每个节点的value为0或1,给你初始value和目标value,对于每个节点可以执行一种操作:将该节点的value变为相反的即0变为1,1变为0,同时给节点的孙子节点,孙子节点的孙子都变反。问,最少进行多少次操作可以将初始value变为目标value,输出操作次数和需要更改的节点。操作次数最少,明显从上往下修改, 如何判断一个点是否受祖先

2017-02-16 20:01:33 489

原创 Codeforces 765D Artsem and Saunders 构造

点击打开链接题意:给出n 和 f[]  求出函数g,h  满足 g[h[x]]=x && h[g[x]]=f[x]   h定义域为1~m 值域为1~ng[h[g[x]]]=g[f[x]]=g[x]g[x]=g[f[x]]  -> h[g[x]]=f[x]=h[g[f[x]]]=f[f[x]]  得当两个等式成立即有解时:有f[x]=f[f[x]]构造f[x]=f[f[x

2017-02-15 15:11:39 556

原创 Codeforces 284C Cows and sequence 构造 or 线段树

点击打开链接题意:m个操作 m前两个操作容易实现 只要记录sum和个数即可, 由于最后一个操作,还需要知道当前数列中最后一个数的值.设add[i] 前i个数同时加的add[i] ,只有求最后一个元素才有需要用到add.前面没有需要的先不更新add每次删除最后一个元素时 将它的add[i]传递给add[i-1] 则add[cur]就等于add[cur~ed] , a[cur]=a

2017-02-12 23:38:44 269

原创 Codeforces 225C Barcode DP

点击打开链接题意:n行m列(n,m最后一列要么为'.' 或者 '#'  容易想到DP,d[i][2]:把前i列变为合法&&最后一列为'.'||'#'的最小代价按和最后一列颜色相等长度k=x~y转移,d[i][0]=min(d[i-k][1]+f[i-k+1~i][0]) #include using namespace std;const int N=2e3+20;con

2017-02-10 16:27:55 315

原创 Codeforces 149C Division Into Teams 构造

点击打开链接题意:n个人(n构造即可:按价值排序后 奇数号给x,偶数号给y(天平倾斜向每次选人的那一边)每轮两边差为a[i]-d d>=0 所以两边差始终#include using namespace std;const int N=2e5+20;int n;pair a[N];vector x,y;int main(){ while(cin>>n) {

2017-02-10 15:16:19 340

原创 Codeforces 265 Escape from Stones 思维(极限)

点击打开链接题意:n块stone 初始l=0,r=1 stone总是落在k=(l+r)/2,如果s[i]=='l' 则端点变为:[l,k]否则端点为[k,r],问从左到右stone的编号n每次把线段分成两段A,B 每次进入其中一段后,在也不会进入另外一段 容易发现:如果s[i]=='l' 则stone i的位置比stone i+1~n 都大如果 s[i]=='r'  则st

2017-02-09 21:24:15 675

原创 Codeforces 427C Checkposts 强连通分量(tarjan)

点击打开链接题意:n个点,m条(n思路:设置点最少:对于同一个强连通分量只要设置一个点即可,钱最少选出每个强连通分量中最小的c[i],方法数为每个SCC中最小c[i]个数的乘积.资料Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一颗子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以盘对栈顶到栈中的节点是否为一个强连通分量

2017-02-09 11:51:22 480

原创 Codeforces 766C Mahmoud and a Message 基础DP

点击打开链接题意:给定string s 长度ndp[i] 前i个字符的分解方案,按照最后一段的长度来转移最后一段长度为j && "i-j+1~j"合法 dp[i]+=dp[i-j] f[i] 前i个字符的分解的最少个数 f[i]=min(f[i-j]+1)#include using namespace std;typedef long long ll;c

2017-02-08 04:05:51 713

原创 Codeforces 385C Bear and Prime Numbers 筛法

点击打开链接题意:n个数,m次询问,每次询问给出[li,ri],S[li,ri]为li~ri的素数,f(p) ai满足p|ai的个数,问segma(p∈S[li,ri]) f(p)的值?n接下来只要快速求出 f[li~ri]的和,利用前缀和即可 #include using namespace std;typedef long long ll;const int N=

2017-02-07 16:15:22 339

原创 Codeforces 459C Pashmak and Buses 可重集排列

点击打开链接题意:n名学生,k辆bus,每个stu坐d次车,要求任意两个学生的乘车序列不能相同(顺序不同就算不同),输出可行方案学生的乘车序列为:d天中乘坐bus的编号序列. n,d有解:只要k种bus中选d个的排列数量>=n即可 法1: dfs暴力生成排列法2:1111..~kkk.. 把排列看成d位(k+1)进制数 模拟高精度加法 生成前n个排列即可 O(nd)

2017-02-06 00:01:21 363

原创 AGC 010 B Boxes 思维题

点击打开链接题意:n块box排成一个环(n=拿走的石头问能否存在有限个操作使得所有box的石头变为0先看必要条件:每次操作使得总的stone减少n(n+1)/2,stone的总数必须为n(n+1)/2的倍数假设有解:操作次数k=sum/(n(n+1)/2),设di=a(i+1)-a(i) 每次操作会使得di减小1 i为开头->di增大n-1,k次操作后di为0则 di-(k

2017-02-05 12:39:34 340

原创 Codeforces 339C Xenia and Weights DP+打印路径

点击打开链接题意:有weight 1~10砝码无限个,每次放的砝码不能相同&&当前放完砝码的一边重量大,问能否放m个砝码若能则输出解(m错误解法greedy:每次使大的一边减去小的一边尽量小,容易举出反例:2,3,6,10 greedy只能算到9 ans为1000记balance为 sum(l)-sum(r) 依题意每次操作后,balance变号. dp[i][j][k]

2017-02-03 21:25:07 381

空空如也

空空如也

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

TA关注的人

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