hihoCoder 程式設計練習賽第45場

2021-08-14 20:51:48 字數 3067 閱讀 8676

一共四道題

#題目1 : 互補二元組

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

描述給定n個整數二元組(x1, y1), (x2, y2), … (xn, yn)。

請你計算其中有多少對二元組(xi, yi)和(xj, yj)滿足xi + xj = yi + yj且i < j。

輸入第一行包含乙個整數n。

以下n行每行兩個整數xi和yi。

對於70%的資料,1 ≤ n ≤ 1000

對於100%的資料,1 ≤ n ≤ 100000 -1000000 ≤ xi, yi ≤ 1000000

輸出乙個整數表示答案。

樣例輸入

59 10

1 35 5

5 48 6

樣例輸出

2最初看到這道題的時候沒有認真審題,認為(1,2)(3,2)(3,2)這種情況只計數一次(應該記兩次),想辦法將配過對的陣列刪除,結果耽誤了很長時間,後來先做的後面幾題,快結束時返回來再直接按字面意思做,過了70%(lte)。比賽結束後翻到了某大神簡潔的**,膜拜。這道題將給定的條件xi + xj = yi + yj稍微變換一下可得 (xi -yi)+ (xj - yj) = 0, 所以將輸入的數對作差值儲存起來即可。考慮到x、y的取值範圍,可用map直接查詢。嗯,以上的都能想到。大神的方法妙在儲存x-y時,直接對y-x做加操作,省去了重複遍歷和查詢,很巧妙。(注意x,y的取值範圍,ll)

**:

#include#include#include#include#includetypedef long long ll;

using namespace std;

mapres;

int main()

cout << cnt << endl;

return 0;

}

#題目2 : 尋找切線

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

描述給定平面上n個點p1=(x1, y1), p2=(x2, y2), … pn=(xn, yn)。

請你從中找到兩個不同的點pi和pj滿足:其他所有點都在pi和pj連線的同一側(可以在連線上)。

如果有多組答案滿足條件,你可以輸出任意一組。

輸入第一行包含乙個整數n。

以下n行每行包含兩個整數xi和yi。

對於50%的資料,1 ≤ n ≤ 1000

對於100%的資料,1 ≤ n ≤ 100000 0 ≤ xi, yi ≤ 1000000

輸出輸出由乙個空格隔開的兩個整數i和j,注意1 ≤ i, j ≤ n且i ≠ j。

樣例輸入

60 10

7 08 8

10 18

15 13

20 4

樣例輸出

5 6方法:一條直線由兩點確定:先找到 x/y 座標最大值(最小值也可以)作為第乙個點,再計算其餘點與該點的斜率,取絕對值最大的點作為第二個點。

#include#include#include#include#include#include#include#includeusing namespace std;

int main()

float k = 0;

for(int i=0; ik)

}if(m < q) cout << m+1 << ' ' << q+1 << endl;

else cout << q+1 << ' ' << m+1 << endl;

return 0;

}

#題目3 : lr問題

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

描述給定兩個字串s和t,每個字串都由』l』、『r』和』_'組成。例如:

r__lr_r_l

每一次操作,可以將s中的乙個』r』與它右邊相鄰的』『交換(前提是這個r右邊相鄰位置就是』』);或者將s中的乙個』l』與它左邊相鄰的』『交換(前提是這個l左邊相鄰位置就是』』)。

例如,先移動第乙個l,再移動第二個r會得到:

r__lr_r_l -> r_l_r_r_l -> r_l__rr_l

請你計算最少經過幾次操作可以將s變成t。

輸入第一行包含乙個字串s。

第二行包含乙個字串t。

對於30%的資料,1 ≤ |s| = |t| ≤ 20

對於100%的資料,1 ≤ |s| = |t| ≤ 100000

輸出輸出乙個整數代表最少操作次數。

如果不論如何s也不能變成t,輸出-1。

樣例輸入

r__lr_r_l

r_l__rr_l

樣例輸出

2總是把簡單問題複雜化,竟然想用dp,做的題量還是太少了。參照某大神簡潔優美的**如下:

#include #include using namespace std;

int main()

void union(int x, int y)

int vis[maxn];

vectorg[maxn];

void dfs(int x)

}bool check(int mid)

for(int i = 1; i <= n; i++) vis[i] = 0;

vis[find(1)] = 1;

dfs(find(1));

if(vis[find(n)]) return true;

for(int i = 1; i <= n; i++) vis[i] = 0;

vis[find(n)] = 1;

dfs(find(n));

if(vis[find(1)]) return true;

return false;

}int id(char * s)

int main(void)

if(!check(m)) puts("-1");

else

printf("%d\n", r);

}return 0;

}

hihoCoder程式設計練習賽69

時間限制 5000ms 單點時限 1000ms 記憶體限制 256mb 給定乙個小寫字母字串,請判斷它是否有長度為偶數的非空連續回文子串 輸入包含多組資料。每組資料報含一行乙個小寫字母字串 s 1 s 105 對於每組資料如果存在,輸出yes,否則輸出no 樣例輸入 cabbad ababa 樣例輸...

hihoCoder程式設計練習賽11 物品價值

描述 小hi現在有n個物品,每個物品都有乙個價值。並且這n個物品總共有m個不同的屬性,每個物品都具有其中若干屬性。小ho要從中選出若干物品,滿足每個屬性都正好有奇數個物品擁有,且被選出的物品價值總和最大。你能幫助小ho完成任務麼?輸入 第一行乙個數t 10 表示資料組數。對於每一組資料 第一行兩個數...

hihocoder 程式設計練習賽59第三題樹的權重

題目 其實就是乙個樹的轉移中心的題。以1為根節點做一遍dfs可以得到1到其他所有點 的距離之和。求某點到其他點的距離之和的時候可以根據最初的情況轉移。比如設點k是點1的子節點,w k w 1 cnt k n cnt k 其中cnt k 是k的子樹的節點個數 包括k本身 當根節點由乙個點轉移到它的子節...