牛客国庆集训派对Day4 A思维 D思维 G公式,规律 I 组合 J模拟

版权声明:本文为博主原创文章,未经博主允许也可以转载。 https://blog.csdn.net/FrankAx/article/details/82945086

A

Code:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
int main(){	
	double n ;
	cin >> n ; 
	printf("%.6lf\n",n);
	return 0 ; 
}

D
思路:按照Kruscal算法的思路,排序,然后最小的相加。
Code:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int AX = 1e6 + 66 ;
int a[AX];
int main(){	
	int n ;
	cin >> n ;
	for( int i = 1 ; i <= n ; i++ ){
		cin >> a[i] ; 
	}
	sort( a + 1 , a + n + 1 ) ; 
	LL res = 0 ;
	for( int i = 2 ; i <= n ; i++ ){
		res += ( a[1] + a[i] ) ;
	}
	cout << res << endl;
	return 0 ; 
}

G
思路:没推公式,只是找了规律,整个式子其实就是求所有区间的和乘以w[区间长度]
,然后我们考虑相同区间长度i,发现加到最后前i-1个数依次加了1,2,3…i-1次,后i-1个数也是如此,中间的数都加了i次。
那么预处理出前缀和,以及各项与所在位置的乘积即可。
Code:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int AX = 3e5 + 66 ;
const LL MOD = 1e9 + 7 ;
LL a[AX];
LL w[AX];
LL sum1[AX];
LL f[AX];
LL g[AX];
int main(){
	LL n ;
	cin >> n ;
	for( int i = 1 ; i <= n ; i++ ){
		cin >> a[i] ; 
	}
	for( int i = 1 ; i <= n ; i++ ){
		cin >> w[i] ;
	}
	for( int i = 1 ; i <= n ; i++ ){
		sum1[i] = sum1[i-1] + a[i] ; 
		sum1[i] %= MOD ;
	}
	for( int i = 1 ; i <= n ; i++ ){
		f[i] = f[i-1] + 1LL * i * a[i] % MOD ; 
		f[i] %= MOD ; 
	}

	for( int i = n ; i >= 1 ; i-- ){
		g[i] = g[i+1] + 1LL * ( n - i + 1 ) * a[i] % MOD ; 
		g[i] %= MOD;
	}
	LL res = 0LL;
	for( int i = 1 ; i <= n ; i++ ){
		res += ( 1LL * i * ( ( sum1[n-i+1] + MOD - sum1[i-1] ) % MOD ) % MOD + f[i-1] %MOD + g[n-i+2] % MOD ) * 1LL * w[i] % MOD ;
		res %= MOD ;
	}
	cout << res % MOD << endl;
	return 0 ; 
}

I
思路:一个根节点连接n条链,每条单独的联通子树为( x + 1 ) * x / 2
各个链之间一直累乘x+1.
Code:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int MOD = 998244353;
int main(){
    int n ;
    cin >> n ; 
    LL x ; 
    LL ans2 = 0LL;
    LL ans1 = 1LL;
    for( int i = 0 ; i < n ; i++ ){
        cin >> x;
        ans1 *= ( x + 1 );
        ans1 %= MOD ;
        ans2 += 1LL*(x+1)*x/2LL ;
        ans2 %= MOD ;
    }
    cout << ( ans1 + ans2 ) % MOD << endl;
}

J
关键点:复读机全都是复读。。
Code:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int AX = 1e3 + 66 ;
int mark[AX] ;
int main(){	
	int n , m ;
	cin >> n >> m ; 
	string s[2] ; 
	int cur = 0 ;
	int id ; 
	for( int i = 1 ; i <= n ; i++ ) mark[i] = 1 ;
	for( int i = 0 ; i < m ; i++ ){
		cin >> id >> s[cur] ; 
		if( !i ) { mark[id] = 0 ; cur = !cur ; continue; }
		if( s[cur] != s[!cur] ) mark[id] = 0 ; 
		cur = !cur ; 
	}
	for( int i = 1 ; i <= n ; i++ ){
		if( mark[i] ) cout << i << ' '; 
	}cout << endl;
	return 0 ; 
}

猜你喜欢

转载自blog.csdn.net/FrankAx/article/details/82945086