哈哈哈哈哈哈哈哈哈哈哈哈我終於過了!!!!!!!!!!!!!!!
從昨天上午就開始寫了,下午回家之後調了一會兒沒什麼感覺,就刪了重打了一遍,然後調了一晚上+今天半個上午......我*******終於過了......
我是萌萌的傳送門
我是另乙個萌萌的傳送門
一道極其噁心的動態樹分治......
首先點分治,限制條件就變成了di+dj<=ri+rj,移項得rj-dj>=di-ri,對重心和子樹開平衡樹維護di-ri即可。
查詢的時候先跳點分治樹更新答案,然後逐層把di-ri插入平衡樹,上跳的過程中判斷是否有子樹失衡(某個子樹大於子樹總大小的alpha倍),有則提出來暴力重構成完全平衡的點分治樹。
各種坑爹細節和腦殘錯誤調了一天,不過還是過了,激動......
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6const
int maxn=100010;7
const
double alpha=0.7;8
struct
node
14int
data,size,p;
15 node *ch[2
];16 node(int d):data(d),size(1
),p(randint()){}
17 inline void refresh()
18 }*null=new node(0),*root[maxn],*root1[maxn][50
];19
void addnode(int,int
);20
void rebuild(int,int,int,int
);21
void dfs_getcenter(int,int,int&);
22void dfs_getdis(int,int,int,int
);23
void dfs_destroy(int,int
);24
void insert(int,node*&);
25int order(int,node*);
26void destroy(node*&);
27void rot(node*&,int
);28 vectorg[maxn],w[maxn];
29int size[maxn]=,siz[maxn][50]=,son[maxn];
30bool
vis[maxn];
31int depth[maxn],p[maxn],d[maxn][50],id[maxn][50
];32
intn,m,w[maxn],tmp;
33long
long ans=0;34
intmain()
55return0;
56}57void addnode(int x,int z)
67else
71 ans+=order(w[x]-d[x][k],root[u])-order(w[x]-d[x][k],root1[id[x][k]][k]);
72 insert(d[x][k]-w[x],root[u]);
73 insert(d[x][k]-w[x],root1[id[x][k]][k]);
74 size[u]++;
75 siz[id[x][k]][k]++;
76if(siz[id[x][k]][k]>size[u]*alpha+5)rt=u;77}
78 id[x][depth[x]]=0
;79 d[x][depth[x]]=0;80
if(rt)84}
85void rebuild(int x,int k,int s,int
pr)103
for(int i=0;i
,size[g[x][i]],x);
104}
105void dfs_getcenter(int x,int s,int &u)
114if(!u||max(s-size[x],size[son[x]])x;
115}
116void dfs_getdis(int x,int u,int rt,int
k)128
}129
void dfs_destroy(int x,int
k)135
}136
void insert(int x,node *&rt)
142int d=x>=rt->data;
143 insert(x,rt->ch[d]);
144 rt->refresh();
145if(rt->ch[d]->pp)rot(rt,d^1
);146
}147
int order(int x,node *rt)
154return
ans;
155}
156void destroy(node *&x)
163void rot(node *&x,int
d)170
/*171
wc2014 紫荊花之戀
172di+dj<=wi+wj,移項得wj-dj>=di-wi,動態點分治維護即可。
173每個重心和子樹存一棵平衡樹維護di-wi,加點的時候跳點分治樹更新答案後加入新點,
174加入之後判斷子樹是否失衡,找出最高的失衡節點,把整個子樹暴力重構成完全平衡的點分治樹。
175*/
BZOJ 3434 Wc2014 時空穿梭
題意 n維座標中要找c個點使得c個點在一條線上且每一維的座標單調遞增且不能超過每一維限定的值m i n 11,2 c 20,m i 100000 include using namespace std const int n 100005,md 10007 int c n 19 g 21 n f 2...
洛谷 P3920 WC2014 紫荊花之戀
傳送門 想題5分鐘,調題20小時 qaq 我做這題的歷程 這什麼破玩意兒 如果您聽說過 替罪羊式重構點分樹 的話這題就很好想了。首先考慮樸素的點分治 每次分治統計路徑經過分治中心的點對的貢獻。記 dis i 為點 i 到分治中心的距離,條件即 dis i dis j le r i r j 移個項 d...
WC命令詳解
通常利用linux的wc命令和其他命令結合來計算行和其他資訊。在linux下用wc進行計數。返回檔案的行數 字數 位元組數等。從乙個例子說起 看上面例子,檔案getpid example.c共有7行,看看利用wc命令對該檔案進行操作的效果。如下圖 其中7為行數,15為字數 最長行的字數,上圖中第5行...