中石油训练赛 - Bad Treap(数学)

题目链接:点击查看

题目大意:给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大

题目分析:如果想让笛卡尔树的高度尽可能大,令其退化为一条链即可,考虑如何令其退化为一条链,一个比较简单的方法是让 x 和 sin( x ) 都单调

考虑 sin( x ) :在 [-\frac{\pi }{2},\frac{\pi }{2}] 上单调递增

如果抛开 x 是整数的限制,只需要将这个长度为 π 的区间等分成 n 段就是答案了

那么现在考虑如果 x 是整数该如何去做,因为 sin( x ) 是周期函数,所以设 T = 2*\pi +\epsilon,那么

  1. sin(T)=sin(\epsilon)
  2. sin(2T)=sin(2\epsilon)
  3. ...
  4. sin(nT)=sin(n\epsilon)

当 n = 3 时,用图像表示就是这样:

其意义显然同样是将 π 等分成 n 段,然后连成一条链输出即可

所以需要满足 n\epsilon < \pi,得到 \epsilon < \frac{\pi }{n} 

因为 T =2\pi + \epsilon,换句话说 \epsilon = T\ mod \ 2\pi,综上得到 T\ mod \ 2\pi < \frac{\pi}{n},找到一个较小的 T ,依次输出其等差数列即可

然后这个题目中比较优秀的一个 T = 710

代码:
 

#pragma GCC optimize(2)
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map> 
#include<unordered_set>
using namespace std;
         
typedef long long LL;
         
typedef unsigned long long ull;
    
const int inf=0x3f3f3f3f;
   
const int N=510;
   
int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        printf("%d\n",-17750000+i*710);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/109004486
今日推荐