由於\(k\leq 10\)所以考慮用總方案減去經過兩個差的絕對值\(\leq k\)的點的路徑數
分類討論一下發現要處理祖先關係和其它關係兩種情況,考慮怎麼去重,可以將這些答案看作乙個個矩形,
然後就是要求矩形的面積並,用掃瞄線+線段樹解決
#include #include #include #include #define rr register
using namespace std;
const int n=300011; typedef long long lll;
struct nodee[n<<1];
struct rec
inline void dfs(int x,int fa)
inline void update(int k,int l,int r,int x,int y,int z)
rr int mid=(l+r)>>1;
if (y<=mid) update(k<<1,l,mid,x,y,z);
else if (x>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,mid,z),update(k<<1|1,mid+1,r,mid+1,y,z);
if (lazy[k]) w[k]=r-l+1;
else w[k]=w[k<<1]+w[k<<1|1];
}inline void add(int lx,int rx,int ly,int ry),q[++tot]=;
}signed main()else add(dfn[x],ifn[x],dfn[y],ifn[y]);
} sort(q+1,q+1+tot);
for (rr int i=1;i
update(1,1,n,q[i].l,q[i].r,q[i].type),ans-=1ll*(q[i+1].x-q[i].x)*w[1];
return !printf("%lld",ans);
}
nssl1459 空間簡單度 掃瞄線,線段樹
n nn個點的一顆樹,合法路徑定義為一條路徑上每個點的編號相差大於k kk。求合法路徑數 首先我們可以求不合法的路徑數,這樣我們就有了k n k nk n個不合法 即不能在同乙個路徑上 的點對。然後這題就和之前一題jzoj6276一樣了 大概就是用矩形表示不合法的路徑,之後用掃麵線求矩形的面積並即可...
線段樹 掃瞄線
pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...
掃瞄線 線段樹
問題描述 小明的家旁邊有條河流,但最近,周圍的三個工廠開始向這條河排放汙水,這條河的一部分被汙染了,被乙個工廠汙染的部分可以看做乙個矩形,現在小明想知道這條河被汙染的面積是多少。輸入 第一行乙個整數t,表示有多少組資料,之後每一組資料報括三行,每一行有lx,ly,rx,ry四個整數,表示被乙個工廠汙...