2024牛客寒假算法基础集训营2

A Tokitsukaze and Bracelet

考点:分类
条件判断即可,签到题

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
int main()
{
	ios::sync_with_stdio(0); cin.tie(0);
	int t;cin >> t;
	while(t --)
    {
		int res = 0;
		int a,b,c;
		cin >> a >> b >> c;
		if(a >= 150) res ++;
		if(a >= 200) res ++;
		if(b >= 34) res ++;
		if(b >= 45) res ++;
		if(c >= 34) res ++;
		if(c >= 45) res ++;
		cout << res << '\n';
	}
    return 0;
}

F Tokitsukaze and Eliminate (hard)

考点:贪心,STL,线段树
这是线段树解法

#include <bits/stdc++.h>
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
using i64 = long long;
const int N = 200005;
const i64 INF = 0x3f3f3f3f;
vector<int> a[N], arr(N), sum(4*N, 0);
void update(int x) 
{
    sum[x] = min(sum[ls], sum[rs]);
}

void build(int l, int r, int x) 
{
    if(l == r) 
    {
        sum[x] = (a[l].empty() ? INF : a[l].back()); 
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, ls);
    build(mid+1, r, rs);
    update(x);
}

int query(int A, int B, int l, int r, int x) 
{
    if(A > B) return INF; 
    if(A <= l && B >= r) return sum[x];
    int mid = (l + r) >> 1, ans = INF;
    if(A <= mid) ans = min(ans, query(A, B, l, mid, ls));
    if(B > mid) ans = min(ans, query(A, B, mid+1, r, rs));
    return ans;
}

void change(int pos, int v, int l, int r, int x) 
{
    if(l == r) 
    {
        sum[x] = v; 
        return;
    }
    int mid = (l + r) >> 1;
    if(pos <= mid) change(pos, v, l, mid, ls);
    else change(pos, v, mid+1, r, rs);
    update(x);
}

void solve() {
    int n; cin >> n;
    for(int i = 1; i <= n; ++i) a[i].clear();
    for(int i = 1; i <= n; ++i) 
    {
        cin >> arr[i];
        a[arr[i]].push_back(i);
    }
    build(1, n, 1);
    int res = 0;
    int r = n;
    while(r) 
    {
        int new_r = query(1, n, 1, n, 1); 
        res += 1;
        for(int k = r; k >= new_r; --k) 
        {
                a[arr[k]].pop_back();
                if (a[arr[k]].empty())
                    change(arr[k], INF, 1, n, 1);
                else
                    change(arr[k], a[arr[k]].back(), 1, n, 1);
        }
        r = new_r - 1; 
    }
    cout << res << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t; cin >> t;
    while(t--) solve();
    return 0;
}

全部评论

相关推荐

沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
头像
11-07 01:12
重庆大学 Java
精致的小松鼠人狠话不多:签哪了哥
点赞 评论 收藏
分享
昨天 14:22
门头沟学院 Java
大厂 测开 24*16离家近的事业编(大概只有大厂的1/4) 硕士
烟火_fy_烟火:钱多事少离家近,加上工作兴趣,感觉事业编完胜,大厂测开还得担心被裁员优化呢
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务