CF 293E Close Vertices——点分治
题目: http://codeforces.com/contest/293/problem/E 仍旧是点分治。用容斥,w的限制用排序+两个指针解决, l 的限制就用树状数组。有0的话就都+1,相对大小不变。 切勿每次memset!!!会T得不行。add(sta[ l ].len)即可,但要判一下(l==r)以防不测。(真的有那种数据!) 最后注意树状数组的范围是L(即L+1),不是n。不然可以尝试: 2 10 12 1 5 #include<iostream> #include <cstdio> #include <cstring> #include <algorithm> #define ll long long using namespace std; const int N=1e5+ 5 ; int n,L,W,hd[N],xnt,to[N<< 1 ],nxt[N<< 1 ],w[N<< 1 ]; int mn,rt,f[N],l,r,siz[N],lm; ll ans; bool vis[N]; struct Sta{ int w,len;Sta( int w= 0 , int l= 0 ):w(w),len(l) {} bool operator < ( const Sta &b) const { return w==b.w?len<b.len:w< b.w;} }sta