2013 多校第六场 hdu 4655 Cut Pieces
2013-08-10 11:07
363 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4655
题目大意:给你一个序列ai,每个点可以涂ai种颜色,颜色一样的算同一块,ai可以任意排列,问你所有方案的块数和最大为多少?
思路:直接来解题报告吧
![](https://img-blog.csdn.net/20130810105648343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenN0dV96bGo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如果不考虑相邻块的重复,那么总数就为n*S(S为TTai),现在考虑相邻两个ai的重复,就要剪掉,依次考虑过去,如果ai和a(i+1)相同,那么就要剪掉min(ai,a(i+1))*S/(ai*a(i+1)) ,也就是题解里的S/max(ai,a(i+1)),然后全部都SIMGA起来就可以了,注意这里减得时候不用再乘n了,一种涂色方案只代表n*S总数里多算的一种,相邻的两块颜色一样只是这种颜色涂法的块数少了1而已。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef __int64 lld;
const int MOD = 1e9 +7 ;
const int MAXN = 1111111 ;
int a[MAXN],b[MAXN];
lld left[MAXN],right[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i = 1,tot =0;tot<=n;i++)
{
b[++tot] = a[i];
if(i>=(n-i+1)) break;
b[++tot] = a[n-i+1];
}
/*for(int i = 1;i<=n;i++)
printf("%d ",b[i]);
puts("");*/
left[0] = 1;
for(int i = 1;i<=n;i++)
{
left[i] = (left[i-1]*b[i])%MOD;
}
right[n+1] = 1;
for(int i = n;i>=1;i--)
right[i] = (right[i+1] * b[i])%MOD;
lld A = (n*left
)%MOD;
lld B = 0 ;
for(int i = 1;i<n;i++)
{
B = (B + ((left[i-1]*right[i+2])%MOD*min(b[i],b[i+1]))%MOD)%MOD;
}
printf("%I64d\n",(A-B+MOD)%MOD);
}
return 0;
}
题目大意:给你一个序列ai,每个点可以涂ai种颜色,颜色一样的算同一块,ai可以任意排列,问你所有方案的块数和最大为多少?
思路:直接来解题报告吧
如果不考虑相邻块的重复,那么总数就为n*S(S为TTai),现在考虑相邻两个ai的重复,就要剪掉,依次考虑过去,如果ai和a(i+1)相同,那么就要剪掉min(ai,a(i+1))*S/(ai*a(i+1)) ,也就是题解里的S/max(ai,a(i+1)),然后全部都SIMGA起来就可以了,注意这里减得时候不用再乘n了,一种涂色方案只代表n*S总数里多算的一种,相邻的两块颜色一样只是这种颜色涂法的块数少了1而已。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef __int64 lld;
const int MOD = 1e9 +7 ;
const int MAXN = 1111111 ;
int a[MAXN],b[MAXN];
lld left[MAXN],right[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i = 1,tot =0;tot<=n;i++)
{
b[++tot] = a[i];
if(i>=(n-i+1)) break;
b[++tot] = a[n-i+1];
}
/*for(int i = 1;i<=n;i++)
printf("%d ",b[i]);
puts("");*/
left[0] = 1;
for(int i = 1;i<=n;i++)
{
left[i] = (left[i-1]*b[i])%MOD;
}
right[n+1] = 1;
for(int i = n;i>=1;i--)
right[i] = (right[i+1] * b[i])%MOD;
lld A = (n*left
)%MOD;
lld B = 0 ;
for(int i = 1;i<n;i++)
{
B = (B + ((left[i-1]*right[i+2])%MOD*min(b[i],b[i+1]))%MOD)%MOD;
}
printf("%I64d\n",(A-B+MOD)%MOD);
}
return 0;
}
相关文章推荐
- HDU 4655 Cut Pieces(2013多校6 1001题 简单数学题)
- HDU 4655 2013多校联合赛第6场 Cut Pieces
- 2013 多校第六场 hdu 4658 Integer Partition(五边形数定理,整数划分)
- 2013 多校第六场 hdu 4662 MU Puzzle
- 2013 多校第六场 hdu 4661 Message Passing(树形DP+拓展欧几里得)
- 2013 多校第六场 hdu 4665 Unshuffle
- 2013 多校第六场 hdu 4664 Triangulation(SG问题)
- hdu 4562 Dice 求期望 推数学公式 (2013多校联合)
- 2013 多校第一场 hdu 4602 Partition
- 2013 多校联合 H Park Visit (hdu 4607)
- 2013 多校联合 F Magic Ball Game (hdu 4605)
- 2013 多校第二场 hdu 4618 Palindrome Sub-Array
- 2013 多校第七场 hdu 4667 Building Fence
- 2013 多校第二场 hdu 4616 Game
- 2013 多校第九场 hdu 4686 Arc of Dream(矩阵乘法或者直接推公式)
- 2013 多校第九场 hdu 4691 Front compression(暴力 + 剪枝 OR 后缀数组)
- 2013 多校第五场 hdu 4649 Professor Tian
- HDU 4655 Cut Pieces
- HDU 4655 Cut Pieces 找规律+简单计数
- HDU 4671 Backup Plan (2013多校7 1006题 构造)