自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C_z_Q

ACM Retired

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

原创 PAT 甲级 1016 Phone Bills.[模拟排序]

题意: 1.先给了 242424 个数表示 242424 小时每个小时内通话的费用, 单位为 美分/分钟 2.给了 N(≤1000)N(≤1000)N(\leq 1000) 条记录,记录格式为 [姓名][月:日:小时:分钟][on/off-line], 表示这个人在这个时间开始/结束通话。对于同一个人,每个开始通话记录与在它之后时间最近的结束通话记录相匹配,结束通话记录同理,一对匹配构成一次...

2018-05-26 23:26:56 344

原创 Gym 100825 G - Tray Bien[状压dp]

题意: 给定一个 3∗m3 * m的矩形,现在你有两种砖块1∗1,1∗21*1,1*2,有一些位置是不能放的,问有多少种放法使除了不能放的位置外全部放满。分析 : 很经典的状压dp,只是加了一些不能放的位置,题目输入使浮点数,我们直接取整表示这个格子不能放。然后就是一些状态的转移。以下是代码:#include<bits/stdc++.h>using namespace std;#define u

2017-10-18 23:00:24 547

原创 Gym 100825 H - Trick Shot[计算几何]

题意:给了一场长www,宽lll的台球桌,以桌子左下为原点,给了1,2,31,2,31,2,3三个球的坐标,给定了球的半径rrr和白球的纵坐标, 问是否可能白球撞到111号球,111号球撞向333号球使其进入右上角。白球撞到111号球后撞向222号球使其进入左上角,如果可能,输出白球的起始横坐标和发射方向与x轴正轴的夹角度数。分析:我们反过来推,通过右上角的点P(w,l)P(w,l)P(w,l) 和

2017-10-18 22:49:09 427

原创 Gym 101161 G - Binary Strings[矩阵快速幂][dp]

题意:问长度在 [L,R][L,R] 之间的,且长度被 KK整除的,且仅包含 00 和 11 的,且不包含连续 11 的字符串的个数。其中 1≤L,R≤1018,3≤K≤1091 \leq L,R \leq 10^{18}, 3 \leq K \leq 10^9 分析:考虑dpdp,dp[i][0/1]dp[i][0/1]表示长度为 ii ,最后一位字符是 0,10,1的字符串个数。 转移:dp

2017-10-11 21:00:53 488

原创 Gym 101161 E - ACM Tax[主席树][lca]

题意 : 给定一颗 NN 个点的树,每条边都有一个边权 ww ,然后是 QQ 个询问,每个询问包含 一组 (Ai,Bi)(A_i,B_i) ,问点AiA_i到点BiB_i的所有边权的中位数。 其中 2≤N≤5∗104,1≤Q≤1052 \leq N \leq 5*10^4, 1 \leq Q \leq 10^5 分析:求中位数就相当于求区间第KK大。考虑主席树,每个节点根据他的父节点的信息建树

2017-10-11 20:30:57 374

原创 HDU 6005 Pandaland[最小生成树][LCA]

题意:给定 MMM 条边,找一个路径最短的环,如果不存在环,输出 000。(1≤M≤4000)(1≤M≤4000)(1 \leq M \leq 4000)分析:通过观察可以发现,最短的环一定是在这个图的最小生成树上。 这样,我们可以通过枚举不在树上的边,求树上这条边的两点间距离,加上边的权值并取个最小值即可。 需要注意的是,题目给你的图可能有多个联通块。以下是代码。#include<bits/

2017-10-06 19:51:41 587

原创 Gym 101243 I Land Division[计算几何]

题意:顺时针顺序给定一个NN个点的凸多边形,问是否能用一条线段将其分成一个MM边形和一个KK边形,如果能输出最短线段的长度,如果不能,输出−1-1。其中3≤N,M,K≤1003\leq N,M,K \leq 100。分析:通过观察我们可以发现,存在解的情况只有三种 : 1.N+2=M+K。1.N+2 = M+K。 2.N+3=M+K。2.N+3 = M+K。 3.N+4=M+K。3.N+4=

2017-10-04 23:08:22 360

原创 Gym 101484 F No Link, Cut Tree![完全二叉树][st]

题意: 题目给了一个nn个点的完全二叉树,每个节点都有他的价值ww 定义这棵树的价值为:每一个深度的价值为这个深度所有节点的价值总和,树的价值为 所有深度中价值最大的。 然后有mm个询问,每个询问是一个节点uu 问删去以他为根的子树后,树的价值为多少。 数据范围:1≤n≤1e5,1≤m≤1e5,1≤w≤1e41\leq n \leq 1e5,1\leq m \leq 1e5,1 \leq w

2017-10-03 14:28:19 540

原创 Gym 101484 I Matrix Sum

题意:题目给了一个矩阵 AAA 的定义: Aij=∑Nk=1(Mik+Mkj)−MijAij=∑k=1N(Mik+Mkj)−MijA_{ij}= \sum_{k = 1}^{N}(M_{ik} + M_{kj}) - M_{ij} 其中 MMM 是一个仅由 0 和 1 组成的矩阵 问,给定一个 n∗n(1≤n≤1e3)n∗n(1≤n≤1e3)n*n (1 \leq n \leq 1e3) 的

2017-10-03 12:37:00 419

原创 Codeforces 827A/828C String Reconstruction[线段树单点更新]

题意:给了你n个字符串,然后说明这个字符串在什么位置出现了,然后让你输出字典序最小的答案.分析:1.首先是答案的长度,因为长度约小字典序越小。所以长度取,给定的n个字符串出现的最大的(位置+len(i)-1);2.如何把给定的字符串更新上去, 因为题目保证没有矛盾,所以更新过的点就不用再更新了,这样我们用一个vis数组,表示当前区间是否已经完全更新完,如果更新完了就不管了,没更

2017-07-12 16:03:22 885 2

原创 Codeforces 827C/828E DNA Evolution[树状数组]

题意:给定一个只包含A,T,C,G的字符串,有如下两种操作1)修改一个点的字母2)给定一个字符串e (strlen(e) 思路: 对每个字母建立10 * 10个树状数组(前面的10表示e的长度,后面表示mod e的长度后的值),表示区间中膜len(e) 结果为 k = (0...len(e)-1)的个数。查询的话,对于给定的e 查询对应len(e)的树状数组比如给定 e

2017-07-12 15:56:03 1088

原创 Codeforces 812C Sagheer and Nubian Market[二分]

题意:给了n个物品,每个物品的价值为ai,你可以选取其中的k个,代价是k个ai的和加上他们的下标乘k的和。问,在给定最大代价S的条件下,最多能取几个,取的最多的情况下,代价是多少。分析:对能取几个进行二分,每次判断的时候,将原来的数组对ai+i*mid排序,取前mid个,看是否大于S。以下是代码:ll n, s, ans1, ans2;struct lx { l

2017-06-02 13:06:46 692

原创 Codeforces 812B Sagheer, the Hausmeister[dp]

题意:n层楼,每层楼有m个房间,m个房间的左右两边分别是楼梯。每个房间0表示灯关着,1表示灯开着,走一格需要一分钟,问最少需要几分钟把所有的灯都关了。分析:我们先预处理出每层楼最左边的灯在什么位置,最右边的灯在什么位置,然后dpdp[i][0]表示走到第i层的左边楼梯处,且i层以下的等全灭的最少时间,dp[i][1]则是走到第i层右边楼梯处的答案。我们找出等未关的最高的楼层,再上面还有

2017-06-02 12:58:49 518

原创 Codeforces 812A Sagheer and Crossroads[模拟]

题意:(这题关键就是理解题意了。。) 1. p[i]为1的时候,如果当前方向也有1,是会发生事故的,2. p[i]为1的时候,其他方向开向 i 的路上也有1,也会发生事故。以下是代码:int l[5], s[5], r[5], p[5];int main() { for (int i = 1; i <= 4; ++i) { scanf("%d%d%d%d", &l[

2017-06-02 12:47:10 501

原创 Codeforces 811E Vladik and Entertaining Flags[线段树][并查集]

题意:给了一个n*m的矩阵,上下左右相同数的点可以并为同一个联通块,对于每个询问L,R 输出(1,L) ... (n,R)的块中有几个联通块。分析:用线段树维护每列的状况,一个sum表示这一块的联通块个数,L[i],R[i]表示这块中第i行左边的标号,右边的标号,标号用来表示属于哪一个联通块。每次合并,先是sum相加,一行行判断是否能合并成一个联通块,如果左右数值相同,而且,左右标

2017-06-01 10:37:43 729

原创 Codeforces 811D Vladik and Favorite Game[模拟][bfs]

题意:说有四个按钮 L,R可能是反的,U,D可能是反的,然后对于你每次输出的(L,R,U,D),会返回一个坐标,到达给定的F 的位置停止。分析:关键就是判断L,R 是否是反的,U,D 是否是反的,刚开始的位置是(1,1),贴墙的,为了防止走到 * 上,我们可以找一个右边是空的位置,然后输出一个L,如果在原地,那么说明 不反,如果到了右边,说明反了,对于U,D 也同样,知道反没反之后就是

2017-06-01 10:26:18 377

原创 Codeforces 811C Vladik and Memorable Trip[dp]

题意:给了一串长度分析:我们可以先预处理出每个数第一次出现的位置st,最后出现的位置ed,还有区间的异或值sumdp[i] 表示到了 i 之前的序列的答案为多少。每次在ed的位置转移,判断其中是否有数的ed比现在大,如果大,跳过。没有的话,找其中最小的min_st,dp[i] = min(dp[i-1],dp[min_st - 1] + sum[min_st][i]);

2017-06-01 10:18:49 400

原创 Codeforces 811B Vladik and Complicated Book[主席树]

题意:给了一串长度为n的序列,每个数都不相同,随后是m个询问,L R K 问将[L,R]中的数从小到大排序后,原来第K个数是否还是第K个。分析:用主席树维护这个序列,对于每个询问,查询这个区间里比a[K]大的数的个数Q,如果R - Q == k 输出 Yes。具体见代码。以下是代码。struct { int lc, rc, sum;}st[MAXN * 40];i

2017-06-01 10:11:11 539

原创 Codeforces 808G Anthem of Berland[dp][kmp]

题意:给定一个包含?的字符串A,还有一个字符串B,问B最多可能在A中出现几次。分析:dp  dp[i] 表示0-i的字符串最多能出现几次Bcnt[i] 表示最后一次出现的 B 以 i 结尾 0-i中最多能出现几次B转移:为了转移,我们还需要一个next数组首先将dp[i] 赋值为 dp[i - 1],O(lenB)判断是否能以当前位置结尾,(如果有一个位置字符不相同

2017-05-25 17:41:54 1067

原创 HDU 6031 Innumerable Ancestors[树链剖分]

题意:给定一颗n个节点的树,然后是m个询问,每个询问是两个集合,问分别在这两个集合中取一个点,这两个点的LCA 的深度最大为多少。分析:首先想到的肯定是for两个集合,O(k^2),肯定要爆炸。我们对这棵树进行树链剖分,剖完之后的树最多有logn条链,那么,我们将这两个集合中的点,根据他们所在的链分类,如果两个点位于同一条链,我们取深度更深的那个点,这样处理之后,每个集合中最多只有logn个点

2017-05-08 10:19:00 356

原创 HDU 6030 Happy Necklace[找规律][矩阵快速幂]

题意:问一个长度为n,由R和B构成字符串,在每个斐波那契长度的子串中,R的个数不少于B。分析:直接搞不知道怎么搞,然后就手动打了打表,,打到了8,找了一个多小时= =。最后发现规律是 a[n] = a[n - 1] + a[n - 3];因为n有1e18,所以还需要矩阵快速幂加个速。以下是代码:#include#include#include#includ

2017-05-08 10:06:52 318

原创 HDU 6029 Graph Theory

题意:有n个点,对于每个点有两种操作,(1)  跟他之前的点都连一条边。(2) 不做操作。现在对于每个点都给定了操作,问能否从中选取几条边,每条边都没有公共端点,而且n个点都被边覆盖。分析:首先,很容易想到,当n为奇数的时候,答案肯定是No。  然后是偶数,取一个cnt表示到当前,前面还有几个点没有连边,for一遍就好。以下是代码:#include#include

2017-05-08 09:56:18 725

原创 HDU 6024 Building Shops[dp]

题意:给定n个点(n分析:dp[i]表示最后取的点为 i 时的最小代价,那么转移的话就是dp[i] = min(dp[i],dp[j]+sum[i - 1] - sum[j] - x[j]*(i-j-1) + w[i]);其中,sum[i]为1-i的所有点的坐标之和,复杂度为O(n^2),好像能通过斜率优化到O(n),目前不会,,回头再补。以下是代码。#includ

2017-05-08 09:49:28 517

原创 浙江14届省赛 F.Heap Partition(ZOJ 3963)[贪心][二分]

题意 : 构造尽可能少的一种结构,父节点的值小于等于子节点,而且子节点在序列中出现在父节点后面。而且每个父节点至多有两个子节点。分析 : 贪心即可,首先,我们先对这个序列排个序,得知每个数的rank 然后对原序列从左到右遍历,维护一个set,存的是这个数在原序列中的位置, 对于每个数,如果set空,那么直接insert,如果不空,用lower_bound 找出这个数之前的最大的小于等于他的数,

2017-04-23 10:40:55 1006

原创 浙大17年校赛(ZOJ 3956)Course Selection System[01背包]

题意:给了n个物品,每个物品有两个值,H和C 问你怎么取, 使最后这个东西最大。分析:dp[i] 表示 取到C的总和为i的时候 使答案最大的 H的和为多少,剩下就和背包差不多了,需要注意的是dp值的初始化,需要取成-inf;以下是代码:#include#include#include#include#include#include#include#in

2017-04-10 08:32:41 1464

原创 浙大17年校赛(ZOJ 3953) Intervals[贪心]

题意:给了n个区间,要求你删去最少的区间,使任意三个区间 a,b,c 不存在 a与b相交,b与c相交,c与a相交 的情况。分析:比赛时候看到这题,还以为要用什么高深的数据结构,出来听他们说贪心后马上就想到了思路,,还是太菜了。。首先,我们先将n个区间按x从小到大,再y从小到大排序,然后遍历,如果三个区间满足 上述的情况,那么我们将y最大的删去,y相等将x最小的删去。过程中维护两个区间t

2017-04-10 08:16:39 1579

原创 Codeforces 786C Till I Collapse[主席树][二分]

题意:给你n个数,问最少能把这n个数分成连续的几段,且每段中不同的个数小于等于k个,输出k从1到n的答案。分析:我们知道i~(i,,,n)的不同数的个数肯定是递增的,所以对于每个i,我们可以通过二分得出一个最大的j使[i,j]中不同的数个数我们可以利用主席树,以root[i]为顶点的线段树存的是,[i,n]中不同的数个数,对于每颗树,将每个第一次出现的数的位置 置为1,其他重复出现

2017-03-24 17:04:27 1147

原创 Codeforces 771B Bear and Different Names[构造]

题意:现在需要给n个东西命名,任意连续k个不能有相同名字,给了n-k+1个连续名字的满足情况"YES"or"NO",第i个YES表示从i开始连续k个名字是互不相同的。分析:问题在于我们如何构造出一个满足条件的n个名字,首先,我们先构造出n个互不相同的名字,首字母大写,然后看要求,如果是"NO“,令ans[i+k-1] = ans[i],这样,我们到下一个要求的时候刚开始还是两两互不相同的。知道

2017-03-19 17:42:58 702

原创 Codeforces 771A Bear and Friendship Condition[并查集]

题意:给了你一张图,问是否 对任意的A,B,C,有A-B 和A-C的话,同时有B-C 分析:其实就是每个块都是一个完全图,n个顶点的完全图有n*(n-1)/2条边。用并查集统计每个块有几个点,几条边。需要注意的是n*(n-1)/2这里是会爆int的,需要用longlong(心痛。。以下是代码:#include#include#include#include#include

2017-03-19 17:35:59 831

原创 Gym 101149M Ex Machina[线段树]

题意:这是CF上的一道交互题,他给定了一个长度为n的数组,要求你用小于n+24次询问找出第二大的数的标号。分析:这个题的思路我看了别人的代码才想明白,刚开始我是想自顶而下建一棵搜索树,但发现询问至少nlogn,又想到维护第一第二大,又发现至少2*n,就是没想到线段树。一个[1,n]区间的线段树的节点数有2*n-1个,除去叶子节点,我们需要pushup的节点就有n-1个,那么,我们就

2017-03-06 11:17:26 517

原创 Gym 101149L Right Build[BFS]

题意:给了一个可能有环的n+1(思路:我们可以先预处理出n到每个点的距离,然后再处理出a和b到每个点的距离,最后枚举每个点求出最小的答案就行了,这里处理只能用BFS,DFS会TLE,还有一个坑点就是点的标号是(0~n)下面是代码部分:#include#include#include#include#include#include#include#inclu

2017-03-06 11:11:56 429

原创 Codeforces 85D Sum of Medians[线段树]

题意:给了一个set,有n个操作,有三种操作1. add  x 把 x 放入set中;2. del  x 把 x 从set中删去;3. sum 求set中,第n大的数,n%5==3,的总和。分析:因为x有[0,1e9],所以肯定要离散化处理,刚开始我的思路是线段树存当前区间的个数,然后每个sum去二分[1,m]有余5是3的个数的值,发现还是会T。正解是:每个线段

2017-03-02 17:52:14 520

原创 Codeforces 768B Code For 1[DFS]

题意:给你一个小于2^50的数,每次将这个数分成三个数 x/2,x%2,x/2,直到剩下的数全是0,1,然后给你一个询问L,R,问你这个区间里面1的个数有几个。分析:通过观察可以发现,给你一个数n,分解后这个01串的长度为比他大的2^k-1,然后0只会出现在x%2的位置。所以,一开始,我们将ans设置成R-L+1,每次dfs,取一个中点mid(因为x%2只会出现在中间)如果当前n%2==0 而

2017-02-21 13:17:39 454

原创 Codeforces 767C Garland

题意:给你一颗有n个节点的树,每个节点都有一个值,问你是否能删去两条边使删后的三块值的和都相等。分析:首先,要使三块和相等,总和sum%3一定是0的。这样我们先用一个dfs求出每个节点的子树的值的总和,再遍历一遍找值是sum/3的节点,因为删去的两条边的节点可能有两种情况,一种是一个是另一个的祖先,另一种是一个和另一个没有关系,所以我的做法是找到sum/3的节点,先放到一个vector里面,再

2017-02-19 12:28:34 1932

原创 Codeforces743D Chloe and pleasant prizes[树形DP]

题意:给你一棵以1为根的树,问截取他的两棵子树,这两棵子树上的节点的值全加起来的最大值为多少,并且这两棵子树不能有公共的节点。如果不存在这样的两棵子树,输出"Impossible".首先是不存在的情况,当给出的一棵树为一条链的时候就是不存在的。然后就是如何求值,我们把选子树看成选择树上的一个节点u,那么我们就需要以u为根的树上的点值的总和,我们用一个数组cot存,其次,因为要求最大

2016-12-16 18:31:18 463

原创 HZNU2016年校赛 J.Lakes in HZNU[DFS]

(首先是废话....这道题比赛过程中改过很多次,,也可能是我英语太搓,,导致你们没读懂题意.....写了篇题解,,骗访问量..题意:给定了一个n*m的矩阵,矩阵上的每个点是由'*'或者'.'组成,问有几个是由'.'组成的联通块,且这个连通快不能跟矩阵外相连,,为了更好的说明题意,我给出几个样例input1:3 3*.**.****output1:0input2:

2016-12-04 19:29:39 714

原创 Codeforces 721D Maxim and Array[贪心]

题意:给定n个数,每个数的绝对值小于1e9,需要进行k次操作,每次操作可以使一个数+x或-x,问k次操作之后每个数相乘结果最小的n个数。思路:首先当n个数中有奇数个负数,那么当前乘积已经是负数了,我们只要对绝对值最小的数加或减得到的结果就是最小的,用一个优先队列处理。当n个数中只有偶数个负数时,我们可以选择把绝对值最小的那个数变正,或负,如果k不够,那么直接在这个数上处理k次,得到的结果也

2016-10-01 18:45:59 315

原创 2016 acm香港网络赛 F.Crazy Driver[贪心]

题意:直线上有n个站点,每个站点间有一条路,这样就是n-1条,每条路都有一个过路费v,每个站点都有一个开放时间t,大于等于t才能通过,问在司机不停的情况下最少要花费多少通过所有站点思路:比赛时一直想着当时间能通过这个站点的时候就通过,就处理不了最少的了。应该是,通过每个站点,不足的时间在之前花费最少的路上跑来回,答案就出来了。#includeusing namespace std;

2016-09-13 21:19:22 1682

原创 2016 acm香港网络赛 D.Curious Cupid[莫队算法]

题意:给你两串数,一串代表男的,一串代表女的,每个数代表这个人说的语言,现在要给一个区间[L,R]里面的人配对,只有语言相同的才能配一对,问对于每个区间,最多能配成几对。思路:莫队算法来处理。#includeusing namespace std;//#define min(a,b) a>=b?b:astruct lx{ int l,r,id;}p[50005];int

2016-09-13 21:17:58 1627

原创 2016 acm香港网络赛 A.A+B problem[FFT]

题意:给你一组[-50000,50000]的数,取3个数a,b,c,使得a+b=c。思路:这题的思路是最后一小时看到FFT想到的,然后自学了一小时FFT,最后还是没搞出来。。把每个数加上50000,这样就没有负数了,先把0拿出来,用FFT解决,再对0特殊处理一下。#include#include#include#includeusing namespace std;//kua

2016-09-13 21:14:36 1396

空空如也

空空如也

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

TA关注的人

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