NOIP模拟测试20

Liu_runda聚聚的馈赠(

Problem A: 周

防自闭题?

这道题让我整个考试都很愉悦(

搜就完事了

 1 #include <bits/stdc++.h>
 2 
 3 int n;
 4 int a[20], b[20], c[20], d[20];
 5 long long ans;
 6 
 7 void dfs(int day, long long oi, long long whk) {
 8     if (day == n + 1) {
 9         ans = std::max(ans, oi * whk);
10         return;
11     }
12     long long x, y;
13     x = oi - b[day] < 0 ? 0 : oi - b[day], y = whk + a[day];
14     dfs(day + 1, x, y);
15     x = oi + c[day], y = whk - d[day] < 0 ? 0 : whk - d[day];
16     dfs(day + 1, x, y);
17 }
18 
19 signed main() { 
20     scanf("%d", &n);
21     for (int i = 1; i <= n; i++)
22         scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
23     dfs(1, 0, 0);
24     printf("%lld\n", ans);
25     return 0;
26 }
A

Problem B: 任

题目保证黑点之间只有一条简单路径,显然相邻黑点连边就是一颗树。

求森林有几棵树:总点数-边数。

二维前缀和ning干:记点的前缀和、行上边的前缀和、列上边的前缀和、边的前缀和。

加加减减乱搞一下就有了。 

 1 #include <bits/stdc++.h>
 2 
 3 int n, m, q;
 4 int color[2005][2005], sum[2005][2005], edge[2005][2005];
 5 int row[2005][2005], col[2005][2005];
 6 
 7 signed main() {
 8     scanf("%d%d%d", &n, &m, &q);
 9     for (int i = 1; i <= n; i++) {
10         for (int j = 1; j <= m; j++) {
11             scanf("%1d", &color[i][j]);
12             row[i][j] = (color[i][j-1] + color[i][j]) == 2;
13             col[i][j] = (color[i-1][j] + color[i][j]) == 2;
14             sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
15             edge[i][j] = edge[i-1][j] + edge[i][j-1] - edge[i-1][j-1];
16             sum[i][j] += color[i][j];
17             edge[i][j] += row[i][j] + col[i][j];
18         } 
19     }
20     for (int i = 1; i <= n; i++)
21         for (int j = 1; j <= m; j++)
22             row[i][j] += row[i][j-1];
23     for (int j = 1; j <= m; j++)
24         for (int i = 1; i <= n; i++)
25             col[i][j] += col[i-1][j];
26     for (int i = 1; i <= q; i++) {
27         int x_1, x_2, y_1, y_2;
28         scanf("%d%d%d%d", &x_1, &y_1, &x_2, &y_2);
29         int point = sum[x_2][y_2] - sum[x_1-1][y_2] - 
30                     sum[x_2][y_1-1] + sum[x_1-1][y_1-1];
31         int edg = edge[x_2][y_2] - edge[x_1][y_2] - edge[x_2][y_1] + edge[x_1][y_1];
32         int waste = row[x_1][y_2] + col[x_2][y_1] - row[x_1][y_1] - col[x_1][y_1];
33         printf("%d\n", point - edg - waste);
34     }
35     return 0;
36 }
B

Problem C: 飞

 2h做一道题((

首先能看出来是求逆序对数。

恶意的出题人把size卡到32M Orz

本题专属奇妙性质:x在每一段是一个等差数列,而且题目保证x互不相同。

首先他有一个固定的形式:$x_{i+1} = x_i + a$。

我们就钦定它小于P,大于再说(

我们再钦定和x_i组成的逆序对数为m,之前已经组成了k个等差数列。

由于$x_{i+1}$小于P,之前的每个等差数列都必定存在一个数大于$x_i$小于$x_{i+1}$,因此每个等差数列会少一对逆序对,与$x_{i+1}$组成的逆序对数为m-k。

递推总要有个起点8?根据等差数列的首项确定等差数列。因此树状数组还是要开的,不过在a上开就行,这样空间就够用了。

对拍的时候发现一个坑:可能第一个等差数列起点就比$x_i$大了,特判掉就吼了(

 1 #include <bits/stdc++.h>
 2 
 3 const int N = 1e5 + 3;
 4 int n, x_1, a, mod, now, chaos, sairai;
 5 long long ans = 0;
 6 
 7 struct BIT {
 8     int tr[N];
 9     void add(int x) {
10         ++x;
11         for (; x < N; x += x & -x) ++tr[x];
12     }
13     int ask(int x) {
14         int ret = 0;
15         ++x;
16         for (; x; x -= x & -x) ret += tr[x];
17         return ret;
18     }
19 } bit;
20 
21 signed main() {
22     scanf("%d%d%d%d", &n, &x_1, &a, &mod);
23     now = x_1;
24     for (int i = 1; i <= n; ++i) {
25         if (now < a) {
26             chaos = i - bit.ask(now) - 1;
27             ans += chaos;
28             bit.add(now);
29         } else {
30             chaos -= sairai;
31             if (x_1 > now) ++chaos;
32             ans += chaos;
33         }
34         now += a; 
35         if (now >= mod) {
36             now -= mod;
37             ++sairai;
38         }
39     }
40     printf("%lld\n", ans);
41     return 0;
42 }
C

转载于:https://www.cnblogs.com/gekoo/p/11354293.html

NOI(全国青少年信息学奥林匹克竞赛)模拟赛的测试数据是指用于评测参赛选手的程序的输入和对应的输出。测试数据是非常重要的,因为它决定了参赛选手的程序能否正确地解决问题。 在NOI模拟赛中,测试数据具有以下特点: 1.充分覆盖:测试数据应涵盖各种可能的输入情况,包括边界条件和极端情况。通过提供不同的测试数据,可以考察选手对问题的全面理解和解决能力。 2.随机性和均衡性:为了公平起见,测试数据应该是随机生成的,而不是针对某个特定算法或解法设计的。同时,测试数据应该是均衡的,即各种情况的概率应该大致相等,以避免偏向某些解法。 3.合理性和可行性:测试数据应该是合理和可行的,即符合题目要求的输入数据,并且是选手能够通过编写程序来处理的。测试数据应该考虑到程序的限制和时间复杂度,以充分测试选手的编程能力。 NOI模拟赛的测试数据通常由经验丰富的考题组负责生成。他们会根据题目的要求和限制,设计出一组合理、充分、随机和均衡的测试数据,以确保参赛选手的程序在各种情况下都能正确运行,并且能通过性能测试。 总之,测试数据在NOI模拟赛中起到了至关重要的作用,它既考察了选手对问题的理解和解决能力,又提高了选手编程的技巧和效率。同时,合理和恰当的测试数据也是公平竞赛的保证,确保每个参赛选手有相同的机会和条件进行竞争。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值