“卓见杯”2020年河南省第二届CCPC大学生程序设计竞赛 ProblemE.发通知

高阅读量文章:c语言long和long long的取值范围

  • unsigned int (unsigned long)

4字节8位可表达位数:2^32=42 9496 7296

范围:0 ~ 42 9496 7295 (42*10^8)

  • int (long)

4字节8位可表达位数:2^32=42 9496 7296

范围:-21 4748 3648 ~ 21 4748 3647 (21*10^8)

  • long long (__int64)

8字节8位可表达位数:2^64=1844 6744 0737 0960 0000

范围:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)

  • unsigned long (unsigned __int64)

8字节8位可表达位数:2^64=1844 6744 0737 0960 0000

范围:0 ~ 1844 6744 0737 0955 1615 (1844*10^16)

C语言中const关键字的妙用总结

修饰变量:

C语言中采用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。举例说明如下:

const int i = 5;

上面这个例子表明,变量i具有只读特性,不能够被更改;若想对i重新赋值,如i = 10;则是错误的。

值得注意的是,定义变量的同时,必须初始化。定义形式也可以写成int const i=5,同样正确。

此外,const修饰变量还起到了节约空间的目的,通常编译器并不给普通const只读变量分配空间,而是将它们保存到符号表中,无需读写内存操作,程序执行效率也会提高。

题目描述

学院一共有 n 位学生,用 1 编号。每天,学院都会派遣辅导员给学生发送若干通知,以保证各项措施、活动消息得到落实。
现在,学院要求辅导员发送一条关于光盘行动的通知。对于通知信息,同学们的反应往往各不相同,辅导员预测出第 i 号学生收到通知后会产生 wi
的愉悦度。此外,辅导员还观察到第 i 号学生会在ai,bi]时间段内实时查阅通知消息,能够收到这段时间内的所有通知;而其他时间将无法收到通知(愉悦度为 0)。辅导员会选择在某一时刻发布一次通知消息,他希望在至少有 k名同学收到通知的前提下,使得同学们的总体愉悦度最大。同学们的总体愉悦度是所有同学愉悦度的异或和。请聪明的你帮助辅导员计算最大的总体愉悦度。

输入

第一行包含两个整数 n, k (1≤n≤5×105,1≤k≤n),含义见题目描述。 接下来 n 行,每行包含三个整数 ai, bi, wi
(1≤ai≤bi≤109, 0≤wi≤109),含义见题目描述。

输出

输出一行一个整数,即最大的总体愉悦度。若不可能有至少 k 名同学收到通知,输出 −1。

样例输入

5 1 1 5 8 3 6 2 7 8 4 8 9 0 10 10 1
样例输出

10

样例输入二
2 2 3 5 8 1 2 4
样例输出二
-1

提示
第一个样例中,辅导员可以选择在时刻 3 发送通知,这样第 1 位和第 2
位同学会收到通知,总体愉悦度可取到最大值,为8⊕2=10。当然,最大的合法方案不止这一种,也可以选择在时刻 5 发送通知,总体愉悦度为 1。
第二个样例中,无论选取哪一时刻发布通知,都无法让两位同学均接收消息,故输出 −1。

思路分析
countn[maxn]
数组记录在[a,b]时间点内出现的次数,如果出现一回,次数自增1,最后用以和至少收到通知的k比较。
ma为当前最大愉悦值
当输入每位同同学的接收时间段a,b和最大愉悦值后,进行异或和运算,这时比较ma与j同学的愉悦值j[k]如果ma<w[j],记录下来ma=w[j]
③此处应设有标志变量f
表示已有符合题意得同学收到通知,这里的符合题意是指保证了至少k个同学收到通知且异或和为当前最大值.]演草纸

代码实例

#include<bits/stdc++.h>
using namespace std;

int main()
{
	const int maxn = 1000000005;
	long countn[maxn];
	long w[maxn];
	long ma=0;
	bool f=0;
	int n,k;
	scanf("%d %d",&n,&k);
	long a,b,c;
	for(int i=0;i<n;i++){
		scanf("%;d %ld %ld",&a,&b,&c);
		for(int j=a;j<=b;j++){
			countn[j]++;
			w[j] ^= c;
			if(w[j]>ma && countn[j]>=k){
				f=1;
				ma=w[j];
			}
		}
	}
	if(!f) printf("-1");
	else printf("%ld",ma);
	return 0;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值