湛江市律师网站建设品牌网站建设找哪一家比较好
湛江市律师网站建设品牌,网站建设找哪一家比较好,中国500强排行榜,绵阳专业网站建设公司正题 题目大意 nnn个点的一颗树#xff0c;合法路径定义为一条路径上每个点的编号相差大于KKK。求合法路径数 解题思路
首先我们可以求不合法的路径数#xff0c;这样我们就有了K∗nK*nK∗n个不合法#xff08;即不能在同一个路径上#xff09;的点对。
然后这题就和之前…正题 题目大意
nnn个点的一颗树合法路径定义为一条路径上每个点的编号相差大于KKK。求合法路径数 解题思路
首先我们可以求不合法的路径数这样我们就有了K∗nK*nK∗n个不合法即不能在同一个路径上的点对。
然后这题就和之前一题jzoj6276一样了
大概就是用矩形表示不合法的路径之后用扫面线求矩形的面积并即可。 codecodecode
#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize(Ofast)
%:pragma GCC optimize(inline)
#includecstdio
#includecstring
#includealgorithm
#includecctype
using namespace std;
const int N3e510;
struct node{int to,next;
}a[N*2];
struct line{int x,l,r,w;
}l[N*40];
bool operator(line x,line y)
{return x.xy.x;}
int n,K,tot,cnt,num;
int rfn[N],ed[N],f[N][21],dep[N];
int w[N*4],mark[N*4],ls[N];
long long ans;
__attribute__((optimize(O3))) inline int read() {int x0,f1; char cgetchar();while(!isdigit(c)) {if(c-)f-f;cgetchar();}while(isdigit(c)) x(x1)(x3)c-48,cgetchar();return x*f;
}
void addl(int x,int y){a[tot].toy;a[tot].nextls[x];ls[x]tot;return;
}
void dfs(int x,int fa){rfn[x]cnt;for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa)continue;dep[y]dep[x]1;f[y][0]x;dfs(y,x);}ed[x]cnt;return;
}
int LCA(int x,int y){for(int i20;i0;i--)if(dep[f[y][i]]dep[x])yf[y][i];return y;
}
void addc(int x1,int x2,int y1,int y2){if(x1x2)swap(x1,x2);if(y1y1)swap(y1,y2);l[num](line){x1,y1,y2,1};l[num](line){x21,y1,y2,-1};
}
void Ban(int x,int y){if(rfn[x]rfn[y])swap(x,y);if(rfn[x]rfn[y]rfn[y]ed[x]){int topLCA(x,y);if(rfn[top]!1)addc(1,rfn[top]-1,rfn[y],ed[y]);if(ed[top]!n)addc(rfn[y],ed[y],ed[top]1,n);}else addc(rfn[x],ed[x],rfn[y],ed[y]);return;
}
void Change(int x,int L,int R,int l,int r,int val){if(LlRr){mark[x]val;if(mark[x])w[x]r-l1;else if(lr)w[x]0;else w[x]w[x*2]w[x*21];return;}int mid(LR)1;if(rmid)Change(x*2,L,mid,l,r,val);else if(lmid)Change(x*21,mid1,R,l,r,val);else Change(x*2,L,mid,l,mid,val),Change(x*21,mid1,R,mid1,r,val);if(mark[x])w[x]R-L1;else w[x]w[x*2]w[x*21];return;
}
int main()
{freopen(data.in,r,stdin);int size 256 20; //250Mchar*p(char*)malloc(size) size;__asm__(movl %0, %%esp\n :: r(p) );nread();Kread(); for(int i1;in;i){int xread(),yread();addl(x,y);addl(y,x);}dfs(1,1);for(int i1;i20;i)for(int j1;jn;j)f[j][i]f[f[j][i-1]][i-1];for(int i1;in;i)for(int ji1;jmin(iK,n);j)Ban(i,j);sort(l1,l1num);int z1;for(int i1;in;i){while(znuml[z].xi)Change(1,1,n,l[z].l,l[z].r,l[z].w),z;answ[1];}printf(%lld,1ll*n*(n-1)/2-ansn);
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90528.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!