牛客国庆集训派对Day4

A:把b=n;

#include<cstdio>
#include<bits/stdc++.h>
#include<algorithm>
#include<string.h>
using namespace std;
 
int main() {
    double n;
    scanf("%lf", &n);
    printf("%.6lf\n", n);
    return 0;
}

D:由于是个完全图,选择一个权值最小的点,其他所有的点向它连接就行了。注意点为1的时候输出0;

#include<cstdio>
#include<bits/stdc++.h>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e5 + 10;
LL a[MAXN];
 
int main() {
    LL n; LL sum = 0, ans = (1ll << 60);
    scanf("%lld", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%lld", &a[i]);
        sum += a[i];
        ans = min(ans, a[i]);
    }
    printf("%lld\n", sum + ans * (n - 2));
    return 0;
}

G:枚举区间长度,那么对于区间长度为len时,a[i]位置就会被覆盖len次(前端和后端的覆盖预处理,达不到len次);

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const LL mod = 1e9 + 7;
const int MAXN = 3e5 + 10;
LL a[MAXN], w[MAXN], b[MAXN];
LL sum[MAXN];
 
int main() {
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%lld", &a[i]);
        sum[i] = a[i] + sum[i - 1];
        sum[i] %= mod;
    }
    for(int i = 1; i <= n; ++i) scanf("%lld", &w[i]);
    /*
    LL u = 0;
    for(int i = 1; i <= n; ++i) {
        for(int j = i; j <= n; ++j) {
            u += (sum[j] - sum[i - 1]) * w[j - i + 1];
            u %= mod;
        }
    }
    printf("## %lld\n", u);
    */
    for(int i = n; i >= 1; --i) {
        b[i] = b[i + 1] + (a[i] * (n - i + 1ll)) % mod;
        b[i] %= mod;
    //    printf("# %lld\n", b[i]);
    }
    LL res = 0, ans = 0;
    for(LL i = 1; i <= n; ++i) {
        res = res + (a[i] * i) % mod; res %= mod;
     //   printf("%lld %lld\n", res, ans);
        LL cnt = (sum[n - i] - sum[i] + mod) % mod * i % mod;
        ans += (res + cnt + b[n - i + 1]) % mod * w[i];
        ans %= mod;
    }
    printf("%lld\n", ans);
    return 0;
}

H:
结论:每层的黑点数都是偶数则后手胜,否则先手胜;

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define met(s) memset(s, 0, sizeof(s))
#define rep(i, a, b) for(int i = a; i <= b; ++i)
template <class T> inline void scan_d(T &ret) {
char c; ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9') {
ret = ret * 10 + (c - '0'), c = getchar();}}
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const int MAXN = 1e3 + 5;
vector<int> G[MAXN];
int col[MAXN], num[MAXN];

void dfs(int x, int fa, int d) {
	if(col[x] == 1) num[d]++;
	for(int i = 0; i < G[x].size(); ++i) {
		int u = G[x][i];
		if(u == fa) continue;
		dfs(u, x, d + 1);
	}
}

int main() {
	int n;
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i) scanf("%d", &col[i]);
	for(int i = 1; i < n; ++i) {
		int a, b;
		scanf("%d %d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	dfs(1, -1, 0);
	bool flag = true;
	for(int i = 0; i < MAXN; ++i) {
		if(num[i] & 1) {
			flag = false;
			break;
		}
	}
	if(!flag) puts("First");
	else puts("Second");
	return 0;
}

I:
带根节点: ( a [ i ] + 1 ) ∗ ( a [ i + 1 ] + 1 ) ∗ ( a [ i + 2 ] + 1 ) . . . (a[i] + 1)*(a[i + 1] + 1) * (a[i + 2] + 1)... (a[i]+1)(a[i+1]+1)(a[i+2]+1)...
不带根节点: k ∗ ( k + 1 ) / 2 k * (k + 1) / 2 k(k+1)/2.

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const LL mod = 998244353;
const int MAXN = 1e7 + 10;

int main() {
    int n; LL sum = 0, ans = 1, k;
    scanf("%d", &n); 
    for(int i = 1; i <= n; ++i) {
        scanf("%lld", &k);
        sum += (k * (k + 1) / 2) % mod;
        sum %= mod;
        ans *= (k + 1);
        ans %= mod;
    }
    printf("%lld\n", (ans + sum) % mod);
    return 0;
}

J:
不说话的也有可能是复读机;

#include<cstdio>
#include<bits/stdc++.h>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e5 + 10;
char str[1010][210];
int a[2010], b[2010], vis[2010];
int vi[2010];
 
int main() {
    int n, m, ans; int p = 0;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; ++i) {
        getchar();
        scanf("%d %s", &a[i], str[i]);
        vi[a[i]] = 1;
        if(i == 1) ans = a[i];
        else if(a[i] != ans) {
            if(!strcmp(str[i], str[i - 1])) {
                b[p++] = a[i];
            } else vis[a[i]] = 1;
        }
    }
    for(int i = 1; i <= n; ++i) {
        if(!vi[i]) b[p++] = i;
    }
    sort(b, b + p); bool flag = false;
    for(int i = 0; i < p; ++i) {
        if(!vis[b[i]]) {
            if(flag) printf(" ");
            printf("%d", b[i]);
            vis[b[i]] = 1;
            flag = true;
        }
    }
    puts("");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值