A 时间比较
题意
思路
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d;
cin >> a >> b >> c >> d;
if(a<c) cout << "No\n";
else if(a>c) cout << "Yes\n";
else{
if(b>d) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}
B 计算器
题意
- 一共n个输入值,最大显示k位
- 计算器初始值为1,每次乘上输入值,如果乘积超过k位结果就变为1
- 输出最终结果
- n<100,k<=18,会爆long long
思路
- 由于范围,中间结果要用long long维护
- __int128/高精度/龟速乘(把乘拆成加,二进制拆法,接近临界就判不符合)
- 判
等价于判
,注意精度,以及pow函数(float*float丢精度)超过
就会不准,上限的计算需要手动实现
代码
#include<bits/stdc++.h>
using namespace std;
long long a[1010101];
int main(){
int n, k;
cin >> n >> k;
long long lmt = 1;
for (int i = 0; i < k; ++i){
lmt *= 10;
}
lmt--;
for (int i = 0; i < n; i++){
cin >> a[i];
}
long long ans = 1;
for (int i = 0; i < n; i++){
if (a[i] > lmt || ans > lmt / a[i]){
ans = 1;
} else {
ans *= a[i];
}
}
cout << ans << endl;
return 0;
}
C ~
题意
- 对于一个整数序列,如果满足以下条件就说他是个波浪序列
- 整个序列的长度至少为4

- 恰好存在一个数,且这个数不是头和尾,满足

- 恰好存在一个数,且这个数不是头和尾,满足

- 现在你有一个长度位N的排列,求有多少个连续子段满足是波浪序列
思路
- 恰好存在->有且仅有一个
- 维护所有的单增序列和单减序列长度,对于每一个单减序列,取两侧的单增序列长度做乘积即可
代码
#include<bits/stdc++.h>
using namespace std;
vector<pair<char,long long>> b(303030);
int a[303030];
int main(){
int n;
cin >> n ;
for(int i=1;i<=n;i++){
cin >> a[i] ;
}
int pos=0;
for(int i=1;i<=n;i++){
if(a[i]<a[i+1]){
if(b[pos].first!='i') b[++pos].first='i';
b[pos].second++;
}else{
if(b[pos].first!='d') b[++pos].first='d';
b[pos].second++;
}
}
long long ans=0;
for(int i=1;i<=pos;i++){
if(b[i].first=='d'&&b[i-1].first=='i'&&b[i+1].first=='i'){
ans+=b[i-1].second*b[i+1].second;
}
}
cout << ans << endl;
return 0;
}
D 垃圾移除
题意
- 对一个h*w的地图,其中有n个垃圾,给出了这些垃圾的坐标
- 请处理q次询问,每次询问以如下形式
op x
- 如果op=1,输出x行有多少垃圾,然后清理掉x行所有垃圾
- 如果op=2,输出y列有多少垃圾,然后清理掉y列所有垃圾
思路
- set模板题
- 对于每一行,每一列均开一个set,统计哪个位置有垃圾
- 如果删除一行,遍历这一行,处理对应列的set
代码
#include<bits/stdc++.h>
using namespace std;
set<int>a[202020],b[202020];
int main(){
int n,h,w;
cin >> h >> w >> n ;
for(int i=0;i<n;i++){
int x,y ;
cin >> x >> y ;
a[x].insert(y);
b[y].insert(x);
}
int q;
cin >> q ;
for(int i=0;i<q;i++){
int op,t;
cin >> op >> t;
if(op==1){
cout << a[t].size() << endl ;
for(auto j:a[t]){
b[j].erase(t);
}
a[t].clear();
}else{
cout << b[t].size() << endl ;
for(auto j:b[t]){
a[j].erase(t);
}
b[t].clear();
}
}
return 0;
}