1. 程式人生 > >團體程式設計天梯賽-練習集-L2-012. 關於堆的判斷(小頂堆)

團體程式設計天梯賽-練習集-L2-012. 關於堆的判斷(小頂堆)

記錄一個菜逼的成長。。

題目連結

這裡建堆要每輸入一個值就插入並且向上調整
在堆頂設定一個哨兵會省點操作
還要注意值有負數,在處理字串的時候要注意。(之前一直不知道哪裡有問題,後來才發現負數忘了處理,一直過不了)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
#define ALL(v) (v).begin(),(v).end()
#define cl(a,b) memset(a,b,sizeof(a)) #define pb push_back typedef long long LL; const int INF = 0x3f3f3f3f; const int maxn = 2000 + 10; int heap[maxn],n,m; string str; void Insert(int pos,int x) { ///上濾 heap[pos] = x; for( int i = pos; heap[i/2] > heap[i] ; i /= 2 ){ swap(heap[i/2],heap[i]); } } bool
check1(int a,int b) { for( int i = 1; i <= n; i++ ) if((heap[i<<1] == a && heap[i<<1|1] == b) || (heap[i<<1|1] == a && heap[i<<1] == b))return true; return false; } bool check2(int a,int b) { for( int i = 1; i <= n; i++ ){ if
(heap[i] == a && (heap[i<<1] == b || heap[i<<1|1] == b))return true; } return false; } int main() { cin>>n>>m; heap[0] = -INF;///哨兵 for( int x,i = 1; i <= n; i++ ){ cin>>x; Insert(i,x); } /*for( int i = 1; i <= n; i++ ) cout<<treap[i]<<' '; puts(""); */ int a,b,flag; while(m--){ cin>>a;getline(cin,str); flag = 0; if(str.find("root") != string::npos){ if(a == heap[1])puts("T"); else puts("F"); } if(str.find("siblings") != string::npos){ b = 0; for( int i = 0; i < str.size(); i++ ){ if(isdigit(str[i]))b = b * 10 + str[i] - '0'; if(str[i] == '-')flag = 1; } if(flag)b = -b; puts(check1(a,b) ? "T" : "F"); } if(str.find("parent") != string::npos){ b = 0; for( int i = 0; i < str.size(); i++ ){ if(isdigit(str[i]))b = b * 10 + str[i] - '0'; if(str[i] == '-')flag = 1; } if(flag)b = -b; puts(check2(a,b)?"T":"F"); } if(str.find("child") != string::npos){ b = 0; for( int i = 0; i < str.size(); i++ ){ if(isdigit(str[i]))b = b * 10 + str[i] - '0'; if(str[i] == '-')flag = 1; } if(flag)b = -b; puts(check2(b,a)?"T":"F"); } } return 0; }