科林明伦杯"哈尔滨理工大学第八届程序设计竞赛
“科林明伦杯”哈尔滨理工大学第八届程序设计竞赛
稳定切水题选手成功切了3道水题,值得鼓励。有几个题感觉能做出来,看了题解还是和一开始的感觉相差甚远。
A.SUM
直接上快速幂即可,求余的时候WA了3发,尴尬。
D.小C的问题
小C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形。有一天她得到了n根木棍,她把这些木棍随意的摆放成一行。小K来和小C玩,他发现了这排木棍,突然想知道在一段区间[l,r]之间的木棍(即第L根到第R根木棍)是否可以组成一个三角形,小C表示她不会,所以请你帮忙。
input
数据只有一组。
第一行只有一个数字N,代表一共有N根木棍,N<=100000。
第二行为N个数,代表每根木棍的长度。每根木棍的大小不超过1e18。
第三行为一个数字Q,代表询问数目,Q<=100000。
接下来的Q行,每一行有两个数字L和R,代表询问的区间。其中L和R满足1<=L<=R<=N。
对于一个区间,注意到只有里面的数为斐波那契额数列时,全部无法组成三角形。不然必然可以组成三角形。
而斐波那契额数列的增长是很快的,到90+就超过long long了。所以 r - l + 1 > 90的情况直接输出yes
小于90的情况,先排序再暴力即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long LL;
LL num[100005],tmp[120];
int len;
void judge(int l,int r)
{
for(int i=0;i<len;i++) tmp[i] = num[i+l];
sort(tmp,tmp+len);
for(int i=0;i+2<len;i++)
{
if(tmp[i+2] < tmp[i] + tmp[i+1])
{
cout << "Yes" << endl;
return;
}
}
cout << "No" << endl;
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,t,l,r;
cin >> n;
for(int i=1;i<=n;i++) cin >> num[i];
cin >> t;
while(t--)
{
cin >> l >> r;
len = r - l + 1;
if(len > 100)
{
cout << "Yes" << endl;
continue;
}
else judge(l,r);
}
}
F.Easy Math Problem
肥肠简单的数学问题(屁啊
给定一个有N个元素的集合, 求所有非空子集的权值(cost)总和. 一个集合的权值cost定义为集合元素个数的 3 次方.
1 <= n <= 1e9
转成人话,即求$\sum C^i_n · i ^3$
想不出,想不出