- 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修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。举例说明如下:
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;
}