【链表】Day8-D

链接

D

题目描述


思路

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值