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;
}