UOJ 55 【WC2014】紫荆花之恋——点分治+平衡树
题目:http://uoj.ac/problem/55
点分治。在点分树上每个点上用 splay 维护管辖的点的情况。做几次就重构点分树。TLE。只能过 20 分。
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } int Mn(int a,int b){return a<b?a:b;} int Mx(int a,int b){return a>b?a:b;} const int N=1e5+5,base=180,K=base+20,M=N*K,mod=1e9;//K not log!!!//K=base+log int n,hd[N],xnt,to[N<<1],nxt[N<<1],w[N<<1],r[N],sz[N],mn,Rt; ll ans; int rt[2][N],tot,c[M][2],vl[M],siz[M],fa[M],pre[N][K],dis[N][K],dep[N]; bool vis[N]; void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;} void pshp(int cr){siz[cr]=siz[c[cr][0]]+siz[c[cr][1]]+1;} void rotate(int x) {int y=fa[x],z=fa[y],d=(x==c[y][1]);if(z)c[z][y==c[z][1]]=x;fa[x]=z;fa[c[x][!d]]=y; fa[y]=x;c[y][d]=c[x][!d]; c[x][!d]=y;pshp(y);pshp(x); } void splay(int x) {while(fa[x]){int y=fa[x],z=fa[y];if(z)((x==c[y][0])^(y==c[z][0]))?rotate(x):rotate(y);rotate(x);} } void inst(int &cr,int v,int pr) {if(!cr){cr=++tot;c[cr][0]=c[cr][1]=0;fa[cr]=pr;vl[cr]=v;siz[cr]=1;return;}siz[cr]++;if(v<=vl[cr])inst(c[cr][0],v,cr);else inst(c[cr][1],v,cr); } void ins(int x,int v,bool fx) {inst(rt[fx][x],v,0);splay(tot);rt[fx][x]=tot; } int fnd(int cr,int v) {if(!cr)return -1;int ret=(vl[cr]>=v?fnd(c[cr][0],v):fnd(c[cr][1],v));if(ret==-1&&vl[cr]>=v)ret=cr;return ret; } void dfsx(int cr) {int ls=c[cr][0],rs=c[cr][1];printf(" cr=%d(%d %d) c0=%d(%d %d) c1=%d(%d %d)\n",cr,vl[cr],siz[cr],ls,vl[ls],siz[ls],rs,vl[rs],siz[rs]);if(ls)dfsx(ls); if(rs)dfsx(rs); } int qry(int x,int v,bool fx) {int cr=fnd(rt[fx][x],v);if(cr==-1)return 0; splay(cr); rt[fx][x]=cr;return siz[c[cr][1]]+1; } void getrt(int cr,int fa,int s) {sz[cr]=1;int mx=0;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)getrt(v,cr,s),sz[cr]+=sz[v],mx=Mx(mx,sz[v]);mx=Mx(mx,s-sz[cr]); if(mx<mn)mn=mx,Rt=cr; } void dfs(int cr,int fa,int d) {pre[cr][++dep[cr]]=Rt;dis[cr][dep[cr]]=d;ins(Rt,r[cr]-d,0);if(dep[cr]>1)ins(Rt,r[cr]-dis[cr][dep[cr]-1],1);for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,d+w[i]); } void solve(int cr,int s) {vis[cr]=1;dfs(cr,0,0);for(int i=hd[cr],v;i;i=nxt[i]){if(vis[v=to[i]])continue;int ts=(sz[v]<sz[cr]?sz[v]:s-sz[cr]);mn=N;getrt(v,cr,ts);solve(Rt,ts);} } void cz(int s) {tot=0;for(int i=1;i<=s;i++)vis[i]=0;for(int i=1;i<=s;i++)dep[i]=0;for(int i=1;i<=s;i++)rt[0][i]=rt[1][i]=0;mn=N;getrt(1,0,s);solve(Rt,s); } int main() {int bh=rdn();n=rdn();int pr=rdn()%mod,tw=rdn();r[1]=rdn();puts("0");ins(1,r[1],0);dep[1]=1;dis[1][1]=0;pre[1][1]=1;for(int i=2,T=1;i<=n;i++,T++){if(T==base)cz(i-1),T=0;pr=rdn()^(ans%mod);tw=rdn();r[i]=rdn();add(pr,i,tw);add(i,pr,tw);for(int j=1;j<=dep[pr];j++){pre[i][j]=pre[pr][j];dis[i][j]=dis[pr][j]+tw;ins(pre[i][j],r[i]-dis[i][j],0);if(j>1)ins(pre[i][j],r[i]-dis[i][j-1],1);}dep[i]=dep[pr]+1;pre[i][dep[i]]=i;ins(i,r[i],0);if(dep[i]>1)ins(i,r[i]-dis[i][dep[i]-1],1);for(int j=1;j<dep[i];j++){int u=pre[i][j],v=pre[i][j+1],d=dis[i][j]-r[i];ans+=qry(u,d,0);ans-=qry(v,d,1);}printf("%lld\n",ans);}return 0; }
View Code
写对拍的话,可以这样生成,就是在 mk.cpp 里调用写好的程序 a.cpp 得到 ans 。可以把 a.cpp 删掉 main 函数改成 a.hpp 。
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } int Mn(int a,int b){return a<b?a:b;} int Mx(int a,int b){return a>b?a:b;} const int N=10000,base=180,K=base+20,M=N*K,mod=1e9;//K not log!!!//K=base+log int n,hd[N],xnt,to[N<<1],nxt[N<<1],w[N<<1],r[N],sz[N],mn,Rt; ll ans; int rt[2][N],tot,c[M][2],vl[M],siz[M],fa[M],pre[N][K],dis[N][K],dep[N]; bool vis[N]; void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;} void pshp(int cr){siz[cr]=siz[c[cr][0]]+siz[c[cr][1]]+1;} void rotate(int x) {int y=fa[x],z=fa[y],d=(x==c[y][1]);if(z)c[z][y==c[z][1]]=x;fa[x]=z;fa[c[x][!d]]=y; fa[y]=x;c[y][d]=c[x][!d]; c[x][!d]=y;pshp(y);pshp(x); } void splay(int x) {while(fa[x]){int y=fa[x],z=fa[y];if(z)((x==c[y][0])^(y==c[z][0]))?rotate(x):rotate(y);rotate(x);} } void inst(int &cr,int v,int pr) {if(!cr){cr=++tot;c[cr][0]=c[cr][1]=0;fa[cr]=pr;vl[cr]=v;siz[cr]=1;return;}siz[cr]++;if(v<=vl[cr])inst(c[cr][0],v,cr);else inst(c[cr][1],v,cr); } void ins(int x,int v,bool fx) {inst(rt[fx][x],v,0);splay(tot);rt[fx][x]=tot; } int fnd(int cr,int v) {if(!cr)return -1;int ret=(vl[cr]>=v?fnd(c[cr][0],v):fnd(c[cr][1],v));if(ret==-1&&vl[cr]>=v)ret=cr;return ret; } void dfsx(int cr) {int ls=c[cr][0],rs=c[cr][1];printf(" cr=%d(%d %d) c0=%d(%d %d) c1=%d(%d %d)\n",cr,vl[cr],siz[cr],ls,vl[ls],siz[ls],rs,vl[rs],siz[rs]);if(ls)dfsx(ls); if(rs)dfsx(rs); } int qry(int x,int v,bool fx) {int cr=fnd(rt[fx][x],v);if(cr==-1)return 0; splay(cr); rt[fx][x]=cr;return siz[c[cr][1]]+1; } void getrt(int cr,int fa,int s) {sz[cr]=1;int mx=0;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)getrt(v,cr,s),sz[cr]+=sz[v],mx=Mx(mx,sz[v]);mx=Mx(mx,s-sz[cr]); if(mx<mn)mn=mx,Rt=cr; } void dfs(int cr,int fa,int d) {pre[cr][++dep[cr]]=Rt;dis[cr][dep[cr]]=d;ins(Rt,r[cr]-d,0);if(dep[cr]>1)ins(Rt,r[cr]-dis[cr][dep[cr]-1],1);for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,d+w[i]); } void solve(int cr,int s) {vis[cr]=1;dfs(cr,0,0);for(int i=hd[cr],v;i;i=nxt[i]){if(vis[v=to[i]])continue;int ts=(sz[v]<sz[cr]?sz[v]:s-sz[cr]);mn=N;getrt(v,cr,ts);solve(Rt,ts);} } void cz(int s) {tot=0;for(int i=1;i<=s;i++)vis[i]=0;for(int i=1;i<=s;i++)dep[i]=0;for(int i=1;i<=s;i++)rt[0][i]=rt[1][i]=0;mn=N;getrt(1,0,s);solve(Rt,s); }
a.hpp
#include<cstdio> #include<cstring> #include<algorithm> #include<ctime> #define ll long long #include "a.hpp" using namespace std; const int M1=1000,M2=1000; int main() {srand(time(0));srand(rand());n=N;//n=rand()%N+1;printf("%d\n%d\n",rand()%20+1,n);r[1]=rand()%M2+1;printf("0 0 %d\n",r[1]);ins(1,r[1],0);dep[1]=1;dis[1][1]=0;pre[1][1]=1;int pr,tw;for(int i=2,T=1;i<=n;i++,T++){if(T==base)cz(i-1),T=0;pr=rand()%(i-1)+1;tw=rand()%M1+1;r[i]=rand()%M2+1;printf("%lld %d %d\n",pr^(ans%mod),tw,r[i]);add(pr,i,tw);add(i,pr,tw);for(int j=1;j<=dep[pr];j++){pre[i][j]=pre[pr][j];dis[i][j]=dis[pr][j]+tw;ins(pre[i][j],r[i]-dis[i][j],0);if(j>1)ins(pre[i][j],r[i]-dis[i][j-1],1);}dep[i]=dep[pr]+1;pre[i][dep[i]]=i;ins(i,r[i],0);if(dep[i]>1)ins(i,r[i]-dis[i][dep[i]-1],1);for(int j=1;j<dep[i];j++){int u=pre[i][j],v=pre[i][j+1],d=dis[i][j]-r[i];ans+=qry(u,d,0);ans-=qry(v,d,1);}}return 0; }
mk.cpp
尝试改一改。设一个 base , 重构点分树只重构不平衡的那部分。再把 splay 的一些操作写成非递归的,就能过 85 分。主要是 r <= 10 的数据过不了。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long #define db double #define pb push_back #define ls c[cr][0] #define rs c[cr][1] using namespace std; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } int Mn(int a,int b){return a<b?a:b;} int Mx(int a,int b){return a>b?a:b;} const int N=1e5+5,K=100,M=N*K,mod=1e9; const db base=0.77; int n,hd[N],xnt,to[N<<1],nxt[N<<1],w[N<<1],r[N],sz[N],mn,Rt; ll ans; int rt[2][N],tot,c[M][2],vl[M],siz[M],fa[M],pre[N][K],dis[N][K],dep[N]; int delpl[M],top; bool vis[N]; vector<int> vt[N]; void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;} void pshp(int cr){siz[cr]=siz[c[cr][0]]+siz[c[cr][1]]+1;} void rotate(int x) {int y=fa[x],z=fa[y],d=(x==c[y][1]);if(z)c[z][y==c[z][1]]=x;fa[x]=z;fa[c[x][!d]]=y; fa[y]=x;c[y][d]=c[x][!d]; c[x][!d]=y;pshp(y);pshp(x); } void splay(int x) {for(int y,z;fa[x];rotate(x)){y=fa[x];z=fa[y];if(z) ((x==c[y][0])^(y==c[z][0]))?rotate(x):rotate(y);} } int nwnd() {int ret=(top?delpl[top--]:++tot);c[ret][0]=c[ret][1]=0;siz[ret]=1;return ret; } void ins(int x,int v,bool fx,bool nd) {if(!rt[fx][x]){rt[fx][x]=nwnd();vl[rt[fx][x]]=v;fa[rt[fx][x]]=0;return;}int cr=rt[fx][x],pr=0;while(1){siz[cr]++;pr=cr;if(v<=vl[cr]){if(!ls){ls=nwnd();fa[ls]=cr;vl[ls]=v;break;}cr=ls;}else{if(!rs){rs=nwnd();fa[rs]=cr;vl[rs]=v;break;}cr=rs;}}if(nd)splay(cr),rt[fx][x]=cr; } void dfs_del(int cr) {delpl[++top]=cr;if(ls)dfs_del(ls);if(rs)dfs_del(rs); } void del(int cr) {dfs_del(rt[0][cr]);if(dep[cr]>1)dfs_del(rt[1][cr]);rt[0][cr]=rt[1][cr]=0; } int fnd(int cr,int v) {int ret=-1;while(cr){if(vl[cr]>=v)ret=cr,cr=ls;else cr=rs;}return ret; } int qry(int x,int v,bool fx) {int cr=fnd(rt[fx][x],v);if(cr==-1)return 0; splay(cr); rt[fx][x]=cr;return siz[rs]+1; } void getrt(int cr,int fa,int s) {sz[cr]=1;int mx=0;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)getrt(v,cr,s),sz[cr]+=sz[v],mx=Mx(mx,sz[v]);mx=Mx(mx,s-sz[cr]); if(mx<mn)mn=mx,Rt=cr; } void dfs(int cr,int fa,int d) {pre[cr][++dep[cr]]=Rt;dis[cr][dep[cr]]=d;vt[Rt].pb(cr);ins(Rt,r[cr]-d,0,1);if(dep[cr]>1)ins(Rt,r[cr]-dis[cr][dep[cr]-1],1,1);for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,d+w[i]); } void solve(int cr,int s) {vis[cr]=1;vt[cr].clear();rt[0][cr]=rt[1][cr]=0;dfs(cr,0,0);for(int i=hd[cr],v;i;i=nxt[i]){if(vis[v=to[i]])continue;int ts=(sz[v]<sz[cr]?sz[v]:s-sz[cr]);mn=N;getrt(v,cr,ts);solve(Rt,ts);} } void cz(int cr) {int s=vt[cr].size();for(int i=0,d,t=dep[cr]-1;i<s;i++){d=vt[cr][i];vis[d]=0;del(d);dep[d]=t;}//t!!mn=N;getrt(cr,0,s);solve(Rt,s); } int main() {int bh=rdn();n=rdn();int pr=rdn()%mod,tw=rdn();r[1]=rdn();puts("0");ins(1,r[1],0,0);dep[1]=1;dis[1][1]=0;pre[1][1]=1;vt[1].pb(1);vis[1]=1;bh=0;for(int i=2;i<=n;i++){pr=rdn()^(ans%mod);tw=rdn();r[i]=rdn();add(pr,i,tw);add(i,pr,tw);for(int j=1,u,v;j<=dep[pr];j++,v=u){u=pre[i][j]=pre[pr][j];dis[i][j]=dis[pr][j]+tw;ins(u,r[i]-dis[i][j],0,0);if(j>1)ins(u,r[i]-dis[i][j-1],1,0);vt[u].pb(i);if(!bh&&j>1&&vt[u].size()>vt[v].size()*base)bh=v;}dep[i]=dep[pr]+1;pre[i][dep[i]]=i; vis[i]=1;ins(i,r[i],0,0);if(dep[i]>1)ins(i,r[i]-dis[i][dep[i]-1],1,0);vt[i].pb(i);for(int j=1;j<dep[i];j++){int u=pre[i][j],v=pre[i][j+1],d=dis[i][j]-r[i];ans+=qry(u,d,0);ans-=qry(v,d,1);}printf("%lld\n",ans);if(bh)cz(bh),bh=0;}return 0; }
View Code
然后学习一下 SBT ,还是过不了,有 80 分。于是不想管了。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long #define db double #define pb push_back #define ls c[cr][0] #define rs c[cr][1] using namespace std; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } int Mn(int a,int b){return a<b?a:b;} int Mx(int a,int b){return a>b?a:b;} const int N=1e5+5,K=100,M=N*K,mod=1e9; const db base=0.77; int n,hd[N],xnt,to[N<<1],nxt[N<<1],w[N<<1],r[N],sz[N],mn,Rt; ll ans; int rt[2][N],tot,c[M][2],vl[M],siz[M],fa[M],pre[N][K],dis[N][K],dep[N]; int delpl[M],top; bool vis[N]; vector<int> vt[N]; void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;} void pshp(int cr){siz[cr]=siz[c[cr][0]]+siz[c[cr][1]]+1;} void rotate(int &cr,int d) {int y=c[cr][!d];c[cr][!d]=c[y][d]; c[y][d]=cr;pshp(cr); pshp(y); cr=y; } void maintain(int cr,int d) {if(siz[c[c[cr][d]][d]]>siz[cr])rotate(cr,!d);else if(siz[c[c[cr][d]][!d]]>siz[cr])rotate(c[cr][d],d),rotate(cr,!d);else return;/// maintain(ls,0); maintain(rs,1);maintain(cr,0); maintain(cr,1); } int nwnd() {int cr=(top?delpl[top--]:++tot);siz[cr]=1;return cr; } void ins(int &cr,int v,int pr=0) {if(!cr){cr=nwnd();fa[cr]=pr;vl[cr]=v;return;}siz[cr]++;bool d=(v>vl[cr]); ins(c[cr][d],v,cr); maintain(cr,d); } void del(int &cr) {delpl[++top]=cr;if(ls)del(ls);if(rs)del(rs); cr=0; } int qry(int cr,int v) {if(!cr)return 0;if(vl[cr]>=v)return siz[rs]+1+qry(ls,v);return qry(rs,v); } void getrt(int cr,int fa,int s) {sz[cr]=1;int mx=0;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)getrt(v,cr,s),sz[cr]+=sz[v],mx=Mx(mx,sz[v]);mx=Mx(mx,s-sz[cr]); if(mx<mn)mn=mx,Rt=cr; } void dfs(int cr,int fa,int d,int t) {pre[cr][++dep[cr]]=Rt;dis[cr][dep[cr]]=d;vt[Rt].pb(cr);ins(rt[0][Rt],r[cr]-d);if(t)ins(rt[1][Rt],r[cr]-dis[cr][t]);for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,d+w[i],t); } void solve(int cr,int s,int t)//t:dep[Rt]-1 {vis[cr]=1;vt[cr].clear();rt[0][cr]=rt[1][cr]=0;dfs(cr,0,0,t);for(int i=hd[cr],v;i;i=nxt[i]){if(vis[v=to[i]])continue;int ts=(sz[v]<sz[cr]?sz[v]:s-sz[cr]);mn=N;getrt(v,cr,ts);solve(Rt,ts,t+1);} } void cz(int cr) {int s=vt[cr].size(),t=dep[cr]-1;//t!!for(int i=0,d;i<s;i++){d=vt[cr][i];vis[d]=0;del(rt[0][d]);if(dep[d]>1)del(rt[1][d]);dep[d]=t;}mn=N;getrt(cr,0,s);solve(Rt,s,t); } int main() {int bh=rdn();n=rdn();int pr=rdn()%mod,tw=rdn();r[1]=rdn();puts("0");ins(rt[0][1],r[1]);dep[1]=1;dis[1][1]=0;pre[1][1]=1;vt[1].pb(1);vis[1]=1;bh=0;for(int i=2;i<=n;i++){pr=rdn()^(ans%mod);tw=rdn();r[i]=rdn();add(pr,i,tw);add(i,pr,tw);vis[i]=1; dep[i]=dep[pr]+1; int lm=dep[i];//vis[]for(int j=1,u,v;j<=lm;j++,v=u){u=pre[i][j]=(j==lm?i:pre[pr][j]);dis[i][j]=(j==lm?0:dis[pr][j]+tw);ins(rt[0][u],r[i]-dis[i][j]);if(j>1)ins(rt[1][u],r[i]-dis[i][j-1]);vt[u].pb(i);if(!bh&&j>1&&vt[u].size()>vt[v].size()*base)bh=v;}for(int j=1,u=pre[i][j],v,d;j<lm;j++,u=v){v=pre[i][j+1];d=dis[i][j]-r[i];ans+=qry(rt[0][u],d);ans-=qry(rt[1][v],d);}printf("%lld\n",ans);if(bh)cz(bh),bh=0;}return 0; }
View Code
转载于:https://www.cnblogs.com/Narh/p/10266603.html
UOJ 55 【WC2014】紫荆花之恋——点分治+平衡树相关推荐
- BZOJ 3435: [Wc2014]紫荆花之恋 【(替罪羊树式)动态点分治 + Treap】
BZOJ 传送门 洛谷传送门 题目分析: 似乎做过几道点分树的题之后题解还是比较好懂的. 这位dalao的题目分析非常的到位,Orz. PoPoQQQ的具体解读也非常的清晰,Orz. R i + R ...
- BZOJ3435[Wc2014]紫荆花之恋——动态点分治(替罪羊式点分树套替罪羊树)
题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...
- NKOJ 2703 (WC 2014)紫荆花之恋 (点分治+平衡树+替罪羊)
P2703[WC2014]紫荆花之恋(强数据版) 问题描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花废物的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了 ...
- python画图绘制紫荆花_数据结构(平衡树,树分治,暴力重构):WC 2014 紫荆花之恋(示例代码)...
[题目描述] 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这棵大树实际上是一个带权 ...
- 半小时写完替罪羊重构点分树做动态动态点分治之紫荆花之恋的wyy贴心指导
刷题训练 初学者 有一定语言基础,但是不了解算法竞赛,水平在联赛一等奖以下的. 参考书:<算法竞赛入门经典--刘汝佳>,<算法竞赛入门经典训练指南--刘汝佳> 题库:洛谷(历年 ...
- 【WC2014】紫荆花之恋【替罪羊思想】【动态点分树】【替罪羊树】
传送门 题意:有一棵开始时没有结点的树,nnn次询问,每次新加一点并给定父结点.到父亲的距离.参数rir_iri,并询问满足dist(u,v)≤ru+rvdist(u,v)\leq r_u+r_vd ...
- [UOJ55]紫荆花之恋
第一次打"真正的"动态点分 如果树是静态的,直接点分:用$d_x$代表$x$到分治中心的距离,限制条件即为$d_i+d_j\leq r_i+r_j$,考虑枚举$j$,那么我们要查询 ...
- nssl1248-B【点分治,平衡树】
正题 题目大意 有一颗树,求一条路径长度k,要求S≤k≤ES\leq k\leq ES≤k≤E,求最小的k. 解题思路 其实对于每个点进行点分治,每次将整棵子树的路径加入平衡树,然后在统计一次答案.时 ...
- 点分治动态点分治小结
(写篇博客证明自己还活着×2) 转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/8006488.html 有的时候,我们会发现这样一类题:它长得很像一个$O(n) ...
- 2018十二月刷题列表
Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...
最新文章
- linux 手动添加 swap 分区
- springmvc-返回值
- php验证ip地址的函数,php使用preg_match()函数验证ip地址的方法
- 【转载】Meta http-equiv属性详解
- Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision
- 爬取猫眼电影相关信息
- Uploadify 控件上传图片 + 预览
- 【空间分析】3 专题数据的数据分级
- 高清银行LOGO图片整合分享
- knockoutjs与ajax,MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象
- 树莓派4B全40管脚对应功能示意图
- 关于使用Git pull出现冲突“error: Your local changes to the following files would be overwritten by merge”解决方案
- 环境诉讼与当事人适格
- 揭开 Xxl-job 的神秘面纱
- 深度学习应用于脑电信号处理
- WSA无法调用GPU跑分解决方法
- 计算机多媒体技术的应用,计算机多媒体技术及其应用.ppt
- nginx代理图片和视频
- 投资银行理论与实务(一):投资银行学概论
- 全瓷牙冠-市场现状及未来发展趋势