題目連線:
第一次寫部落格,都點小小的激動,先廢話一點。
題意:給你很多個矩形,分別用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的值。本題目包含多組測試資料,請處理到檔案結束。每一組測試資料在一行裡面...