白いレースオフ+ -half月、高精度な牛23のC完全グラフ問題

完全グラフ

タイトル説明

異なる頂点の各対の間だけでも、一側が接続され有し数学の図の理論は、完全グラフは、単純な無向グラフです。---- Baiduの百科事典が
完成しましグラフ含むn個の頂点を与え、あなたはグラフのエッジの一部を削除することができ、エッジは、mは項目を削除超えることができない、といくつかのアップ後に省略側面ビューを尋ねます連結成分?

入力説明:
最初の行の番号Tを含み、試験データの数が設定示す
2つの正の整数の次にTラインをN、M、スペースで中間分離
出力説明:
各整数回答を表し、出力Tラインを


まず/無向完全グラフは、n有し*(N-1)2エッジを知っていなければなりません。

その後、法律を起動することができます。

削除エッジ 部品の数を伝えます
N-1 1
N-1 + N-2 2
N-1 + N 2 + N-3 3
... ...

列挙子は、連結成分の半数は、xすることができ、除去されるエッジの数、及びその後Mの比較を算出します。

しかし、この問題は、代わり__int128 longlongs使用することができるより多くの異常なデータ範囲です。

コード:

#include<bits/stdc++.h>
#define LL unsigned long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=1000100;
const LL mod=100000000;
inline __int128 read(){//输入模板 
    __int128 x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
inline void print(__int128 x){//输出模板 
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9)
        print(x/10);
    putchar(x%10+'0');
}
__int128 n,m;
int judge(__int128 p){
	__int128 q=p-1;
	__int128 s1=n*q-q*(q+1)/2;
	__int128 s2=s1+n-p;
	if(m<s1) return 0;
	if(s1!=s2&&m>=s1&&m<s2) return 1;
	else if(s1==s2&&m>=s1) return 1;
	return 2;
}
int main(){
	__int128 t=read();
	while(t--){
		n=read(),m=read();
		__int128 l=1,r=n;//二分连通分量 
		__int128 ans=1;
		while(l<=r){
			__int128 d=(l+r)/2;
			int ok=judge(d);
			if(ok==0) r=d-1;
			else if(ok==2) l=d+1; 
			else{
				ans=d;
				break;
			}
		}
		print(ans);
		cout<<endl;
	} 
    return 0;
}

公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105028573