poj 2464 線段樹統計區間 兩棵樹

2022-07-28 21:27:24 字數 2072 閱讀 4446

仔細分析的話,不用說了,我只是盡自己的力量去寫乙個盡量好看的**。。。

思路說一下:

就是先統計這個點的上區間有多少點,下區間有多少點,然後x排序再求上下區間,這個時候便可以得知已經更新進去的點一定在該點的左下方、左上方、下方。。。

由此統計出每個點被作為標準點畫出,每個人的得分情況。。

view code

1 #include2 #include3 #include4 #include5 #include

6using

namespace

std;

7using

std::sort;

8using

std::unique;

9const

int n = 200022;10

const

int inf = 0x7fffffff;11

struct

point

12p[n];

15int

lt[n],lb[n],rt[n],rb[n],ollie[n];

16int

up[n],down[n];

17int

x[n];

18int sum[n<<2

];19

bool

cmp1(point a,point b)

2025

bool

cmp2(point a,point b)

2631

void update(int t,int l,int r,int

i)32

39int query(int t,int l,int r,int l,int

r)40

49int max(int a,int

b)50

53int

main()

5463 sort(p+1,p+n+1

,cmp1);

64int topy=0;65

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

6668

if(p[i].y==p[i+1].y)p[i].y=topy;

69else p[i].y=topy++;70}

71 memset(sum,0,sizeof

(sum));

72for(int i=1;i<=n;i++)update(1,0

,topy,p[i].y);

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

7478 sort(p+1,p+n+1

,cmp2);

79int topx=0;80

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

8183

if(p[i].x==p[i+1].x)p[i].x=topx;

84else p[i].x=topx++;85}

86 memset(sum,0,sizeof

(sum));

87int stan=0,top=0;88

for(int i=0;i<=topx;i++)x[i]=inf;

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

90101 update(1,0

,topy,p[i].y);

102}

103for(int i=0;i<=topx;i++)stan=max(stan,x[i]);

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

105109 sort(ollie,ollie+top);

110 top=unique(ollie,ollie+top)-ollie;

111 printf("

stan: %d; ollie:

",stan);

112for(int i=0;i"%d"

,ollie[i]);

113 printf("

;\n"

);114

}115

return0;

116 }

POJ 3468 線段樹區間

這個題目是第二個區間修改的線段樹了,做到現在可以發現線段樹真的非常的靈活,特別是區間修改部分,前面的單點修改其實還是也可參看模版的,區間修改就真的非常靈活了了。這個題目就是區間加法,然後求乙個累加和,同樣地也是需要乙個延遲標誌的,也就是lazy,然後還需要乙個統計當前區間的全部和的陣列。就可以輕鬆解...

(線段樹統計區間種類)

第14屆中北大學程式設計競賽來了,集訓隊新買了一大堆氣球,氣球一共有k種顏色 1 k 256 氣球的顏色從1 k編號。zbt童心未泯,他發明了一種擺放氣球的遊戲,規則如下。一排有n個桌子,每張桌子上只有乙個氣球插孔,即每張桌子最多只能放乙個氣球。編號分別為1 n 1 n 100000 每張桌子一開始...

poj3667 線段樹(區間合併)

題意 有編號為1 n的n個房間,有兩種詢問 1.有人來訂連續的k間房,有的話返回第一間房的編號,否則返回0。2.有人退連續的從a開始的連續的k間房。1.該區間最大的連續空房數 2.該區間從最左邊起的最大的連續空房數 3.該區間從最右邊起的最大的連續空房數 根據以上三個資訊,每個非葉結點的資訊都可以由...