如何跳过网站会员,上海景朋建设工程有限公司网站,网站建设方案范文2000字,广告公司记账管理软件​ 先考虑简单一点的情况。#xff08;称刚开始就有的弦为旧弦#xff0c;要新加的为新弦#xff09;。1.k0对于这种全是新弦的情况。将点1连点(n/2)1,点2连点(n/2)2...点n连点2n。这样可以做到每一条弦都可以与其他的弦相交#xff0c;答案为。2.k1对于这种只有一条旧弦的…​先考虑简单一点的情况。称刚开始就有的弦为旧弦要新加的为新弦。1.k0对于这种全是新弦的情况。将点1连点(n/2)1,点2连点(n/2)2...点n连点2n。这样可以做到每一条弦都可以与其他的弦相交答案为。2.k1对于这种只有一条旧弦的情况我们设旧弦上边有a个点下边有b个点(钦定ab上边或下边是不重要的)。类比k0的情况将上边与下边的点连线是最优的这时候会出现a(也就是min(a,b))个点。这时候旧弦就没啥用了剩下的ab个点就可以看成是一个新圆也就是k0的情况了答案就是a(与旧弦连的)(新的)。而k变得越来越大也是一样的。具体做法为设数组p[i][0/1]表示第i条弦的两个顶点(0表示存储编号较小的顶点1表示更大的)。vis[i]0/1表示这个点是(1)不是(0)旧弦的顶点。a[i]表示存储不是旧弦的顶点。然后分两步操作第一步(新弦与旧弦组成的最多顶点数):for(int i1;ik;i){ for(int ji1;jn;j){ if((f(p[i][0],p[j][0],p[i][1],p[j][1])true)||(f(p[j][0],p[i][0],p[j][1],p[i][1]))){ ans; } } } /* ab,cd则两条弦相交 acbd或cadb */第二步(将剩下的旧弦看成一个新圆的新出现的顶点):为ans(n-k)*(n-k-1)/2;也就是。求赞。代码(c)#includebits/stdc.h using namespace std; typedef long long ll; const int N2e25; int T,n,k,a[N],p[N][2]; bool vis[N]; bool f(int a,int b,int c,int d){ if(abbccd){ return true; } return false; } int main(){ scanf(%d,T); while(T--){ int cnt0; memset(p,0,sizeof p); memset(a,0,sizeof a); scanf(%d%d,n,k); for(int i1;i2*n;i) vis[i]0; for(int i1;ik;i){ int x,y; scanf(%d%d,x,y); p[i][0]min(x,y),p[i][1]max(x,y); vis[x]1,vis[y]1; } if(k0){ printf(%d\n,n*(n-1)/2); continue; } for(int i1;i2*n;i){ if(vis[i]0){ a[cnt]i; } } for(int i1;i(cnt/2);i){ p[ki][0]a[i]; p[ki][1]a[i(cnt/2)]; } int ans0; for(int i1;ik;i){ for(int ji1;jn;j){ if((f(p[i][0],p[j][0],p[i][1],p[j][1])true)||(f(p[j][0],p[i][0],p[j][1],p[i][1]))){ ans; } } } /* ab,cd则两条弦相交 acbd或cadb */ ans(n-k)*(n-k-1)/2; printf(%d\n,ans); } return ~(-1); }​