目录
A. 差分入门
Description
输入一个长度为n的整数序列。
接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。
请你输出进行完所有操作后的序列。
Format
Input
第一行包含两个整数n和m。
第二行包含n个整数,表示整数序列。
接下来m行,每行包含三个整数l,r,c,表示一个操作。
1 ≤ n , m ≤ 100000 .
Output
共一行,包含n个整数,每个数字后面一个空格,表示最终序列。
Samples
输入数据 1
6 3 1 2 2 1 2 1 1 3 1 3 5 1 1 6 1
Copy
输出数据 1
3 4 5 3 4 2
Copy
Limitation
1s, 256000KiB for each test case.
基本差分的使用,不会的可以先学一学差分的使用
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int b[100005];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(m--){
int l,r,c;
cin>>l>>r>>c;
b[l]+=c;//左边界加c
b[r+1]-=c;//右边界+1后再减c
}
for(int i=1;i<=n;i++){
b[i]+=b[i-1];
cout<<a[i]+b[i]<<' ';
}
return 0;
}
B. 教室外的风景
Background
Special for beginners, ^_^
Description
小猪上初中了,初中真好啊,有很多自修课哦。很多同学喜欢在自修课时到教室外面去,说是到老师那问问题J。 学校规定,自修课到教室外去的每个同学都必须做好登记,每次进出教室的登记是以一对整数a和b来描述的,表示 某一个同学在时刻a时到教室外面,在时刻b以后回到教室内。也就是说在时刻a至时刻b的这段时间中,这个登记的 同学一直在教室外面。校长想知道最多有多少同学在同一时刻都在教室外面,但同学们进进出出教室的记载实在很 乱,于是校长请参加信息学兴趣小组的小猪来统计。
Format
Input
第一行只有一个整数n,表示共有n个同学进出教室的记载。
接下来n行,每行二个整数a和b,表示有一个同学在第a时刻出了教室,他在第b时刻后回到教室。
1≤n≤100000,1≤a≤b≤100000.
Output
仅有一行,该行只有一个整数,表示最多有多少同学在同一时刻都在教室外面。
Samples
输入数据 1
4 2 6 8 9 1 5 1 2
Copy
输出数据 1
3
Copy
Limitation
1s, 255024KiB for each test case.
统计n个人的进出时间,记录下在外面最大的结果
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int main(){
int n;
cin>>n;
while(n--){
int l,r;
cin>>l>>r;
a[l]++;
a[r+1]--;
}
int ans=0;
for(int i=0;i<=100000;i++){
a[i]+=a[i-1];
ans=max(ans,a[i]);
}
cout<<ans;
return 0;
}
C. 专用牛棚
Background
Special for beginners, ^_^
Description
有N头牛,每头牛有个喝水时间,这段时间它将专用一个Stall
现在给出每头牛的喝水时间段,从A到B,问至少要多少个Stall 才能满足它们的要求
1 <= N <= 50,000
1 <= A <= B <= 1,000,000
保证A<=B
Format
Input
第一行给出数字N
接下来N行
每行两个数字a,b代表某头牛喝水的开始与结束时间.
Output
至少要多少个stall
Samples
输入数据 1
5 1 10 2 4 3 6 5 8 4 7
Copy
输出数据 1
4
Copy
Limitation
1s, 255024KiB for each test case.
都是类似题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[1000005];
int main(){
int n;
cin>>n;
while(n--){
int l,r;
cin>>l>>r;
a[l]++;
a[r+1]--;
}
int ans=0;
for(int i=0;i<=1000000;i++){
a[i]+=a[i-1];
ans=max(ans,a[i]);
}
cout<<ans;
return 0;
}
D. 热水器
Background
Special for beginners, ^_^
Description
一个热水器,每分钟可以提供 W 升热水,现在有 N 个人使用,第 i 个人计划每分钟使用 Pi 升热水
从 Si 时间开始到 Ti 结束(不包括 Ti 时间点)。
问给出的使用计划是否可行。
Format
Input
第一行给出N,W
接下来N行,每行三个数字,分别代表Si,Ti,Pi
1≤N≤2×10^5
0≤Si<Ti≤2×10^5
1≤W,Pi≤10^9 .
Output
见样例
Samples
输入数据 1
4 10 1 3 5 2 4 4 3 10 6 2 4 1
Copy
输出数据 1
No
Copy
输入数据 2
4 10 1 3 5 2 4 4 3 10 6 2 3 1
Copy
输出数据 2
Yes
Copy
hint
样例数据 1
根据样例数据可知,热水器可以每分钟提供 10 升水。
第一个人数据,从第 1 分钟开始到第 3 分钟结束,每分钟使用 5 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5
第二个人数据,从第 2 分钟开始到第 4 分钟结束,每分钟使用 4 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4
第三个人数据,从第 3 分钟开始到第 10 分钟结束,每分钟使用 6 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4+6=10 4 6 5 6 6 6 7 6 8 6 9 6
第四个人数据,从第 2 分钟开始到第 4 分钟结束,每分钟使用 1 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4+1=10 3 4+6+1=11 4 6 5 6 6 6 7 6 8 6 9 6
从表格数据可以看出,在第 3 分钟,需要的热水为 11 升,超过了热水器可以供应的用水。 所以输出 No。
样例数据 2
根据样例数据可知,热水器可以每分钟提供 10 升水。
第一个人数据,从第 1 分钟开始到第 3 分钟结束,每分钟使用 5 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5
第二个人数据,从第 2 分钟开始到第 4 分钟结束,每分钟使用 4 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4
第三个人数据,从第 3 分钟开始到第 10 分钟结束,每分钟使用 6 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4+6=10 4 6 5 6 6 6 7 6 8 6 9 6
第四个人数据,从第 2 分钟开始到第 3 分钟结束,每分钟使用 1 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4+1=10 3 4+6=10 4 6 5 6 6 6 7 6 8 6 9 6
从表格数据可以看出,热水器可以供应的用水。所以输出 Yes。
Limitation
1s, 255024KiB for each test case.
同上
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1000005];
int main(){
int n;
ll m;
cin>>n>>m;
while(n--){
int l,r,c;
cin>>l>>r>>c;
a[l]+=c;
a[r]-=c;
}
ll ans=0;
for(int i=0;i<=200000;i++){
a[i]+=a[i-1];
ans=max(ans,a[i]);
}
if(ans>m)cout<<"No";
else cout<<"Yes";
return 0;
}
E. 减减加加
Description
给你一个数列,共N个数字 你可以对每个数字,做如下三种操作之一
1:将这个数字加1
2:将这个数字减去1
3:什么事也不做
最终希望在这个数列中,某个数字出现的次数越多越好,输出出现次数即可。
Format
Input
第一行给出N
第二行给出N个数字
N<=1e5,数字的权值在[0,1e5]之间.
Output
如题
Samples
输入数据 1
7 3 1 4 1 5 9 2
Copy
输出数据 1
4
Copy
Hint
将这个数列变成2 2 4 2 5 9 2
Limitation
1s, 102400KiB for each test case.
由于数据量非常少,所以只需记录下来每个数字出现的次数,如何枚举所有数据求出正确答案即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int main(){
int n;
cin>>n;
map<int,int>m;
for(int i=0;i<n;i++){
cin>>a[i];
m[a[i]]++;
}
sort(a,a+n);
int ans=0;
for(int i=0;i<=100000;i++){
ans=max(ans,m[i]+m[i-1]+m[i+1]);
}
cout<<ans;
return 0;
}
F. 【创新型】第8章:数组 九位累进可除数
说明
求九位累进可除数。所谓九位累进可除数就是这样一个数:这个数用到1到9这九个数字组成,每个数字刚好只出现一次。这九个位数的前两位能被2整除,前三位能被3整除......前N位能被N整除,整个九位数能被9整除。
输出格式
1个九位数。
枚举字符串全排列,每次切割判断是否满足条件直到找到符号条件的九位数
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
string s="123546789";
do{
for(int i=0;i<9;i++){
int x=stoi(s.substr(0,i+1));
if(x%(i+1)!=0){
break;
}
if(i==8){
cout<<s;
return 0;
}
}
}while(next_permutation(s.begin(),s.end()));
return 0;
}