hdu 4419 (線段樹 線掃瞄 一點點技巧)

2021-08-16 02:35:25 字數 1333 閱讀 3039

題目連線:

第一次寫部落格,都點小小的激動,先廢話一點。

題意:給你很多個矩形,分別用r g b表示每個矩形三種可能的顏色,重合的的部分為rg rb等顏色,求著七種顏色的面積分別是多少。

題解:最開始想到了用1 2 4分別表示這三種顏色,從而簡化顏色的組合,但是始終沒想到怎麼去更新線段樹,最後看了其他的大佬的東西才發現居然還有這種操作。

#include #include #include #include #include #include #define qq printf("qaq\n");

#define ll long long

#define pf(num) printf("%lld\n",num);

using namespace std;

const int maxn=10005;

struct edgeedge[maxn<<1];

int pos[maxn<<1];

int num,cnt;

struct treet[maxn<<3];

bool cmp(edge a,edge b)

void pushup(int rt)

} else if(t[rt].l!=t[rt].r)//memset(t[rt].cover,0,sizeof t[rt].cover) ;

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

t[rt].cover[i]=t[rt<<1].cover[i]+t[rt<<1|1].cover[i];

}void updata(int rt,int l,int r,int data)

int mid=(t[rt].l+t[rt].r)>>1;

if(mid>=r)updata(rt<<1,l,r,data);

else if(mid>1;

if(pos[mid]==x)return mid;

if(x>pos[mid])l=mid+1;

else r=mid-1; }}

int main()

sort(pos+1,pos+num+1);

sort(edge+1,edge+num+1,cmp);

//  for(int i=1;i<=num;i++)

//  pf(edge[i].h);

cnt=2;

for(int i=2;i<=num;i++)

if(pos[i]!=pos[i-1])pos[cnt++]=pos[i];

cnt--;

build(1,1,cnt-1);

ll ans[8]=;

for(int i=1;i

線段樹(一) 點修改

動態範圍最小值問題。給出乙個有 n 個元素的陣列 a 1,a 2,a n 你的任務是設計乙個資料結構,支援以下兩種操作 如果還是使用 sparse table 演算法,每次 update 操作都需要重新計算 d 陣列,時間無法承受。為了解決這個問題,這裡介紹一種靈活的資料結構 線段樹 segment...

線段樹的一點總結

線段樹,顧名思義,是根據線段建成的樹。每乙個節點都可以是線段。對於單點查詢,區間查詢,單點更新,區間更新都是o logn 級別的,所以對於大多數區間操作比較大的題,都可以用線段樹解決。0.性質 對於每乙個非葉子節點下標為i的節點,它的左兒子的下標必定為i 1,右兒子的下標必定為i 1 1.1.定義 ...

HDU 1753 大明A B(仔細一點耐心一點)

話說,經過了漫長的乙個多月,小明已經成長了許多,所以他改了乙個名字叫 大明 這時他已經不是那個只會做100以內加法的那個 小明 了,現在他甚至會任意長度的正小數的加法。現在,給你兩個正的小數a和b,你的任務是代表大明計算出a b的值。本題目包含多組測試資料,請處理到檔案結束。每一組測試資料在一行裡面...