【NOI Online】2021提高

【NOI Online】2021提高

提高组
时间:2021 年 3 月 27 日 08:30 ∼ 12:00
题目名称 愤怒的小 N 积木小赛 岛屿探险
题目类型 传统型 传统型 传统型
目录 angry block island
可执行文件名 angry block island
输入文件名 angry.in block.in island.in
输出文件名 angry.out block.out island.out
每个测试点时限 1.0 秒 1.0 秒 2.0 秒
内存限制 256 MB 256 MB 256 MB
子任务数目 20 10 20
测试点是否等分 是 是 是
提交源程序文件名
对于 C++ 语言 angry.cpp block.cpp island.cpp
编译选项
对于 C++ 语言 -lm
注意事项

  1. 文件名(包括程序名和输入输出文件名)必须使用英文小写。
  2. 结果比较方式为忽略行末空格、文末回车后的全文比较。
  3. C/C++ 中函数 main() 的返回值类型必须是 int,值为 0。
  4. 输入数据中,若一行内包含多个整数,则相邻两个整数均以一个空格分隔。不保
    证输入数据的行末没有多余空格。
    CCF NOI Online 能力测试 提高组 愤怒的小 N(angry)

愤怒的小 N(angry)

【题目描述】
极度愤怒的小 N 通关了一款游戏来泄愤。
这款游戏共有 n 关,分别为第 0 关、第 1 关、第 2 关、· · ·、第 n n 1 关。这些关
卡中有一些是普通关卡,另一些则是奖励关卡。
这款游戏中普通关卡与奖励关卡的分布比较特殊。如果用字符 a 表示普通关卡,用
字符 b 表示奖励关卡,那么第 0 关、第 1 关、第 2 关、· · ·、第 n n 1 关依次排列形成
的字符串是一个无穷字符串 s 的前缀,且 s 可以按照如下方式构造:

  1. 初始时 s 为包含单个字符 a 的字符串。
  2. 将 s 的每个字符 a 替换成字符 b,每个字符 b 替换成字符 a 得到字符串 t,然后
    将 t 拼接到 s 后。
  3. 不断执行 2. 得到的字符串就是最终的 s。
    可以发现 s = abbabaabbaababba · · ·,所以这款游戏的第 0 关是普通关卡,第 1 关
    是奖励关卡,第 2 关是奖励关卡,第 3 关是普通关卡,以此类推。
    通过游戏的第 i 关可以得到 f(i) 分,其中 f(x) = a0 + a1x + a2x2 + · · · + akk 1xkk 1
    是一个固定的 k k 1 次多项式。
    小 N 通关时一气之下通过了所有奖励关卡而忽略了所有普通关卡,然后就把游戏
    卸载了。现在回想起来,他想要知道他在卸载游戏前的总得分对 109 + 7 取模后的结果。
    【输入格式】
    从文件 angry.in 中读入数据。
    第一行一个正整数 n,表示游戏的关卡数目。为方便,n 以二进制表示给出。
    第二行一个正整数 k,表示多项式的次数加一。
    第三行 k 个非负整数,分别为 a0, a1, a2, . . . , akk 1,表示多项式的各项系数。
    【输出格式】
    输出到文件 angry.out 中。
    一行一个非负整数,表示小 N 卸载游戏前的总得分对 109 + 7 取模后的结果。
    【样例 1 输入】
    1 1000
    2 3 3 3 2 1
    第 2 页 共 9 页
    CCF NOI Online 能力测试 提高组 愤怒的小 N(angry)
    【样例 1 输出】
    1 110
    【样例 1 解释】
    这款游戏共有 8 关,通关第 i 关可以得到 (3 + 2i + i2) 分。第 1, 2, 4, 7 关为奖励关,
    小 N 通过这几关分别得到了 6, 11, 27, 66 分,共 110 分。
    【样例 2 输入】
    1 11111100101
    2 4 3 2 0 2 1
    【样例 2 输出】
    1 143901603
    【样例 3 输入】
    1 1001011001101001
    2 16
    3 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1
    【样例 3 输出】
    1 184740992
    【数据范围与提示】
    对于所有测试点:0 ≤ log2 n < 5 × 105,1 ≤ k ≤ 500,0 ≤ ai < 109 + 7,akk 1 = 0。 第 3 页 共 9 页
    CCF NOI Online 能力测试 提高组 愤怒的小 N(angry)
    测试点编号 log2 n < k ≤ 1 ∼ 2 10
    500
    3 ∼ 4 20
    5 ∼ 8 100
    9 ∼ 10 500
    11 ∼ 12
    5 × 105 1
    13 ∼ 16 100
    17 ∼ 20 500
    第 4 页 共 9 页
    CCF NOI Online 能力测试 提高组 积木小赛(block)

积木小赛(block)

【题目描述】
Alice 和 Bob 最近热衷于玩一个游戏——积木小赛。
Alice 和 Bob 初始时各有 n 块积木从左至右排成一排,每块积木都被标上了一个英
文小写字母。
Alice 可以从自己的积木中丢掉任意多块(也可以不丢);Bob 可以从自己的积木中
丢掉最左边的一段连续的积木和最右边的一段连续的积木(也可以有一边不丢或者两边
都不丢)。两人都不能丢掉自己所有的积木。然后 Alice 和 Bob 会分别将自己剩下的积
木按原来的顺序重新排成一排。
Alice 和 Bob 都忙着去玩游戏了,于是想请你帮他们算一下,有多少种不同的情况
下他们最后剩下的两排积木是相同的。
两排积木相同,当且仅当这两排积木块数相同且每一个位置上的字母都对应相同。
两种情况不同,当且仅当 Alice(或者 Bob)剩下的积木在两种情况中不同。
【输入格式】
从文件 block.in 中读入数据。
第一行一个正整数 n,表示积木的块数。
第二行一个长度为 n 的小写字母串 s,表示 Alice 初始的那一排积木,其中第 i 个
字母 si 表示第 i 块积木上的字母。
第三行一个长度为 n 的小写字母串 t,表示 Bob 初始的那一排积木,其中第 i 个字
母 ti 表示第 i 块积木上的字母。
【输出格式】
输出到文件 block.out 中。
一行一个非负整数表示答案。
【样例 1 输入】
1 5 2 bcabc
3 bbcca
【样例 1 输出】
1 9 第 5 页 共 9 页
CCF NOI Online 能力测试 提高组 积木小赛(block)
【样例 1 解释】
用所标的字母代替每块积木,那么 Alice 剩下的那排积木依序为 a,b,bb,bbc,
bc,bcc,c,ca 或者 cc 时,Bob 剩下的那排积木可以与 Alice 的相同。
【样例 2 输入】
1 20
2 egebejbhcfabgegjgiig
3 edfbhhighajibcgfecef
【样例 2 输出】
1 34
【数据范围与提示】
对于所有测试点:1 ≤ n ≤ 3000,s 与 t 中只包含英文小写字母。
测试点 1 满足:n ≤ 3000,s 与 t 中只包含同一种字母。
测试点 2 ∼ 4 满足:n ≤ 100。
测试点 5 ∼ 7 满足:n ≤ 500。
测试点 8 ∼ 10 满足:n ≤ 3000。第 6 页 共 9 页
CCF NOI Online 能力测试 提高组 岛屿探险(island)

岛屿探险(island)

【题目描述】
凇睦是一个喜欢探险的女孩子,这天她到一片海域上来探险了。
在这片海域上一共有 n 座岛屿排成一排,标号为 1, 2, 3, . . . , n。每座岛屿有两个权
值,分别为劳累度 ai 和有趣度 bi。
对于一座劳累度为 a,有趣度为 b 的小岛,如果这个小岛满足 (a ⊕ c) ≤ min(b, d),
凇睦到这座岛探险就会感到开心,其中 c 表示凇睦到岛上去之前就有的劳累度(称作初
始劳累度),同理 d 代表凇睦的初始有趣度。⊕ 表示二进制异或(即二进制表示下不进
位的加法)。
为了玩的更尽兴,凇睦会向你询问 q 次,每次给出一个区间 [li
, ri] 和两个数 ci
, di,
你需要告诉凇睦若她的初始劳累度为 ci,初始有趣度为 di,则有多少个标号在 [li
, ri] 这
个区间内的岛屿能使凇睦探险时感到开心。
【输入格式】
从文件 island.in 中读入数据。
第一行两个正整数 n, q 分别表示岛屿的数量和询问的数量。
接下来 n 行,每行两个整数 ai
, bi 分别表示第 i 座岛屿的劳累度和有趣度。
接下来 q 行,每行四个正整数 li
, ri
, ci
, di 分别表示区间左端点,区间右端点,初始
劳累度与初始有趣度。
【输出格式】
输出到文件 island.out 中。
输出一共 q 行,每行一个整数对应一个询问的答案。
【样例 1 输入】
1 4 2
2 1 1
3 4 2
4 5 1
5 2 7
6 1 4 6 5
7 2 4 3 3
第 7 页 共 9 页
CCF NOI Online 能力测试 提高组 岛屿探险(island)
【样例 1 输出】
1 2 2 1
【样例 1 解释】
第一次询问中,岛屿 2 与岛屿 4 能使凇睦探险时感到开心。而在第二次询问中,只
有岛屿 4 能使凇睦探险时感到开心。
【样例 2 输入】
1 20 10
2 215 144
3 2 110
4 174 132
5 214 142
6 116 108
7 155 192
8 236 208
9 216 214
10 99 220
11 236 118
12 190 81
13 230 131
14 10 238
15 189 198
16 183 13
17 45 193
18 14 234
19 208 192
20 126 19
21 49 38
22 7 14 251 184
23 2 18 89 76
24 11 15 49 196
25 8 11 83 139
26 10 15 119 239
第 8 页 共 9 页
CCF NOI Online 能力测试 提高组 岛屿探险(island)
27 9 16 148 120
28 11 17 225 34
29 15 16 3 46
30 14 15 86 227
31 7 18 252 103
【样例 2 输出】
1 7 2 2 3 2 4 2 5 1 6 3 7 1 8 1 9 0
10 7
【数据范围与提示】
对于所有测试点,1 ≤ n, q ≤ 105,1 ≤ li ≤ ri ≤ n,1 ≤ ai
, bi
, ci
, di ≤ 2
24 惖 1。
测试点编号 n, q ≤ 特殊性质
1 ∼ 2 5000 无 3 ∼ 4 104 5 ∼ 7
105
max{di} ≤ min{bi} 8 ∼ 11 min{di} ≥ max{bi}
12 ∼ 13 li = 1,ri = n
14 ∼ 16 7 × 104 无
17 ∼ 20 105 第 9 页 共 9 页

代码

T1

10

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long mods=1000000007;
long long a[510],b[510];
long long ksm(long long a,long long b)
{
	long long ret=1;
	for(a%=mods;b;b>>=1)
	{
		if(b&1)
			ret=(ret*a)%mods;
		a=(a*a)%mods;
	}
	return ret;
}
long long read()
{
	long long rel,c;
	for(c=getchar();c<'0'||c>'9';c=getchar());
	for(rel=c-'0',c=getchar();c>='0'&&c<='9';rel=(rel<<3)+(rel<<1)+c-'0',c=getchar());
	return rel;
}
void print(long long x)
{
	if(x)print(x/10),putchar(x%10+'0');
	return;
}
void write(long long x)
{
	if(x) print(x);
	else putchar('0');
	return;
}
int main()
{
	freopen("angry.in","r",stdin);
	freopen("angry.out","w",stdout);
	char ch;
	long long n,m,i,j,tem,ans=0;
	bool t;
	memset(b,0,sizeof(b));
	for(ch=getchar();'0'>ch||ch>'9';ch=getchar());
	for(n=ch-'0',ch=getchar();'0'<=ch&&ch<='9';n=(n<<1)+(ch-'0'),ch=getchar());
	for(m=read(),i=0;i<m;i++)
		a[i]=read();
	for(i=1;i<n;i++)
	{
		for(tem=i,t=0;tem;tem-=tem&-tem,t^=1);
		if(t)
		{
			for(j=0;j<m;j++)
				b[j]=(b[j]+ksm(i,j))%mods;
		}
	}
	for(i=0;i<m;i++)
		ans=(ans+a[i]*b[i]%mods)%mods;
	write(ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2

80

#include<iostream>
#include<fstream>
#include<cstdio>
#include<map>
using namespace std;
map<string,bool>c;
string a,b;
int main()
{
	ifstream fin("block.in");
	ofstream fout("block.out");
	long long n,i,j,k,ans=0;
	ios::sync_with_stdio(false);
	fin>>n>>a>>b;
	for(i=1;i<n&&a[i]==a[i-1]&&b[i]==b[i-1];i++);
	if(i==n&&a[0]==b[0])
	{
		fout<<n;
		fin.close();
		fout.close();
		return 0;
	}
	for(i=0;i<n;i++)
		for(j=0,k=i;j<n&&k<n;j++)
			if(a[j]==b[k])
			{
				if(!c[b.substr(i,k-i+1)])c[b.substr(i,k-i+1)]=1,ans++;
				k++;
			}
	fout<<ans;
	fin.close();
	fout.close();
	return 0;
}

T3

35

#include<iostream>
#include<cstdio>
using namespace std;
long long a[100010],b[100010];
long long read()
{
	long long rel,c;
	for(c=getchar();c<'0'||c>'9';c=getchar());
	for(rel=c-'0',c=getchar();c>='0'&&c<='9';rel=(rel<<3)+(rel<<1)+c-'0',c=getchar());
	return rel;
}
void print(long long x)
{
	if(x)print(x/10),putchar(x%10+'0');
	return;
}
void write(long long x)
{
	if(x) print(x);
	else putchar('0');
	putchar('\n');
	return;
}
int main()
{
	freopen("island.in","r",stdin);
	freopen("island.out","w",stdout);
	long long n,q,l,r,c,d,i,j,ans;
	for(n=read(),q=read(),i=1;i<=n;i++)a[i]=read(),b[i]=read();
	for(i=1;i<=q;i++)
	{
		l=read(),r=read(),c=read(),d=read();
		for(ans=0,j=l;j<=r;j++)ans+=((a[j]^c)<=(min(b[j],d)));
		write(ans);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值