妄想集合 题解(斐波那契三角形问题)

题目链接

题目思路

定义\(f(n)\)为前\(n\)个数有多少个斐波那契数

则在\(1-n\)中只需要有\(f(n)+1\)个数就一定能构成三角形

很容易推导,以前也写过,但是忘了...

然后再随便维护下即可

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n,m;
int a[maxn];
vector<int> vec[maxn];
set<int> se;
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        se.insert(i);
        vec[i].push_back(a[i]);
    }
    se.insert(inf);
    for(int i=1,l,r,x;i<=m;i++){
        char opt[10];
        scanf("%s %d %d",opt+1,&l,&r);
        if(opt[1]=='Q'){
            scanf("%d",&x);
            int now=l-1;
            while(1){
                now=*se.upper_bound(now);
                if(now>r) break;
                vec[now].push_back(x);
                if(vec[now].size()>=50){
                    se.erase(now);
                }
            }
        }else{
            vector<int> tmp;
            for(int j=l;j<=r;j++){
                for(auto in:vec[j]){
                    tmp.push_back(in);
                    if(tmp.size()>50) break;
                }
                if(tmp.size()>50) break;
            }
            sort(tmp.begin(),tmp.end());
            bool flag=0;
            for(int j=0;j+2<(int)tmp.size();j++){
                if(tmp[j]+tmp[j+1]>tmp[j+2]){
                    flag=1;
                    break;
                }
            }
            printf(flag?"YES\n":"NO\n");
        }
    }
    return 0;
}

posted @ 2021-10-30 13:49  hunxuewangzi  阅读(51)  评论(0编辑  收藏  举报