2016多校赛
WePlayDirty
emmmmmmm
展开
-
(多校第二场1001)HDU5734 Acperience
推个公式:∑(W[i]+B[i]*a)^2=∑W[i]^2+n*a^2+2*a*∑B[i]W[i];对于x=a,y=n*x^2+2*x*∑B[i]W[i]; 是一元二次方程,所以min(∑W[i]^2+n*a^2+2*a*∑B[i]W[i])=∑W[i]^2-(∑B[i]W[i])^2/n,可得当∑B[i]W[i]取最大值时,∑(W[i]+B[i]*a)^2取最小值。#inclu原创 2016-07-22 21:17:08 · 2519 阅读 · 0 评论 -
(多校第一场1004)HDU5726 GCD(区间GCD查询+)
题意:给出n个数,区间为(1,n),查询区间(l,r)的GCD,以及区间(1, n)有多少子区间的GCD等于区间(l,r)的GCD。做法:使用线段树,或RMQ维护区间GCD,并且要预处理出所有可能出现的GCD值 的区间数量。针对固定左端点,一直向右GCD阶梯状减小的特性,大概有两种做法。1)对于某一固定起点(以选定左端点L=i为例),从最右端R开始,二分枚举GCD突变位置pos,这一段阶梯的长度就是R-pos+1,定义INTERGCD(L,R)=区间(L,R)的GCD,则GCD值等于 INTERGC原创 2016-07-21 22:02:04 · 4230 阅读 · 0 评论 -
(多校第六场1002)HDU5794 A Simple Chess(Lucas+dp)
给你一个n×m的棋盘,给出r个点,表示棋盘中有r个坏点不能走,问马从(1,1)走到(n,m)有多少中走法,每一步必须是往横纵坐标不减小的方向走。如果棋盘上没有坏点,那从(1,1)走到(n,m)满足方程1+2x+y=n && 1+2y+x=m ,如果方程的两个解大于等于0,那就可达,否则不可达。如果可达,方案数就是组合数C(x+y,x)。如果棋盘上有一个坏点,方案数就是(没有坏点的方案数)原创 2016-08-05 15:24:22 · 2731 阅读 · 0 评论 -
(多校第四场1010)HDU5773 The All-purpose Zero(LIS)
看了题后感觉肯定是先把0拿出来再处理,记录每个位置前面有多少个0,0是百搭的,不如去牺牲一些数,把0全用上,因为0一定能替换牺牲掉的数(最差在变成那个数好了)。那么现在来看牺牲那些数,考虑到如果去掉0之后的得到的LIS是{2,4,5},而4和5之间如果有0也不能用,如果2和4之间有两个0,也只能用一个,如果原串是{2,0,0,4},如果要算上所有的0,最差也要把4舍弃,只要把4减去其其那面0的原创 2016-08-01 20:42:49 · 2146 阅读 · 0 评论 -
(多校第五场1012)HDU5792 World is Exploding(树状数组)
题意:给出一列数,问有多少个四元组满足ad,并且四个数两两不相等,a的位置在b的前面,c的位置在d的其那面。可以先忽略四个数两两不相等的条件,那就是(,逆序对个数)乘上(顺序对个数),例如{2,4,1,3},逆序对就是{(2,1),(4,1),(4,3)} ,顺序对就是{(2,4),(2,3),(1,3)},这样3*3=9,一共九个符合ad的四元组,而其中像{2,1,3}这样的都是不符合最终条原创 2016-08-03 21:38:23 · 2166 阅读 · 0 评论 -
(多校第五场1003)HDU5773 Divide the Sequence
从后面开始累加,统计合法的连续序列个数(序列和大于等于0就算一个,然后重新累计),大于等于0的就是合法的,这样就能保证所有前缀都大于等于0。#include #include #include #include #include #include #include #include #include #include #include #include #include原创 2016-08-03 20:18:09 · 2657 阅读 · 0 评论 -
(多校第一场1001)HDU5723 Abandoned country
http://acm.hdu.edu.cn/showproblem.php?pid=5723最小生成树+dfs需要结论:给定一棵树,求树上所有点对的距离之和,则树上的每一条边对这个和的贡献就是这条边两端的点的个数的乘积再乘上该边的边长(例如一条树边为w,该边一端点的个数为A,另一端的点的个数为B,则这条边的贡献值就是A×B×W),把所有的A;×B×W累加起来就是所有原创 2016-07-20 11:40:44 · 2518 阅读 · 0 评论 -
(多校第四场1012)HDU5763 Bubble Sort (树状数组)
给出一串数是(1~n)的一个排列,问在冒泡排序过程中,每个数会出现的最右端位置和最左端位置的差。一开始想用归并排序做,但是发现归并和冒泡的交换次数相同,但是每个数出现的位置是不同的。所以归并不可行。最后发现,由左向右冒泡(题目中给的程序是从右向左冒泡,其实结果一样),每个数向左移动的次数就是其前面比他大的数的个数,而其最左端位置就是(未排序的位置-前移的位置),而每个数的最右端位置就是ma原创 2016-07-30 11:17:58 · 2243 阅读 · 0 评论 -
(多校第四场1001)HDU5763 Another Meaning (DP、KMP)
先给出一个母串str,再给出一个模式串pat,每一个pat有两个意思,问母串能表示几个意思。用dp解决,dp【i】表示到i位置可以表示的意思个数,首先有dp[i]=dp[i-1],设pat的长度是len1,如果以i结尾的前缀字符串的最后了len1个字符与pat匹配,那么dp[i]+=dp[i-len1];而对于每个以i结尾的位置能不能被替换,可以用kmp计算出。#include#原创 2016-07-30 10:37:24 · 2440 阅读 · 0 评论 -
(多校第四场1006)HDU5769 Substring 后缀数组
套了一个后缀数组的模板,求出sa和height数组后,对于每一个后缀字符串,他能产生的不同子串的数量就是len-sa[i]-height[i];而本题还要求必须包含目的字符tar,这就需要另外一个数组haha,haha[i]表示从第i个字符向后几位找到tar,例如abbabb,tar=a,则haha{0,2,1,0,2,1,0};而对与每个后缀字符串能产生的包含tar的不通字符串个数就是l原创 2016-07-29 13:48:54 · 2234 阅读 · 0 评论 -
(多校第二场1011)HDU5744 Keep On Movin
水题,统计一共多少个奇数(odd),集合就至少有多少个元素,然后每个奇数减一变成偶数,累加一共多少偶数(2m),再特判odd是不是0个,是就输出2m,否则就是m/odd×2+1。原创 2016-07-23 09:07:50 · 2116 阅读 · 0 评论 -
(多校第二场1009)HDU5742 It's All In The Mind
水题,理解题意后把n个数填出来就行了。 #include#define LL long long#define maxn 110using namespace std;int arr[maxn];int main(){ int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); memse原创 2016-07-23 08:48:00 · 2216 阅读 · 0 评论 -
(多校第六场1001)HDU5793 A Boring Question(逆元,等比数列和取模)
推出公式就好了,就是计算m^0+m^1+.....+m^n;#include#include#include#include#include#include#include#include#include#include#define LL long long#define MOD int(1e9+7)using namespace std;L原创 2016-08-11 10:22:17 · 2280 阅读 · 0 评论