三角形

時間限制:C/C++ 1秒谁帕,其他語言2秒
空間限制:C/C++ 262144K隘谣,其他語言524288K

一蝉稳、題目內(nèi)容

題目描述

鐵子從森林里收集了n根木棍,她開始將它們按順序的排成一排劳闹,從左到右依次為1到n院究,她回想起
在數(shù)學課上老師教她的三角形知識,她開始從這些木棍中間找三根木棍來組成一個周長最大的三角形本涕,
這時她的兄弟順溜偷偷的溜了過來业汰,偷走了第i根木棍,現(xiàn)在她想知道現(xiàn)在能夠組成周長最大的三角形
的周長是多少菩颖?

輸入描述

第一行兩個整數(shù)n和q样漆。(1\leq n,q \leq 10^5)
第二行n個整數(shù)表示第i根木棍的長度a_i(1 \leq a_i \leq 10^9)
接下來q行位他,每行一個整數(shù)表示被順溜偷走的木棍編號氛濒。注意每行的事件是獨立的产场,也就是說每一次操作都是對于原來的n根木棍進行的鹅髓。

輸出描述

對于每個詢問輸出一行表示答案舞竿,如果刪除木棍后無法組成三角形則輸出 -1 。

示例1

輸入

6 2
1 2 3 4 5 6
6
5

輸出

12
13

二窿冯、解題思路

關(guān)鍵:1.能組成三角形的組合骗奖;2.最長周長。
可以組成三角形醒串,而且周長最長执桌,那么我們只需要將數(shù)組升序或降序,從最大長度的木棍——>最小長度的木棍遍歷芜赌,只要能組成三角形(任意兩邊相加大于第三邊仰挣,由于是有序的數(shù)組,因此只需要將小的兩個木棍長度和與大的木棍長度比較即可)缠沈,即是所有木棍能組成的最大周長perimeter(因為從大到小有序遍歷)膘壶,同時記下最大周長的三根木棍的標號數(shù)組maxIDS,最后再比較被順溜順走的木棍標號洲愤,如果標號在maxIDS中颓芭,那么排除被順走的木棍重新遍歷,否則輸出最大周長perimeter柬赐。(在獲取最大周長時亡问,我們可以記錄下組成最大周長三根木棍的編號,降低遍歷次數(shù)肛宋,但增加了內(nèi)存開銷州藕。)

代碼實操

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
struct Node {
    int id;
    ll l;
    bool friend operator < (Node n, Node m) {
        if (n.l == m.l) return n.id > m.id;
        return n.l < m.l;
    }
}a[MAXN];
  
int n, q;
///最長周長
ll perimeter = -1;
Node maxIDS[3];
 
void solve(int lost) {
    if (perimeter == -1) {
            cout << "-1" << endl;
        } else {
            if (maxIDS[0].id == lost || maxIDS[1].id == lost || maxIDS[2].id == lost) {
                int minL = a[maxIDS[0].l].l;
                int maxIndex = maxIDS[2].l;
                if (maxIDS[0].id == lost) {
                    minL = a[maxIDS[1].l].l;
                }
                  
                int maxL = a[maxIDS[2].l].l;
                if (maxIDS[2].id == lost) {
                    maxL = a[maxIDS[1].l].l;
                    maxIndex = maxIDS[1].l;
                }
                if (maxIDS[0].l > 1) {
                    if (a[maxIDS[0].l - 1].l + minL > maxL) {
                        cout << 1LL * a[maxIDS[0].l - 1].l + minL + maxL << endl;
                    } else {
                        int res = 0;
                        for(int i = maxIndex; i > 1; i--) {
                            if (a[i].id == lost) {
                                if (a[i - 1].l < a[i - 2].l + a[i - 3].l) {
                                    cout << 1LL * a[i - 1].l + a[i - 2].l + a[i - 3].l << endl;
                                    res = 1;
                                    break;
                                }
                            } else if (a[i - 1].id == lost) {
                                if (a[i].l < a[i - 2].l + a[i - 3].l) {
                                    cout << 1LL * a[i].l + a[i - 2].l + a[i - 3].l << endl;
                                    res = 1;
                                    break;
                                }
                            } else if (a[i - 2].id == lost) {
                                if (a[i].l < a[i - 1].l + a[i - 3].l) {
                                    cout << 1LL * a[i].l + a[i - 1].l + a[i - 3].l << endl;
                                    res = 1;
                                    break;
                                }
                            } else {
                                if (a[i].l < a[i - 1].l + a[i - 2].l) {
                                    cout << 1LL * a[i].l + a[i - 1].l + a[i - 3].l << endl;
                                    res = 1;
                                    break;
                                }
                            }
                        }
                        if (!res) cout << "-1" << endl;
                    }
                } else {
                    cout << "-1" << endl;
                }
            } else {
                cout << perimeter << endl;
            }
        }
}
  
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> q;
    for(int i = 0; i < n; i++) {
        cin >> a[i].l;
        a[i].id = i;
    }
    sort(a,a + n);
    for(int i = n - 1; i > 1; i--) {
        if (a[i - 2].l + a[i - 1].l > a[i].l) {
            perimeter = 1LL * a[i].l + a[i - 1].l + a[i - 2].l;
            maxIDS[0].id = a[i - 2].id, maxIDS[0].l = i - 2;
            maxIDS[1].id = a[i - 1].id, maxIDS[1].l = i - 1;
            maxIDS[2].id = a[i].id,     maxIDS[2].l = i;
            break;
        }
    }
    int lost;
    while(q--) {
        cin >> lost;
        lost -= 1;
        solve(lost);
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酝陈,隨后出現(xiàn)的幾起案子慎框,更是在濱河造成了極大的恐慌,老刑警劉巖后添,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笨枯,死亡現(xiàn)場離奇詭異,居然都是意外死亡遇西,警方通過查閱死者的電腦和手機馅精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粱檀,“玉大人洲敢,你說我怎么就攤上這事∏羊牵” “怎么了压彭?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵睦优,是天一觀的道長。 經(jīng)常有香客問我壮不,道長汗盘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任询一,我火速辦了婚禮隐孽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘健蕊。我一直安慰自己菱阵,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布缩功。 她就那樣靜靜地躺著晴及,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫡锌。 梳的紋絲不亂的頭發(fā)上虑稼,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音世舰,去河邊找鬼动雹。 笑死,一個胖子當著我的面吹牛跟压,可吹牛的內(nèi)容都是我干的胰蝠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼震蒋,長吁一口氣:“原來是場噩夢啊……” “哼茸塞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起查剖,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钾虐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笋庄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體效扫,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年直砂,在試婚紗的時候發(fā)現(xiàn)自己被綠了菌仁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡静暂,死狀恐怖济丘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤摹迷,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布疟赊,位于F島的核電站,受9級特大地震影響峡碉,放射性物質(zhì)發(fā)生泄漏近哟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一异赫、第九天 我趴在偏房一處隱蔽的房頂上張望椅挣。 院中可真熱鬧头岔,春花似錦塔拳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至适掰,卻和暖如春颂碧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背类浪。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工载城, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人费就。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓诉瓦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親力细。 傳聞我的和親對象是個殘疾皇子睬澡,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容