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 ;
}