题解:序列 (Standard IO)

题解

序列 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits

Description

 Fiugou想要在一个长度为N的序列A中找到不同位置的三个数,以这三个数为三边长来构成一个三角形。但是它希望在满足条件下,这三个数的位置尽量靠前。具体地,设这三个数的为Ai,Aj,Ak(i<j<k), Fiugou希望k尽量小;当k相等时,满足j尽量小;当k,j均相等时,满足i尽量小。
但是这个序列中的数可能会发生变化。所以Fiugou给出了M个操作,形式如下:
1 x y:将Ax改为y
2:查询最优的合法解,从小到大给出这三个数(而不是位置)。

Input

第一行一个整数N,代表序列的长度。
第二行有N个整数,代表初始序列。
第三行一个整数M,代表操作的个数。
接下来M行操作,两种操作格式如上所述。

Output

 共M行,每行三个数,从小到大给出。如果不存在,输出-1 -1 -1。

Sample Input

67 1 3 4 5 1321 3 52

Sample Output

3 5 74 5 7

Data Constraint

对于10%的数据, N<=10, M<=5
对于30%的数据, N<=100, M<=25
对于50%的数据, N<=1000, M<=1000
对于100%的数据, N<=100000, M<=1000
对于100%的数据, 0<=Ai<=10^9, 1<=x<=N, 0<=y<=10^9

数据很水导致题目直接很水,暴力枚举就可以过了。那个N的取值范围是拿来骗你的。因为三角形的任意两边之和大于第三边,任意三个数满足a>=b+c,就无解,amax是10^9,b和c从1开始枚举,满足第n项大于等于前两数之和,得到一个数列1,1,2,3,5,8,13,21,34,55,89......任意三个数满足a>=b+c的序列中最大的一个数不超过10^9的位置是50,所以在50之内一定可以枚举出一对解,且该解就是最优解,如果50之内都没有解,那么一定有a>10^9或者就是无解,所以n只用枚举到50。那么直接枚举三条边,最多O(m*50^3)的复杂度,就可以过了。

因为j>k>p(分别对应题目中的k,j,i),所以先枚举j,再枚举k,最后枚举p,保证第一个找出来的满足条件的是最优解。

附上代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,x,g,o;
 7 long long y;
 8 long long a[100005];
 9 int main()
10 {
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++)
13     scanf("%lld",&a[i]);
14     scanf("%d",&m);
15     for(int i=1;i<=m;i++)
16     {
17         scanf("%d",&o);
18         if(o==1)
19         {
20             scanf("%d%lld",&x,&y);
21             a[x]=y;
22         }
23         else if(o==2)
24         {
25             g=0;
26             for(int j=3;j<=n;j++)
27             {
28                 for(int k=2;k<=j-1;k++)
29                 {
30                     for(int p=1;p<=k-1;p++)
31                     {
32                         if(a[j]+a[k]>a[p]&&a[j]+a[p]>a[k]&&a[k]+a[p]>a[j])
33                         {
34                             long long h[4];
35                             h[1]=a[j];h[2]=a[k];h[3]=a[p];
36                             sort(h+1,h+4);
37                             for(int j=1;j<=3;j++)
38                             printf("%lld ",h[j]);
39                             printf("\n");
40                             g=1;
41                             break;
42                         }
43                     }
44                     if(g==1) break;
45                 }
46                 if(g==1) break;
47             }
48             if(g==0)
49             printf("-1 -1 -1\n");
50         }
51     }
52     return 0;
53 }

其它两组测试数据:https://files.cnblogs.com/files/grt-lty-love-forever/A%28StandardIO%29.rar

by:ルオ?テンイの锦依卫

未经作者允许,禁止转载!

原文地址:https://www.cnblogs.com/grt-lty-love-forever/p/10332067.html

时间: 2024-08-03 09:06:55

题解:序列 (Standard IO)的相关文章

题解1235. 洪水 (Standard IO)

Description 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的.森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示.有以下几点需要说明:1. 每一分钟画家能向四个方向移动一格(上.下.左.右)2. 每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)3. 洪水和画家都不能通过岩石区域4. 画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪

NOI-CCF 1123. A-B (Standard IO)

题目描述 给定N个数Ai,以及一个正整数C,问有多少对i,j,满足Ai-Aj=C. 输入 第一行输入两个空格隔开的整数N和C第2至N+1行每行包含一个整数 A_i 输出 输出一个数表示答案. 样例输入 5 3 2 1 4 2 5 样例输出 3 数据范围限制 N <= 200000,所有数字保证在32位有符号整型内. 1 /* 2 由于a[i]-a[j]=c; 3 我们希望找的就是序列中A[i]+C的个数. 4 我们可以先求出A中小于等于A[i]+C的数的个数. 5 再求出A中小于等于A[i]+C

2644. 数列 (Standard IO)

这道题是道数论题,如果想对了的话会很快. 因为这道题实在是没有什么知识点,所以我直接上代码,代码上有很详细的注释: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[1000005]={0},t; //a为桶排序数组 int main(){ std::ios::sync_with_stdio(0);//读入输出加速 cin>>t;//测试数据的个数

JZOJ_3223. 【HBOI2013】Ede的新背包问题 (Standard IO)

Description  “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎么的心情.能不能说给我听.” 失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她的音容笑貌. 记忆中,她总是喜欢给Eden出谜题,在valentine's day的夜晚,两人在闹市中闲逛时,望着礼品店里精巧玲珑的各式玩偶,她突发奇想,问Eden这样的一个问题:有n个玩偶,每个玩偶有对应的价值.价钱,每个玩偶都可以被买有限次,在携带的价钱m固定的情款下,如何选择买哪些玩偶以及每

JZOJ_4722. 跳楼机 (Standard IO)

Description  DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼.经过改造,srwudi的跳楼机可以采用以下四种方式移动:1.向上移动x层:2.向上移动y层:3.向上移动z层:4.回到第一层.一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层.DJL想知道,他可以乘坐跳楼机前往的楼层数. Input

JZOJ 4230. 淬炼神体 (Standard IO)

题目 Description 王仙女将你提供的答案填在<葵花宝典>上,突然,宝典发出耀眼的白光,一股强大的吸力瞬间将仙女吸入宝典中.一阵眩晕过后,仙女发现自己来到了一个浮岛上,四周的半空中也有许多大小不一的浮岛,他抬头一看,空中浮现着这样一句话:欲要成神,必先成就神体.每座浮岛都有一定的淬炼肉体的功效,但你只能选择恰好K座来淬炼你的肉体.最终你的神体有多强,就看你的造化了.仙女看了看手中的宝典,发现上面浮现着这些浮岛的信息,每座浮岛上有两个数字.仙女研究了一会儿终于明白了,原来,每来到一座浮岛

GDKOI2014 基因模式

3572. [GDKOI2014]基因模式 (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB Description Input Output 对于每个询问,输出一行,表示对应的询问中符合要求的子串数目. 注意两个子串在S中位于不同位置即视为不同子串,即使它们对应的序列相同. 空串不计算在内. Sample Input 输入1: 3 GATATG ATA a GATAT a GATATG aT 输入2: 2 ACTG ACT

Trie树标准模版

这是一个Trie树标准模版 By Leo 本人版权,请勿抄袭!! 先看教程:  1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率

NOI2014 随机数生成器.

3757. [NOI2014]随机数生成器 (Standard IO) Time Limits: 5000 ms  Memory Limits: 262144 KB Description Input 输入文件的第 1 行包含 5 个整数,依次为 x0, a, b, c, d,描述小 H 采用的随机数生成算法所需的随机种子. 第 2 行包含三个整数 N, M, Q,表示小 H 希望生成一个 1 到 N × M 的排列来填入她 N 行 M 列的棋盘,并且小 H 在初始的 N × M 次交换操作后,