202203-1(未初始化警告)(set)
题目链接:
计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T143思路:
每次只需要判断 y 是否在左值中出现过即可(或者y == 0 也行)
注意要用set来判断,因为set的count函数时间复杂度是O(log n),才不会超时。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<unordered_map>
#include<set>
#include<stack>
#include<cmath>
#include<unordered_set>
#define int long long
using namespace std;
int n, k, ans;
set<int> vc;
void solve()
{
cin >> n >> k;
int x, y;
while(k --)
{
cin >> x >> y;
if(!vc.count(y) && y != 0) ans ++;
vc.insert(x);
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// int T;
// cin >> T;
//
// while(T--)
// {
solve();
// }
return 0;
}
202203-2(出行计划)(差分)
题目链接:
计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T142思路(70%)
暴力枚举,O(n^2)的时间复杂度,只能过70%的样例。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<unordered_map>
#include<set>
#include<stack>
#include<cmath>
#include<unordered_set>
#define ll long long
using namespace std;
typedef pair<int, int> PII;
int n, m, k;
vector<PII > vc;
bool check(int mid, int q)
{
if(q < vc[mid].first || q > vc[mid].second) return false;
return true;
}
void solve()
{
cin >> n >> m >> k;
int x, y;
for (int i = 1; i <= n; ++ i)
{
cin >> x >> y;
int mi = x - k - y + 1, ma = x - k;
if(ma <= 0) continue;
mi = max(mi, 0);
vc.push_back({mi, ma});
}
int q, len = vc.size();
while(m --)
{
cin >> q;
int res = 0;
for (int i = 0; i < len; ++ i)
{
if(check(i, q)) ++ res;
}
cout << res << endl;
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// int T;
// cin >> T;
//
// while(T--)
// {
solve();
// }
return 0;
}
满分思路:
可以求出每个场所规定的符合要求的核酸检测最早时间和最晚时间,必须在这个区间内,这个场所才能去,最早是 t - k - c + 1,最晚是 t - k,那么我们可以利用差分进行维护区间,即在最早到最晚之间的场所数目都应该加1,即 f [最早] ++ ,f[最晚] --,注意最早和最晚不能是负数。最后将差分数组遍历相加,成为查询数组,直接输出所在位置的合法场所数即可。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<unordered_map>
#include<set>
#include<stack>
#include<cmath>
#include<unordered_set>
#define ll long long
using namespace std;
const int N = 200010;
int res[N];
void solve()
{
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i < n; i ++)
{
int t, c;
cin >> t >> c;
//在【l, r】时间段内做核酸,则t时刻可进入
int l = max(t - k - c + 1, 0);
l = min(l, 200000);
int r = max(0, t - k);
r = min(r, 200000);
//在【l, r】时间段内能出行的计划个数加一
res[l] += 1;
res[r + 1] -= 1;
}
//利用差分计算每个时间的能出行个数
for (int i = 1; i < 200001; i ++)
{
res[i] += res[i - 1];
}
for (int i = 0; i < m; i ++)
{
int q;
cin >> q;
cout << res[q] << endl;
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
solve();
return 0;
}