摘要: 思路:与a有关的逆序对数=(在a之前出现的比a大的数+在a之后出现的比a小的数)/2当我们删除a时,减少的是 与a有关的逆序对数,当我们把a的位置填充b时增加的是 与b有关的逆序对数,可以用树状数组求这样我们相处了nmlogK的算法,显然是不能承受的(K=500000)但是我们发现当a相同时我们可以将所有的b在logn的时间内算出来,这样复杂度就成了(m+n)logK了完全可以承受~PS:不知道为什么我和别人用一样的思路我的代码怎么比他们快3倍啊。。求解释。。(卖萌。。。。)View Code 1 #include <cstdio> 2 #include <cstring&g 阅读全文
posted @ 2012-10-04 10:56 proverbs 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 题意:题意:给出两行数,求上下匹配的最多组数是多少。匹配规则1,匹配对的数字必须相同2.每个匹配必须有且只能有一个匹配与之相交叉,且相交叉的两组匹配数字必须不同2,一个数最多只能匹配一次思路:其实凭感觉瞎写呗。类似于最长公共子序列的方程。dp[i][j]=max(dp[i-1][j-1],dp[i-1][j],dp[i][j-1],dp[pi-1][pj-1]+2) 表示前a的前i个数和b的前j个数匹配的最大值依次含义分别是:i,j都不匹配;i不参与匹配;j不参与匹配,i,j和前面的某个符合要求的字符匹配View Code 1 #include <cstdio> 2 #includ 阅读全文
posted @ 2012-10-04 00:00 proverbs 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 题意:有三个相互隔离的河岸X,Y,Z,每个岸上分别有n,m,p个部落,每个河岸上的部落之间是敌对的(即同一个河岸上的部落之间不能连通),然而,位于不同河岸上的任意两个部落之间都是友好的,现在请你在部落之间搭建桥梁(不能交叉),每座桥的费用是两部落的海拔差的绝对值,求:使得每一个部落都能与至少一个他的友好部落连通 的桥的总费用。友情提示:注意坐标的顺序PS:自己连蒙带猜的题意,AC了。。O(∩_∩)O~思路:对于三个河岸,两两做一遍n^2的dp,再把三个dp结合起来做一遍dp(其实就是找最值)河岸分布图:x河岸从左向右部落编号是增大的,y、z河岸自己看吧~借用了LYD神犇的一张图片嘿嘿~xz[i 阅读全文
posted @ 2012-10-03 23:22 proverbs 阅读(760) 评论(0) 推荐(1) 编辑
摘要: 题意:举办一次ACM竞赛,需要考虑两方面,1.是每个队至少都能做出1道题目,2.是冠军至少能做出n道题目。现在已知有m道题目,t支队伍,和n的值,以及每支队伍做出每道题目的概率gl[i][j],求出这次比赛能保证上面两方面都会达到的概率。PS:我代码中的n和m是反的。思路:这个题应该算是基础的概率dp了,就是一个加法原理和乘法原理,其他和普通dp一样,甚至方程更简单dp[i][j][k]表示第i个队伍,做前j道题目,作对k道的概率,方程很好写吧~我们可以把最终的答案转化成 每个队伍都做至少一道题目的概率-每个队伍都只做1~(n-1)道题的概率好了,就是这样了~View Code 1 #inc. 阅读全文
posted @ 2012-10-03 21:52 proverbs 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 题意:给出T个山洞,对于每个山洞,如果任意选择两点s,e,都满足s可以到达e或者e可以到达s,则输出Yes,否则输出No。思路:如果两点不可达那么在拓扑排序时,该两点谁也不是谁的前驱和后继,那么在拓扑排序时定会出现至少两个度为0的点,这两个点分别是它们本身或它们的拓扑序列的前驱。如果在拓扑排序时发现有多于1个度为0的点,那么这些点必然不可达。由此推出该题为No的充分必要条件:缩点拓扑排序过程中出现至少两个度为0的点。思路摘自:http://happylch21.blog.163.com/blog/static/1656397592011711261518/(我还是刚知道弱连通这个东西。。)Vi 阅读全文
posted @ 2012-10-02 22:27 proverbs 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个序列,求其中长度为5的递增序列的个数(N<=50000)这题的dp的方法挺经典的,方程大家应该都会写(那个N^2的),我就不再赘述,这里巧妙地运用了树状数组求和c[i][j]表示当前状态时,以j(j是数字,不是下标)为结尾的长度为i的序列个数剩下的就是考验高精度了~1100+msView Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 #include <algorithm> 6 7 阅读全文
posted @ 2012-10-02 21:07 proverbs 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 题意:题意:FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x。另外,每头牛还有一个自己的声调v,如果两头牛(i和j)之间想要沟通的话,它们必须用同个音调max(v[i],v[j]),沟通起来消耗的能量为:max(v[i],v[j])* 它们之间的距离。问要使所有的牛之间都能沟通(两两之间),总共需要消耗多少能量。这个题看着数据量挺吓人的,但是只要肯动笔,这题其实很水的。思路:这个题目n^2的肯定能做,TLE呗,所以我们思考如何降低复杂度。开始动笔:设消耗的总能量为ans,则ans=sigma(max(v[i],v[j])*abs(x[j]-x[i])) 1<=i 阅读全文
posted @ 2012-10-02 19:17 proverbs 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 堆,不解释。题意在讨论里面有。View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 struct HEAP 7 { 8 int p,id,px; 9 }h[10010],tmp;10 int t,size;11 inline bool cmp(const HEAP &a,const HEAP &b)12 {13 if(a.px==b.px) ret 阅读全文
posted @ 2012-09-01 21:38 proverbs 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题意:有2n把钥匙,每2个一组,给你每组的钥匙信息,并且每组的钥匙只能用一个。有m个门,每个门有2个锁,只要打开一个锁这个门就开了。问你最多能够打开多少个门。PS:打开门必须是有序的,即你想要打开i就必须之前已经打开了i-1分析:不知道我这样做的人多不多。由于有序性,所以二份答案是必须的我是把一个钥匙a(不是一组钥匙)拆成两个点a0和a1,分别表示没有取过和取过,对于和他同组的钥匙b,连两条边,a1-->b0和b1-->a0,表示取了a钥匙就不能再取b钥匙对于每层的两把锁,c和d,连c0-->d1,d0-->c1,表示c钥匙不取则d钥匙必须取,d钥匙不取则c钥匙必须取, 阅读全文
posted @ 2012-09-01 20:12 proverbs 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 题意:一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。思路:把每条边都抽象成一个点a,再把a点拆成两个点(2-SAT嘛),分别为a0和a1,分别表示这条边从内部连何从外部连,说到这里应该会建图了吧!再提示一下,对于有可能交叉的两条边考虑连边。怎么判断有可能交叉大家都会吧,细心点就是了!View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstr 阅读全文
posted @ 2012-08-31 23:37 proverbs 阅读(229) 评论(0) 推荐(0) 编辑