hdu 4325 Flowers(嘔心瀝血)

2021-06-15 09:42:42 字數 1258 閱讀 2219

昨天晚上睡不著,就在oj上隨便找題做。看到之前某隊友寫了這道題目的解題報告,想著閒著也是閒著,我也就做一下。這道題最難處理的地方是資料範圍是10^9。我想了許久終於想到了解決的辦法,又花了很長時間修改,終於把這道題給a掉。然後我回頭去看隊友的解題報告,發現那貨竟然是利用資料太弱直接水過去了。粗俗!

這類題的通用解法就是在花開的a時刻,把陣列mark[a]的值加上一,在花落的b時刻,把陣列mark[b]的值減去一,然後直接遍歷一遍就行了。但是這道題的資料太大,這樣做不管是時間上還是空間上都不允許。我開始想著用線段樹,但是稍微讀一下題就知道錯了。又想著用陣列逐個標記,但是明顯解決不了記憶體太大的問題。思考許久之後,想到可以將給出的花開花落的時間記錄在下來,然後用兩個資料a和b去記錄在這一時刻有多少花開多少花落的方法。將這些資料以x為關鍵字排序,對於需要查詢的時刻,讓其對x進行二分查詢,這樣不管是時間上還是空間上的問題都解決了。

想法不錯,但是開始的時候沒有意識到某一時刻花開的數量和花落的數量是要分開記錄的,比如說對於一朵花在第4秒花開,然後在同一時刻結束,這時候在這一時刻應該是有一朵花是開著的,但是按我最初記錄的方式記錄的結果就是0。這個問題改過來之後又想到把資料記錄排序之後還應該合併,因為在記錄的資料裡可能會記錄了很多在同一時刻的資料,這些資料都需要合併一下。這兩個是我寫的時候忽略的兩個主要的問題,還有其他各種小毛病,提交了好幾遍才過掉。

所以看到菜鳥啟航直接把這道題給水掉,我很不痛快啊!

#include#include#include#define n 100005

struct node

a[n];

int cmp(const void *a,const void *b)

int find(int x,int n)

if(x==a[s].x)

return a[s].a;

else if(x==a[e].x)

return a[e].a;

else

return a[s].a+a[s].b;

}int main()

{ int t;

scanf("%d",&t);

int count;

count=1;

while(t--)

{int n,m;

scanf("%d%d",&n,&m);

memset(a,0,sizeof(a));

int x,y;

int i,j,k;

a[0].x=0;

a[0].a=a[0].b=0;

j=1;

for(i=0;i

hdu4325樹狀陣列,線段樹,離散化

題目 大意 本題就是求在某個時間點上開花的朵數 思路 此題後台測試資料很水,題目給的範圍很大,但測試資料並沒有他給的這麼多,區間處理,樹狀陣列,離散化都能解 1.離散化思想 2.線段樹思想 3.樹狀陣列思想 線段樹的一種 樹狀陣列 思路 假設更新區間 a,b 從a到b每乙個點都要加上一朵,基於樹狀陣...

hdu1285 hdu4857 拓撲排序

一 原題內容 problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在...

樹狀陣列 hdu2689 hdu2838

題意 給定乙個正整數n,和乙個1 n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?題意可以轉換成求這個排列的逆序對數。include include include include using namespace std...