链接
题目描述
思路
Quant_Ask出题%%%
不可行的集合
1
,
1
,
2
,
3
,
5
,
8
,
13
,
21
,
34...
1, 1, 2, 3 ,5, 8, 13, 21, 34...
1,1,2,3,5,8,13,21,34...
斐波那契数列
那第45左右就超过了范围,所以只要一个集合有超过45个数,就可以选出一个三角形
那就直接判断就好了,那数字也可以直接加给没满的集合
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int to[100005], siz[100005], q[100005][50], cc[100005];
int n, m, lim = 45;
char c;
void Quant(int l, int r, int x)
{
for(int i = l; i <= r; ++i) {
int now = to[i - 1];
while(siz[now] > lim) now = to[now];
if(now > r || now > n) return;
q[now][++siz[now]] = x;
if(siz[now] > lim) to[i - 1] = to[now];
}
}
int main()
{
to[0] = 1;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
q[i][++siz[i]] = x;
to[i] = i + 1;
}
c = getchar();
for(int i = 1; i <= m; ++i)
{
int anss = 0, num = 0, sizz = 0;
while(c != 'A' && c != 'Q') c = getchar();
if(c == 'Q') {
int l, r, x;
while(c != ' ') c = getchar();
scanf("%d%d%d", &l, &r, &x);
Quant(l, r, x);
}
else {
int l, r;
while(c != ' ') c = getchar();
scanf("%d%d", &l, &r);
for(int k = l; k <= r; ++k)
sizz += siz[k];
if(sizz > lim) printf("stoorz\n");
else {
for(int k = l; k <= r; ++k)
for(int j = 1; j <= siz[k]; ++j)
cc[++num] = q[k][j];
sort(cc + 1, cc + num + 1);
for(int k = 1; k <= num - 2; ++k)
{
if(cc[k] + cc[k + 1] > cc[k + 2])
{
anss = 1;
break;
}
}
if(anss) printf("stoorz\n");
else printf("my_dog\n");
}
}
}
return 0;
}