這題貌似想法挺簡單的。
跟普通的矩形並變形一下
把三種顏色分別對應乙個二進位制位,那麼用十進位制數表示r, g, b, rg, rb, gb, rgb
就是 1,2,4,3,5,6,7
然後在pushup操作中把這些東西更新一下就行了
注意,普通矩形並是一條線段表示進入矩形,另一條表示出了矩形,那麼本題中就對三種顏色分別記錄了
當時比賽的時候寫的比較蛋疼。完全是碼農寫法。其實完全可以寫的很精簡。
#include #include #include #include #include #include #include #include #include #define maxn 41111
#define maxm 555555
#define inf 1000000011
#define lch(x) x<<1
#define rch(x) x<<1|1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int n;
struct rec
p[maxn];
struct seg
seg(int xx, long long a, long long b, long long c, int d)
bool operator <(const seg &cmp)const
} seg[maxn * 2];
long long x[maxn * 2];
int bin(int low, int high, long long v)
return -1;
}long long sum[4 * maxn][9];
int cnt[4 * maxn];
int num[4 * maxn][5];
long long ans[9];
int get(char *s)
void up(int rt, int l, int r)
else if(cnt[rt] == 6)
else
}else if(cnt[rt] == 5)
else
}else if(cnt[rt] == 4)
else
}else if(cnt[rt] == 3)
else
}else if(cnt[rt] == 2)
else
}else if(cnt[rt] == 1)
else
}else
else
}}void update(int l, int r, int v, int l, int r, int rt)
}up(rt, l, r);
return;
}int m = (l + r) >> 1;
if(l <= m) update(l, r, v, lson);
if(r > m) update(l, r, v, rson);
up(rt, l, r);
}int main()
sort(x, x + m);
sort(seg, seg + m);
int kx = unique(x, x + m) - x;
for(int i = 0; i < m - 1; i++)
for(int j = 1; j <= 7; j++)
ans[j] += sum[1][j] * (seg[i + 1].h - seg[i].h) ;
}printf("case %d:\n", ++cas);
printf("%i64d\n", ans[1]);
printf("%i64d\n", ans[2]);
printf("%i64d\n", ans[4]);
printf("%i64d\n", ans[3]);
printf("%i64d\n", ans[5]);
printf("%i64d\n", ans[6]);
printf("%i64d\n", ans[7]);
}return 0;
}
HDU 1542 矩形面積並)
problem description 已知atlantis的地圖由許多矩形構成,求它們的面積並。input 題目有多組資料,每組資料的開頭有乙個整數n 1 n 100 表示地圖數,接下來n行,每行4個小數 x1 y1 x2 y2 0 x1資料以0結束 output 對於每組資料,你需要輸出一行 t...
hdu 1542 矩形面積並
如圖 用乙個水平線從下往上進行掃瞄,遇到a線段 cover 1 將其插入線段樹中,線段樹中的每個節點都有個cover值,初始都為0,因此第一條線段插入時不會覆蓋其它線段 顯然的 接著是b線段 cover 1 插入線段樹,與a線段產生覆蓋的區間是第一次計算的面積,覆蓋的區間相當於矩形長,再利用線段樹中...
HDU1542矩形面積並
取出縱向邊按x座標排序,在y方向上建立線段樹。每次查詢當前有效長度len,ans len x i x i 1 其中len為t rt len 查詢完畢後更新y方向上線段樹,入邊 1,出邊 1。1 include2 using namespace std 3 define lson l,m,rt 1 4...