科林明伦杯"哈尔滨理工大学第八届程序设计竞赛

“科林明伦杯”哈尔滨理工大学第八届程序设计竞赛

稳定切水题选手成功切了3道水题,值得鼓励。有几个题感觉能做出来,看了题解还是和一开始的感觉相差甚远。


A.SUM

1.png

直接上快速幂即可,求余的时候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$

2.png

想不出,想不出

... ... ...