自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

w446506278的博客

不想输。

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

原创 Codeforces 421D Bug in Code(思维)

题意:给你n个点对(x,y)表示第i个人怀疑x和y,问你有多少个点对(x,y)被怀疑的人数总和超过p。思路:首先是统计下每个人被怀疑的次数,然后排个序,用两个指针从两头枚举,这样就能O(2*n)的时间统计出有多少个点对的和大于p。然后对于每个输入得点对,如果该点对对应的总和大于p(也就是说我们之前有计算过的),那么我们去判断去掉该重复的点后的和是否还大于p,如果不大于答案-1。#i

2016-07-29 20:56:57 486

原创 Codeforces 353D Queue(规律)

题意:给你一个队列,M表示男生,F表示女生,每秒一个男生能和右边一个女生交换位置,问你需要多少秒所有女生都换到最左边。思路:对于一个女生。她至少需要换她前面所有男生个数次,如果她前面有个女生,那么她也至少需要前面那个女生的次数+1次,我们取最大值即可。#include#include#includeusing namespace std;const int MAX=1e6

2016-07-29 19:59:24 499

原创 Codeforces 242E XOR on Segment(线段树)

题意:给你n思路:线段树。对于异或操作,我们想到二进制数,只有当x的二进制位为1时,被异或的数对应的二进制位取反。对于求和操作,我们如果知道二进制数每位1的个数,我们累加起来就能得到其和了。所以这里对于每一位都建立一颗树来保存1的个数,这里a[i]、x#includetypedef __int64 LL;const int MAX=1e5+5;int sum[25][MAX

2016-07-29 19:29:56 351

原创 Codeforces 370B Berland Bingog

题意:有n给人,每个人有m[i]张点数均不同的卡片,现在主持人没喊一个数持对应点数卡片的人能走卡片的步数,某人先走完自己手中全部卡片的获胜,问你在每个人都最有利的情况下每个人的获胜情况。思路:题意理解了半天。。。。。其实就是每个人都自己按照自己的卡片走,如果在自己走完之前,已经有人按照和自己一样的方式走完了,那么这个人必输。说白了就是对每个人去其他人的卡片堆中找是否有自己卡片点数的子串

2016-07-29 19:23:22 345

原创 Codeforces 50B Choosing Symbol Pairs

题意:给你一串字符串s,问你有多少个点对(x,y)满足s[x]=s[y],(x,y)和(y,x)算不同种。思路:统计每个字符出现的次数,然后枚举一遍加加加就好了。#include#includeusing namespace std;typedef __int64 LL;const int MAX=1e5+5;int n;map mp;char s[MAX];i

2016-07-29 19:21:45 479

原创 Codeforces 204B Little Elephant and Cards

题意:给你n张卡片,每张卡片都有正反a,b两种颜色,问你至少需要反转多少次才能使正面的一样的颜色超过一半以上。思路:统计下每种颜色的个数,只有当一种颜色的个数>=(n+1)/2时我们才考虑它,然后判定下该颜色在正面的个数是否>=(n+1)/2如果大于不需要反转,如果小于则需要反转至少(n+1)/2-在正面的个数,然后不断维护这个的最小值。#include#include#i

2016-07-29 19:18:20 485

原创 Codeforces 161D Distance in Tree

题意:给你一颗n个点n-1条边的树,树边长均为1,问你树上有几对点对满足它们之间距离k。思路:树形dp。假设dp[i][j]为以从i到其距离为j的儿子的路径条数。我们在递归过程中,已经知道了它儿子的dp[v][0~k]的值,那么有:dp[u][1~k]+=dp[v][0~k-1]。并且可以得到从u点出发和以u为中间节点的方法数,即ans+=dp[v][k-1]和ans+=dp[v][0

2016-07-29 19:03:18 273

原创 Codeforces 161B Discounts

题意:有n个商品和k辆购物车,给出每个商品的价钱c和类别t(1表示凳子,2表示铅笔),如果一辆购物车中有凳子,那么这辆购物车中最便宜的那个物品的价格能减少50%,问你如何放这些物品才能使总价钱最少。思路:贪心。每次做贪心题都开始怀疑人生了。。。。首先将所有凳子的价格从大到小排列,选取前k-1个凳子自己放一辆车(如果凳子数不够k-1那直接将凳子都放完),然后其他的商品都塞到剩下的购物车上

2016-07-29 18:56:23 373

原创 Codeforces 161A Dress'em in Vests!

题意:给你n思路:先将a、b排个序,然后枚举a[i]和b[j]如果能适配就i++,j++,如果b[j]#include#include#includeusing namespace std;const int MAX=1e5+5;int n,m,x,y,ans[MAX];struct Node{ int s,id;}a[MAX],b[MAX];bool cm

2016-07-29 18:49:05 379

原创 Codeforces 103D Time to Raid Cowavans

题意:给你n思路:由于这里的n、p都很大,我们直接暴力的话会TLE,那么我们先将b从小到大排序,分块处理(为什么要分呢?其实我也不知道)。分成mid=sqrt(n+1),若b>=mid,直接暴力,若b#include#include#include#includeusing namespace std;typedef __int64 LL;const int MAX=

2016-07-29 09:30:52 510

原创 Codeforces 103C Russian Roulette

题意:给你n思路:题目要求让第一个先开枪的人的胜率最大,那么对于k个子弹,我们最好的方法是让他们交替出现,对于多出来的子弹,由于题目要求字典序尽量小,也就是X尽量放后面,那么我们把多于弹夹一半的子弹从后往前一个一个地填在空位子,由于这题的n#includetypedef __int64 LL;LL n,k,x;int p;int main(){ scanf("%I64

2016-07-29 09:28:45 520

原创 Codeforces 103B Cthulhu

题意:给你n个点m条边的无向图(无重边和自环),问你是否存在一个简单的环且环上的点都是某棵树的树根。思路:注意这句话:an undirected graph that can be represented as a set of three or more rooted trees, whose roots are connected by a simple cycle.也就是说首先我

2016-07-28 21:16:57 442

原创 Codeforces 103A Testing Pants for Sadness

题意:给你n道题,每题有a[i]个选项,选错一个要退回到第一题重新开始,问你最少需要试几次才能在最坏的情况下做对全部的题目。思路:最坏情况下也就是说对于每个a[i]你都要试a[i]次,而且其中a[i]-1次错误的你都需要返回第一题重新开始,也就是每次错误都加上前面已经做过的题数(因为你已经做过也就已经知道了那题的正确答案也就是只需要1次就够了)。#includetypedef _

2016-07-28 21:11:49 350

原创 Codeforces 104A Blackjack

题意:有2, 3, 4, 5, 6, 7, 8, 9, 10, jacks,queens,kings,aces这13种牌各4张不同的花色,现给出2~10能获得的点数为2~10和 jacks,queens,kings能获得的点数都为10,aces能获得的点数为1或者11。现在你有第一张牌为黑桃10,给出n思路:就25,在纸上写写就好了。#includeint main(){ i

2016-07-28 21:07:16 386

原创 Codeforces 115C Plumber

题意:定义4种管道,给你n*m的图,问你在图上放管道不泄露的方法数有多少种。思路:我们来考虑这样一个问题,如果我们在某行某列上放了一个已知的管道,那么该行方向上的管道和该列方向上的管道都已经确定了。如下图,两杆表示这里有水管。所以我们可以定义一个r行数组来记录该行行首的水管放置情况-1表示水管在左边、0表示该行还未放置管道,+1表示水管在右边,同理定义一个c列数组。然后就是得一行一

2016-07-28 20:49:30 362

原创 Codeforces 115B Lawnmower

题意:给你张n*m的图,图上W表示草,G表示平地,一开始你从左上角朝右开始推草,每往下走一步朝向相反,问你最少需要走几步才能推完所有的草。思路:因为奇数行和偶数行的朝向是固定的,所以即使该行已经没有草了,但是由于下一行需要你还是得往前走,所以每行需要走的那一列就得由当前行和下一行的草来决定。还有如果当前行推完后已经没有草了,就没必要去下一行了,所有开个sum来记录还剩多少草。#in

2016-07-28 20:44:55 255

原创 Codeforces 115A Party

题意:给你每个人的上级,并且一个人和他的所有上级都不能在一个party中(这点是根据题目给出的两点推导出来的),问最少需要几个party。思路:并查集,找一个集合中层级数最多的就是最少需要的party数量。#include#includeusing namespace std;const int MAX=2005;int p[MAX];int Find(int i){

2016-07-28 20:39:37 506

原创 Codeforces 116B Little Pigs and Wolves

题意:给你张n*m的图,图上P表示猪,W表示狼,每只猪只和一只狼相邻,但是狼可以和很多只猪相邻,狼只能吃一只相邻的猪,问图上猪最多能被吃掉多少只。思路:因为这里每只猪只和一只狼相邻,但是狼可以和很多只猪相邻,所以我们去枚举猪,让它被相邻的狼吃,这样就能不冲突保证猪能最多数量地被吃。#includeint dir[][2]={1,0,-1,0,0,1,0,-1};int ma

2016-07-28 20:37:05 348

原创 Codeforces 116A Tram

题意:给你n个公车站,每站下a[i]个人上b[i]个人,问公车最多需要能承载多少人。思路:因为题目保证了合法性,我们只需要模拟下维护最大值就可以。#include#includeusing namespace std;int main(){ int n,ans=0,a,b,now=0; scanf("%d",&n); while(n--){ scanf("%d%d

2016-07-28 20:32:40 281

原创 FZU 1911 Construct a Matrix

题意:定义S(n) = (F1 + F2 + … + Fn) % m,现在给你n、m要你构造S(n)*S(n)的矩阵,要求矩阵内元素只能由-1、0、1组成,而且每行、每列的和均不能相同。思路:首先,有公式∑Fi = F(i+2) - 1(你把它拆开就能知道了)。然后我们就能利用矩阵快速幂来求S(n)了。然后就是如何构造这个矩阵。#include#includestruct

2016-07-27 21:09:34 273

原创 POJ 3304 Segments

题意:给你n条线段,问你是否存在一条直线穿过所有的线段。思路:枚举线段的两个端点(x1,y1)、(x2,y2)做一条直线,该直线方程为,然后利用式子来判断线段(x1,y1)-(x2-y2)是否与直线相交。#includeconst int MAX=105;struct Segment{ double x1,x2,y1,y2;}seg[MAX];struct Poin

2016-07-27 20:58:11 202

原创 HDU 3466 Proud Merchants(超值白解释)

题意:有n个商品m块钱,给出买每个商品所花费的钱P、钱包里需要至少Q才有资格买、商品的价值V。问你如何购买商品的价值最大。思路:看完题目很自然就想到了01背包。但是这里有Q的限制即再枚举价钱的过程中只能枚举到Q(因为题目保证了Q>=P)。一开始以为Q比较小枚举得范围比较多,所以就按Q从小到大排序去跑01背包,结果wrong了。然后我就开始乱搞了,先按Q+P排序了一发,还是wrong,然

2016-07-27 19:06:51 325

原创 FZU 2088 最长队名

题意:给你n个名字,问你字典序最小的名字组合是什么。思路:写个string的比较函数,然后sort一遍。#include#include#includeusing namespace std;const int MAX=10005;int n;string s[MAX];bool cmp(string a,string b){ return a+b<b+a;}

2016-07-27 19:05:55 331

原创 Codeforces 268E Playlist

题意:有n首长度为l[i]的歌,每首歌Manao有p[i]的概率喜欢。在听歌时,若Manao听到了一首不喜欢的歌他会再听完这首歌后返回去听之前所有喜欢的歌。问Manao听完这n首歌的时间期望最大是多少。听歌的顺序由我们来安排。思路:对于两首歌a、b来说,我们有先听a再听b和先听b再听a的顺序选择,那么我们选择的依据是选一个对答案贡献最大的顺序,两种顺序对答案的贡献如何求呢?很简单。只有

2016-07-27 18:52:42 332

原创 UVALive 7146 Defeat the Enemy

题意:你有n个攻击力为A,防御力为D的兽人,敌人有m个攻击力为EA,防御力为ED的兽人,两个兽人在对战时同时攻击对方,当攻击力高于对方的防御力时,即可杀死对方。你的兽人只能用一次。问你在杀死所有敌人的前提下你的兽人最多能剩多少。思路:将我们的兽人按攻击力A从大到小排列,敌人按防御力D从大到小排列,然后枚举每只敌人,将能杀死他也就是攻击力高于他的兽人防御力丢到一个multiset中,对于

2016-07-27 18:46:16 363

原创 HDU 1257 最少拦截系统

题意:给你n个依次飞来的导弹高度,问你需要多少套系统才能拦截所有的导弹。思路:正解应该是求有几个最长下降子序列,dp来做。我这里是直接模拟一遍,开数组存每套系统当前能射的高度。#includeconst int MAX=100005;int n,a,b[MAX];int main(){ while(~scanf("%d",&n)){ int cnt=0; for

2016-07-27 18:45:12 172

原创 Codeforces 439D Devu and his Brother

题意:给你n个数a[i]和m个数b[i],你每次能选择一个数组中的一个数加1或减1,问你最少需要操作几次才能使a数组的最小值大于等于b数组的最大值。思路:我们来考虑下最终的状态,最后数组a和数组b肯定是有一排一样的数,我们称这个数为中间值c,现在如何找到这个数呢?其实不需要找,我们来推导下:假设有a为a数组中最小的数,b为b数组中最大的数,c为我们所要转换的中间值,设a加上x达到c

2016-07-26 20:27:43 416

原创 Codeforces 439C Devu and Partitioning of the Array

题意:给你n个数a[i]和k、p,表示将这些数一共分成k组,组内数和为偶数的有p组(其他的为奇数),问你是否可以分。思路:这里我们只关心数的奇偶不关心大小,所以我们把所有奇数和偶数分开存。然后考虑下列公式:偶数+偶数=偶数奇数+奇数=偶数奇数+偶数=奇数可知,奇数个数不能创造的,所以我们可以先判断奇数个数num1是否大于k-p。然后先放奇数组,每组放1个奇数其他拿去

2016-07-26 20:16:23 282

原创 Codeforces 439B Devu, the Dumb Guy

题意:有n个课,每个c[i]个章节,一开始上一个课每个单元需要花x小时,但是上完一个课x-1(x最少为1),问如何安排上课才能使总时间最小。思路:贪心。章节少的课先上。#include#includeusing namespace std;typedef __int64 LL;const int MAX=1e5;int n;LL x,c[MAX];int main

2016-07-26 20:15:19 305

原创 Codeforces 439A Devu, the Singer and Churu, the Joker

题意:Devu有n首歌必须唱,但是时间只有d,给出每首歌的时间t[i]分钟,每唱一首歌后他就得休息10分钟。Churu想利用这些时间空余去讲笑话,每次讲5分钟。问在Devu完成所有歌的前提下,Churu讲笑话的个数最多多少个。思路:Devu休息10分钟Churu能讲2个笑话,最后一首歌唱完不休息,所以在Devu休息时Churu能够讲(n-1)*2的笑话,如果时间允许,他还能将(d-su

2016-07-26 20:08:37 289

原创 Codeforces 435D Special Grid

题意:给你n1.三角形上的点都是白点2.三角形的边沿着图给出的连边3.三角形的边上不能有黑点思路:根据样例,比划下,很快就能发现其实这些满足条件的三角形都是等腰直角三角形,对于图上的每一个白点,我们能够以它为顶点旋转获得八个方向的三角形(都以它为该等腰直角三角形的顶点)想象下。所以我们只需暴力枚举顶点,然后分别判断下。还有一个问题是如何判断黑点,我们可以利用前缀和来O(1)

2016-07-26 19:59:10 496

原创 Codeforces 435C Cardiogram

题意:给你n个数a[i],要你模拟出一座每列高a[i]的山。思路:题目说了所有的a[i]和不会超过1000,那么这就简单了,开个3000*3000的数组(因为这些山的高度是有落差的),然后从r=1500行开始模拟就可以啦。注意这里空白的地方要输出空格(坑)。#include#include#includeusing namespace std;const int MAX=

2016-07-26 19:58:00 271

原创 Codeforces 435B Pasha Maximizes

题意:给你一个数a思路:要使数最大,那么要在后面找一位大的数来替换前面小的数,这样我们从前面开始,每次从后面找能够通过k次移动的最大的那个数,然后将它移到前面来。#include#includeusing namespace std;typedef __int64 LL;LL a;int k,cnt,d[20];int main(){ scanf("%I64d%d

2016-07-26 19:54:24 246

原创 Codeforces 435A Queue on Bus Stop

题意:有n个团队,每个团队a[i]个人,一辆公交一次能载m个人,属于同一团队的人要么都上要么都不上,公车最少需要载几次才能载完这些人。思路:直接模拟一遍。#includeconst int MAX=105;int n,m;int a[MAX];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scan

2016-07-26 19:45:46 248

原创 扩展欧几里得定理

欧几里得算法的拓展应用中有如下三条定理:定理一:如果d =gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。   定理二:若gcd(a,b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。   定理三:若gcd(a,b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。证明:上述同余方程

2016-07-26 19:40:15 323

原创 POJ 1061 青蛙的约会

题意:有两只青蛙相向而行,A青蛙从x点出发每次跳m,B青蛙从y点出发每次跳n,它们所在的地方是一个长度为L的圈,问你最少需要跳几次它们才能相遇,若不能相遇则输出-1.思路:

2016-07-26 19:38:46 283

原创 UVA 10943 How do you add?

题意:给你n

2016-07-26 10:32:05 202

原创 UVA 11889 Benefit

题意:给你A,C,让你求lcm(A,B)=C的最小B。思路:由lcm(A,B)=C可得A*B/gcd(A,B)=C,

2016-07-26 10:25:37 270

原创 排列组合公式

排列组合

2016-07-26 10:13:17 586

转载 原根

原根的定义设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1简单来说,g^i mod p ≠ g^j mod p (p为素数)其中i≠j且i, j介於1至(p-1)之间则g为p的原根。求原根目前的做法只能是从2开始枚举,然后暴力判断g^(P-1

2016-07-26 09:48:44 465

空空如也

空空如也

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

TA关注的人

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