樹狀陣列部分例題

2021-09-20 03:06:28 字數 2656 閱讀 4752

poj-1037 

給出n個星星的座標,如果乙個星星的左下方(包含正左和正下)有k顆星星,就說這顆星星是k級的,統計每個等級有多少個點。這題可用樹狀陣列,對於每個星星按y座標從小到大排序,相同y座標按x座標從小到大排序(題目中資料已經有序),輸入順序已排好序,那麼只要依次統計星星i之前x座標小於等於i.x的星星有多少,即是星星i的級別

code:

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

#define n 15005

#define maxn 32002

int n;

int a[maxn], vis[n];

int lowb(int x)

void push_m(int x)

}int sear(int x)

return ans;

}int main()

for (int i = 0; i < n; i++)

cout << vis[i] << endl;

return 0;

}

poj-3321

題意:一棵樹上有n個叉子(其實就是n個節點),再告訴你n-1個線段告訴你是u和v節點相連的,再輸入m組操作,有兩種操作,當是q操作時你就要輸出物件的節點上有多少個蘋果(初始化時每個節點都有蘋果),c操作是吃掉蘋果或是長出蘋果(乙個節點只能是有乙個蘋果或是沒有蘋果,即:有蘋果就是吃掉當前節點的蘋果,沒蘋果就是長出蘋果)。

思路:可以把它倒過來就可以用樹狀陣列做了,就是還要用dfs來搜一下每個節點的分支有多少個,開始的時間和結束的時間就可以了。

code:

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

#define n 100005

vector>a(n);

int n, m;

int cnt;

int lef[n], rig[n], vis[n];

int c[n];

int lowbit(int x)

void put_m(int x,int d)

}void dfs(int x)

rig[x] = cnt;

}int sum(int x)

return res;

}int main()

cnt = 1;

dfs(1);

for (int i = 1; i <= n; i++)

scanf("%d", &m);

cin.get();

for (int i = 0; i < m; i++)

else

else

} cin.get();

} return 0;

}

poj-2481

題目大意:

給你很多線段的頭s和尾e,問每一條線段中包含了多少個線段,(s和e相同不計在內)。這題先一看,完全不知道什麼方法,感覺非常的難辦。

但是!樹狀陣列可以輕鬆解決這個問題!!!首先,將她們線段的s和e當做是(s,e)乙個點,這樣子把所有點畫出來,你就會發現乙個很神奇的現象,題目要求就會變成:問每乙個點的左上角有多少個點?

stars

code:

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

#define n 100005

struct node a[n], b[n];

int c[n], res[n];

int n;

map, int>q;

bool cmp(node x, node y)

return x.e > y.e;

}int lowbit(int x)

void insert(int x, int m)

}int find(int x, int m)

return sum;

}int main()

sort(a, a + n, cmp);

insert(a[0].s, mx);

res[a[0].k] = 0;

for (int i = 1; i < n; i++)

res[a[i].k] = find(a[i].s, mx);

insert(a[i].s, mx);

} for (int i = 0; i < n; i++) cout << endl;

} return 0;

}

poj-2464

題意:在平面直角座標系中給你n個點,stan和ollie玩乙個遊戲,首先stan在豎直方向上畫一條直線,該直線必須要過其中的某個點,然後ollie在水平方向上畫一條直線,該直線的要求是要經過乙個stan之前畫過的點。 這時候平面就被分割成了四塊,兩個人這時候會有乙個得分,stan的得分是平面上第1、3象限內的點的個數,ollie的得分是平面上第2、4象限內的點的個數,在統計的時候在所畫線上的點都不計算在內。求最終stan使得自己的最差得分最高,並且輸出此時ollie的得分。

樹狀陣列例題1

如題,已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3個整數,表示乙個操作,具體如下 操作1 格式 1 ...

樹狀DP入門例題

p1352 沒有上司的舞會 沒有上司的舞會 p1352 題意 有一場舞會,每乙個人都有乙個快樂值,但不能和上司同時出現在舞會中,問這個舞會的快樂值最大為多少 解法 樹狀dp include using namespace std define maxn 100000 struct nodeedge ...

最短路 部分例題

記錄一下最短路的一些經典例題,當做是模板來用吧。例題 title agri net include include include include include include define shuzu 101 int maxn 0x7fffffff using namespace std int...