单调队列/单调栈优化dp

news2024/11/30 10:52:10

从这几篇博客学习的:
DP优化小技巧(单调队列/单调栈)
(单调队列优化DP) 代码源每日一题 Div1 选元素(数据加强版)
算法学习笔记(67): 单调栈
牛客多校第九场I (单调栈优化dp/单调栈的常用套路)

一. 单调队列

NC50528 滑动窗口

在这里插入图片描述
在这里插入图片描述

主要思想:
假设我们需要维护长度为 k k k的区间最大值,遍历过程中,对于一个数字 a i + 1 a_{i+1} ai+1,如果 a i + 1 > = a i a_{i+1} >= a_i ai+1>=ai,那么我们完全可以把 a i a_i ai的影响忽略掉。因为后面的数字比你并且生命周期还比你大,所以最大值永远不可能取到 a i a_i ai。具体在队列中的做法就是不断访问队尾元素,小于等于当前值就出队,结束后将当前元素入队。这样的话就可以保证队首元素一定是长度为 k k k的区间的最大值。(当然你需要判断队首元素与当前位置距离与 k k k的大小关系确定队首元素是否需要出队)。这个过程可以用deque很容易实现,数组模拟也很容易。
AC代码:
deque:

#include <bits/stdc++.h>

using namespace std;

int n, k;
int ar[1000050];
deque<int> q;

int main()
{
    scanf("%d%d", &n, &k);

    for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]);

    for(int i = 1; i <= n; ++i)
    {
        while(!q.empty() && q.front() + k <= i) q.pop_front();
        while(!q.empty() && ar[q.back()] >= ar[i]) q.pop_back();
        q.push_back(i);
        if(i >= k) printf("%d ", ar[q.front()]);
    }

    putchar('\n');

    q.clear();
    for(int i = 1; i <= n; ++i)
    {
        while(!q.empty() && q.front() + k <= i) q.pop_front();
        while(!q.empty() && ar[q.back()] <= ar[i]) q.pop_back();
        q.push_back(i);
        if(i >= k) printf("%d ", ar[q.front()]);
    }

    return 0;
}

数组模拟:

#include <bits/stdc++.h>

using namespace std;

int n, k;
int ar[1000050];
int p[1000050];
int l, r;//左闭右开

int main()
{
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]);
    l = 0;
    r = 1;
    p[0] = 1;
    if(k == 1) printf("%d ", ar[1]);
    for(int i = 2; i <= n; ++i)
    {
        if(i - p[l] >= k && (l < r))    l++;

        while(r > l && ar[p[r - 1]] >= ar[i]) r--;
        p[r++] = i;

        if(i >= k)  printf("%d ", ar[p[l]]);
    }
    putchar('\n');
    l = 0;
    r = 1;
    p[0] = 1;
    if(k == 1)  printf("%d ", ar[1]);
    for(int i = 2; i <= n; ++i)
    {
        if(i - p[l] >= k && (l < r))    l++;

        while(r > l && ar[p[r - 1]] <= ar[i])    r--;
        p[r++] = i;

        if(i >= k)  printf("%d ", ar[p[l]]);
    }
    putchar('\n');
    return 0;
}

二. 单调队列优化dp

当我们为了实现给动态规划的复杂度降维的时候,通常就需要单调栈/队列,通常用来维护前面状态下可以取到的最大值或者最小值,然后直接进行转移。(ygg)
在这里插入图片描述

1.daimayuan #875. 选元素(数据加强版)

首先,我们可以看数据没加强版

AcWing 4418. 选元素

在这里插入图片描述
在这里插入图片描述
题意:
就是对与每个长度为为 k k k的子区间,至少要有一个数被选择,一共可以选择 x x x个数字,目标是让选择的 x x x个数字最大。
分析:
考虑dp,定义dp[i][j]表示选了ar[i]的情况下,前 i i i个数字一共有 j j j个被选的情况下的最大值。
状态转移方程: d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − k , i − 1 ] [ j − 1 ] + a r [ i ] ) dp[i][j] =max(dp[i][j],dp[i-k,i-1][j-1]+ar[i]) dp[i][j]=max(dp[i][j],dp[ik,i1][j1]+ar[i])。复杂度 O ( n 3 ) O(n^3) O(n3)
AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define int ll

int n, k, x;
int ar[205];
int dp[205][205];
int ans;

signed main()
{
    scanf("%lld%lld%lld", &n, &k, &x);

    for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]);
    memset(dp, 128, sizeof(dp));
    //cout << dp[0][0] << '\n';
    dp[0][0] = 0;

    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= x; ++j)
        {
            for(int p = max(0ll, i - k); p < i; ++p)
            {
                dp[i][j] = max(dp[i][j], dp[p][j - 1] + ar[i]);
            }
            //cout << i << ' ' << j << ' ' << dp[i][j] << '\n';
        }
    }

    ans = -1;
    for(int i = n - k + 1; i <= n; ++i) ans = max(ans, dp[i][x]);
    printf("%lld\n", ans);

    return 0;
}

数据加强版

对于数据加强版, n , k , x n,k,x n,k,x的取值达到2500, O ( n 3 ) O(n^3) O(n3)一定超时。我们考虑优化,对于原来的状态转移式。 d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − k , i − 1 ] [ j − 1 ] + a r [ i ] ) dp[i][j] =max(dp[i][j],dp[i-k,i-1][j-1]+ar[i]) dp[i][j]=max(dp[i][j],dp[ik,i1][j1]+ar[i]),考虑以极快的速度求出 m a x ( d p [ i − k , i − 1 ] [ j − 1 ] ) max(dp[i-k,i-1][j-1]) max(dp[ik,i1][j1])。本质上一个窗口大小为 k k k的滑动窗口,故利用单调队列优化即可。复杂度 O ( n 2 ) O(n^2) O(n2)
AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int n, k, x, top;
ll ar[2550];
ll dp[2550][2550];
ll ans;

int main()
{
    scanf("%d%d%d", &n, &k, &x);

    for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]);
    memset(dp, 128, sizeof(dp));
    //cout << dp[0][0] << '\n';
    dp[0][0] = 0;

    for(int j = 1; j <= x; ++j)
    {
        deque<int> q;
        q.push_back(0);
        for(int i = 1; i <= n; ++i)
        {
            while(!q.empty() && q.front() < i - k) q.pop_front();
            dp[i][j] = dp[q.front()][j - 1] + ar[i];
            while(!q.empty() && dp[q.back()][j - 1] <= dp[i][j - 1]) q.pop_back();
            q.push_back(i);
        }
    }

    ans = -1;
    for(int i = n - k + 1; i <= n; ++i) ans = max(ans, dp[i][x]);
    printf("%lld\n", ans);

    return 0;
}

2. C. Jump and Treasure(Gym - 103743C)2022江苏省赛

在这里插入图片描述
在这里插入图片描述
题意:
输入 n , q , p n,q,p nqp,之后一行 n n n个数字,之后 q q q行, q q q次询问。
你现在在玩一个游戏,初始在0点,你只可以向右走,游戏有很多关,对于第 x x x关,你只能走到 i i i的倍数的点上,并且每步跨越的最大距离是 p p p,每个点上有数字,当你到达这个点是,你的数值就会加上该点的权值,初始时你的数值为0,通关条件是到达点 n + 1 n+1 n+1及其之后的点,并且 n + 1 n+1 n+1及其之后的点的数值都为0,走到 n + 1 n+1 n+1之后的点不需要考虑他们是否是 x x x的倍数,只需要考虑最大跨越距离的限制。你可以在不违规的前提下走任意多步, q q q次询问,问你对于第 x x x关,通关时的最大数值。
分析:
考虑dp,定义dp[i]表示,对于第 x x x关,走到第 i i i个能到达的点时所能获得的最大价值。
转移方程: d p [ i ] = m a x ( d p [ i ] , d p [ i − p / x , i − 1 ] + a r [ i ] ) dp[i] = max(dp[i], dp[i-p/x,i-1]+ar[i]) dp[i]=max(dp[i],dp[ip/x,i1]+ar[i]) (不考虑Noob的情况)。
如果暴力跑,复杂度为 O ( T L E ) O(TLE) O(TLE),依旧考虑单调队列优化取 m a x max max的部分。复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

const  ll inf = 0x3f3f3f3f3f3f3f3f;
int n, p, q, x;
ll ans[1000050];
int ar[1000050];
ll dp[1000050];
vector<int> vt[1000005];
int qq[1000050];
int l, r;

int main()
{
    io;
    cin >> n >> q >> p;
    for(int i = 1; i <= n; ++i) cin >> ar[i];

    for(int i = 1; i <= n; ++i)
    {
        ans[i] = -inf;
        for(int j = 0; j <= n; j += i) vt[i].push_back(j);
        vt[i].push_back(n + 1);
    }

    while(q--)
    {
        cin >> x;
        if(ans[x] != -inf) cout << ans[x] << '\n';
        else if(x > p) cout << "Noob\n";
        else
        {
            dp[0] = 0;
            l = r = 1;
            qq[r] = 0;

            for(int i = 1; i < vt[x].size(); ++i)
            {
                while(l <= r && vt[x][i] - qq[l] > p) ++l;
                dp[vt[x][i]] = dp[qq[l]] + ar[vt[x][i]];

                while(l <= r && dp[qq[r]] <= dp[vt[x][i]]) --r;
                qq[++r] = vt[x][i];

            }

            ans[x] = dp[n + 1];
            cout << ans[x] << '\n';

        }
    }

    return 0;
}

3.P1725 琪露诺(单调队列)

在这里插入图片描述
题意:
很类似上一个题,只不过跳的方式有所不同,是给定一个 l , r l,r l,r,对于当前点 i i i,可以跳到 [ i + l , i + r ] [i+l,i+r] [i+l,i+r]
AC代码:

#include <bits/stdc++.h>

using namespace std;

const int inf = 0x3f3f3f3f;
int n, l, r;
int ar[600050];
int dp[600050];
deque<int> q;

int main()
{
    scanf("%d%d%d", &n, &l, &r);

    for(int i = 0; i <= n; ++i)
    {
        scanf("%d", &ar[i]);
        dp[i] = -inf;
    }

    dp[0] = ar[0];
    q.push_back(0);
    dp[l] = ar[l];

	//3*n是我乱写的,反正不会超时,后面那一坨的dp值都是相同的。
    for(int i = l + 1; i <= 3 * n; ++i)
    {
        while(!q.empty() && q.front() + r < i) q.pop_front();
        while(!q.empty() && dp[q.back()] <= dp[i - l]) q.pop_back();
        q.push_back(i - l);

        dp[i] = dp[q.front()] + ar[i];
        //cout << i << ' ' << dp[i] << '\n';
    }

    printf("%d\n", dp[3 * n]);

    return 0;
}

三. 单调栈

两大用处:
1.NGE问题(Next Greater Element),也就是,对序列中每个元素,找到下一个比它大的元素。
2.两元素间所有元素均(不)大/小于这两者

1. P5788 【模板】单调栈

在这里插入图片描述
在这里插入图片描述
(其实也可以用单调队列,不需要队首元素出队的单调队列)
AC代码:

#include <bits/stdc++.h>

using namespace std;

int n;
int ar[3000050];
stack<int> st;
int ans[3000050];

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]);

    ans[n] = 0;
    st.push(n);

    for(int i = n - 1; i > 0; --i)
    {
        while(!st.empty() && ar[st.top()] <= ar[i]) st.pop();

        if(!st.empty()) ans[i] = st.top();
        else ans[i] = 0;

        st.push(i);
    }

    for(int i = 1; i <= n; ++i) printf("%d ", ans[i]);
    putchar('\n');

    return 0;
}

2.P1823 [COI2007] Patrik 音乐会的等待

在这里插入图片描述
在这里插入图片描述
(区间1~i内元素大小关系和单调栈内元素情况)
在这里插入图片描述
在这里插入图片描述
AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define int ll

int n;
int ar[500050];
stack<pair<int, int> > st;
pair<int, int> pi;
int ans, cnt;

signed main()
{
    scanf("%lld", &n);
    for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]);

    st.push({ar[1], 1});
    for(int i = 2; i <= n; ++i)
    {
        int cnt = 1;
        while(!st.empty() && st.top().first <= ar[i])
        {
            pi = st.top();
            st.pop();
            //cout << pi.first << ' ' << pi.second << '\n';
            ans += pi.second;
            if(pi.first == ar[i]) cnt = pi.second + 1;
            else cnt = 1;
        }
        if(!st.empty()) ++ans;
        st.push({ar[i], cnt});
        //cout << i << ' ' << ans << '\n';
    }

    printf("%lld\n", ans);

    return 0;
}

四. 单调栈优化dp

1.CF1313C2 Skyscrapers (hard version)

在这里插入图片描述
在这里插入图片描述
题意:
输入一个 n n n,之后输入 n n n个数字 a r [ i ] ar[i] ar[i]
让你选择一个点作为山峰。假设选择点 p o s pos pos作为山峰,其他的 n − 1 n-1 n1点的高度将发生变化。假设修改后的高度记为 h [ i ] h[i] h[i],对于1~pos-1中的一个点i,必须满足 h [ i ] = m i n ( h [ i + 1 ] , a r [ i ] ) h[i]=min(h[i+1],ar[i]) h[i]=min(h[i+1],ar[i]),对于pos+1~n中的一个点i,必须满足 h [ i ] = m i n ( h [ i − 1 ] , a r [ i ] ) h[i] = min(h[i-1],ar[i]) h[i]=min(h[i1],ar[i])。求 ∑ 1 n h [ i ] \sum_1^n h[i] 1nh[i]的最大值。输出取最大值时的h[i]数组。
分析:
首先,我们可以看一下easy版本。区别在于n的大小。easy版本n最大1000。 O ( n 2 ) O(n^2) O(n2)能过。我们考虑dp,定义dp1[i],dp2[i]分别表示选择 i i i作为山峰时 i i i极其左侧的最大值。答案就是 m a x ( d p 1 [ i ] + d p 2 [ i ] − a r [ i ] ) max(dp1[i]+dp2[i]-ar[i]) max(dp1[i]+dp2[i]ar[i])
我们考虑快速求dp1[i]的方法,假设ar[j] i i i之前第一个满足ar[j]<=ar[i]的元素,那么 d p 1 [ i ] = d p 1 [ j ] + ( i − j ) ∗ a r [ i ] dp1[i]=dp1[j]+(i-j)*ar[i] dp1[i]=dp1[j]+(ij)ar[i]。而对于第一个小于等于的元素,显然可以利用单调栈快速找出。(dp2求法同理)复杂度 O ( n ) O(n) O(n)
(单调栈用法1,利用单调栈找到区间内第一个比他大/小的元素)
AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int n, pos;
ll ar[500050];
ll dp1[500050];
ll dp2[500050];
ll ans[500050];
ll mx;
stack<ll> st;

void work()
{
    int tmp = pos;
    ll mxx = ar[tmp];
    ans[tmp] = ar[tmp];
    while(tmp > 0)
    {
        --tmp;
        ans[tmp] = min(mxx, ar[tmp]);
        mxx = ans[tmp];
    }

    tmp = pos;
    mxx = ar[tmp];
    while(tmp < n)
    {
        ++tmp;
        ans[tmp] = min(mxx, ar[tmp]);
        mxx = ans[tmp];
    }

    for(int i = 1; i <= n; ++i) printf("%lld ", ans[i]);
    putchar('\n');
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]);

    st.push(0);
    for(int i = 1; i <= n; ++i)
    {
        while(!st.empty() && ar[st.top()] >= ar[i]) st.pop();

        dp1[i] = dp1[st.top()] + (i - st.top()) * ar[i];
        st.push(i);
    }

    while(!st.empty()) st.pop();
    st.push(n + 1);
    for(int i = n; i > 0; --i)
    {
        while(!st.empty() && ar[st.top()] >= ar[i]) st.pop();

        dp2[i] = dp2[st.top()] + (st.top() - i) * ar[i];
        st.push(i);
    }

    for(int i = 1; i <= n; ++i)
    {
        if(dp1[i] + dp2[i] - ar[i] > mx)
        {
            mx = dp1[i] + dp2[i] - ar[i];
            pos = i;
        }
    }

    work();

    return 0;
}

在这里插入图片描述
(295是正解,换成解绑之后的cin,cout用线段树暴力维护居然卡过了)。

2.CF1407D Discrete Centrifugal Jumps

在这里插入图片描述
在这里插入图片描述
题意:
输入一个n,之后n个数字ar[i]
一开始你在位置1,你要到达位置n,从位置i到位置j必须满足一下条件之一。
在这里插入图片描述
问你到达n最少需要跳几步。
分析:
单调栈的用法2,找两元素间所有元素均(不)大/小于这两者
在这里插入图片描述
(区间1~i内元素大小关系和单调栈内元素情况)
借助这个图理解和P1823 [COI2007] Patrik 音乐会的等待这个题理解一下。
AC代码:

#include <bits/stdc++.h>

using namespace std;

int n;
stack<int> st1, st2;
int dp[300050];
int ar[300050];

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]);

    memset(dp, 0x3f, sizeof(dp));

    dp[1] = 0;
    for(int i = 1; i <= n; ++i)
    {
        dp[i] = min(dp[i], dp[i - 1] + 1);
        while(!st1.empty() && ar[st1.top()] <= ar[i])
        {
            int pos = st1.top();
            st1.pop();
            if(!st1.empty() && ar[i] > ar[pos]) dp[i] = min(dp[st1.top()] + 1, dp[i]);
        }
        st1.push(i);

        while(!st2.empty() && ar[st2.top()] >= ar[i])
        {
            int pos = st2.top();
            st2.pop();
            if(!st2.empty() && ar[i] < ar[pos]) dp[i] = min(dp[st2.top()] + 1, dp[i]);
        }
        st2.push(i);
    }

    printf("%d\n", dp[n]);

    return 0;
}

3.牛客多校第九场I The Great Wall II

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意:
输入一个n,之后输入数组ar[n]。你需要将区间[1,n]分成k个子区间,这k个区间两两不交,且并集是全集。每个子区间的值是这个区间中最大的那个数字,你需要最小化这k个区间的值的和。输出k1~n时对应的答案。
分析:
官方题解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说人话:
在这里插入图片描述

AC代码:

#include <bits/stdc++.h>

using namespace std;

const int inf = 0x3f3f3f3f;
int n;
int ar[8005];
int dp[8005][8005];
struct node
{
    int val, mi, mi_dp;//ar[k],dp[k][j - 1],min(dp[k][j])
}st[8005];

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]);

    memset(dp, 0x3f, sizeof(dp));

    dp[0][0] = 0;

    for(int j = 1; j <= n; ++j)
    {
        int top = 1;
        st[top] = {inf, inf, inf};
        for(int i = 1; i <= n; ++i)
        {
            int mi = dp[i - 1][j - 1];
            while(top >= 1 && st[top].val <= ar[i]) mi = min(mi, st[top--].mi);
            st[top + 1] = {ar[i], mi, min(mi + ar[i], st[top].mi_dp)};
            ++top;
            dp[i][j] = st[top].mi_dp;
        }
        printf("%d\n", dp[n][j]);
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

擎创技术流 | ClickHouse实用工具—ckman教程(1)部署安装

前言&#xff1a; 在数据量日益增长的当下&#xff0c;传统数据库的查询性能已满足不了业务需求。而Clickhouse在OLAP&#xff08;On-Line Analysis Processing——即一种在线分析处理的&#xff0c;用于数据分析的计算方法&#xff09;领域的应用&#xff0c;可以助力企业打造…

云原生之快速使用Nacos Spring Cloud

本文主要面向 Spring Cloud 的使用者&#xff0c;通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务注册发现。 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。通过 Nacos Server 和 spring-cloud-starter-alibab…

iwebsec靶场 SSRF关卡通关笔记

iwebsec靶场SSRF漏洞通关笔记。 1. 源码分析 由于URL参数无经过严格的过滤&#xff0c;那么攻击者可以构造任意的url利用SSRF漏洞 如上所示&#xff0c;分析可知有SSRF漏洞 2.SSRF漏洞文件读取 &#xff08;1&#xff09;访问网址根目录下ssrf文件夹下的1.txt 构造SSRF漏洞访…

云原生 · DevOps | Sonar Qube

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

软银集团:从零到一万亿

第一章 公司发展概况 1.1 企业创始人和发展史 软银集团在1981年由孙正义在日本创立并于1994年在日本上市&#xff0c;是一家综合性的风险投资公司&#xff0c;主要致力IT产业的投资&#xff0c;包括网络和电信。 1981-1996年&#xff08;个人电脑及软件业务时期&#xff09;…

C语言函数针对训练--递归篇(动画讲解,由易到难递归例题)

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 前言 &#x1f496;作者&#xff1a;龟龟不断向前 ✨简介&#xff1a;宁愿做一只不停跑的慢乌龟&#xff0c;也不想当一只三分钟热度的兔子。 &#x1f47b;专栏&#xff1a;C初阶知识点 &#x1f47b;工具分享&#xff1a; …

【FreeRTOS】队列的使用

队列的使用前言创建队列发送数据接收数据查询队列数据个数使用示例创建两个线程配置按键驱动编写按键发送子函数编写按键读取子函数前言 基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的小程序。这些独立的任务之间很可能会通过相互通信以提供有…

leetcode算法每天一题010: 正则表达式,判断pattern和string是否匹配(动态规划)

题目描述 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 PATTERNTRUEFALSEa.baab,abb,acba, ab,ba*bb,ab,aab,aaaba,abb,acbc*a.baab,caab,cccccacb,ccabbbaab,cabbbdp[i] [j] 的含义是当字符串 s 的长度为 i&#xff0c;模式串 p 的长度为 j 时&#xff0c;两…

KubeVela 插件指南:轻松扩展你的平台专属能力

KubeVela 插件&#xff08;addon&#xff09;可以方便地扩展 KubeVela 的能力。正如我们所知&#xff0c;KubeVela 是一个微内核高度可扩展的平台&#xff0c;用户可以通过模块定义&#xff08;Definition&#xff09;[1]扩展 KubeVela 的系统能力&#xff0c;而 KubeVela 插件…

C# Winform程序开发笔记

C#d的开发发展到今天,已经改进了不少,对于非常多的应用可以使用C#进行开发,也非常方便,希望以下笔记对于高级开发者(网络通信、线程应用)而言能有所帮助吧。 1、INI文件的读写操作 1.1 类文件 using System; using System.Collections.Generic; using System.IO; usin…

【SpringBoot笔记21】SpringBoot框架使用AOP + 自定义注解实现请求日志记录

这篇文章&#xff0c;主要介绍SpringBoot框架使用AOP 自定义注解实现请求日志记录。 目录 一、SpringBoot记录日志 1.1、环境搭建 1.2、配置FastJson 1.3、自定义LogRecord注解 1.4、定义日志实体类 1.5、创建HttpRequestUtil工具类 1.6、定义AOP切面 1.7、编写测试类…

arm服务器运行onlyoffice

公司的arm服务器上运行onlyoffice报错 是x86_64架构的镜像在arm服务器下不兼容 需要下载兼容arm架构的docker镜像 在dockerhub上 onlyoffice地址 Docker Hubhttps://hub.docker.com/r/onlyoffice/documentserver 下载兼容arm架构的镜像版本 # docker --version Docker ver…

《从0开始写一个微内核操作系统》5-页表映射

ChinOS https://github.com/jingjin666/GN-base/tree/chinos 页表需要多少空间 在第4节中&#xff0c;我们了解到&#xff0c;每一级页表实际上就是一个512大小的unsigned long数组&#xff0c;一个页表本身占用512*84K空间 /* PGD */ /* 每个ENTRY包含512G内存区域 */ typed…

JavaWeb传统商城(MVC三层架构)的促销功能模块【进阶版】

文章目录一.JavaWeb商城项目的促销功能模块【进阶版】开发过程记录1.1 项目背景1.2 需求分析1.3 开发流程/顺序二.促销页面(0.1颗星)2.1 需求介绍2.2 JSP页面2.3效果展示三,商品详情页面(0.2颗星)3.1 需求介绍和效果图3.2 数据库分析3.2 Servlet层3.3 Service层3.4 DAO层3.5 JS…

一本通1064;奥运奖牌计数

#include <iostream> using namespace std; int main() {int n, Jin, Yin, Tong;int JinSum 0, YinSum 0, TongSum 0, sum;cin >> n;for (int i 1; i < n; i) // 循环n次{cin >> Jin >> Yin >> Tong; // 输入一天获得的金银铜牌数JinSum …

InfluxDB学习记录(三)——influxdb的flux语法

什么是Flux Flux 是 InfluxData 的功能性数据脚本语言&#xff0c;设计用于查询、分析和处理数据&#xff0c;它是InfluxQL 和其他类似 SQL 的查询语言的替代品。 每个 Flux 查询都需要以下内容&#xff1a; 数据源时间范围数据过滤器 Flux代码示例 from(bucket:"example…

重装系统后打印机状态已暂停如何恢复

​当我们在使用打印机打印文件的时候&#xff0c;有时候会发现打印机状态已暂停&#xff0c;打印不下去了&#xff0c;这时候怎么恢复呢&#xff0c;其实只需要取消掉打印暂停就可以了&#xff0c;下面就和大家讲讲重装系统后打印机状态已暂停如何恢复吧。 打印机状态已暂停怎…

【前端】Vue+Element UI案例:通用后台管理系统-Home组件:卡片、表格

文章目录目标代码0.布局1.左上User卡片2.左下table卡片2.1数据&#xff1a;TableData.js2.2table2.3代码优化&#xff1a;循环3.右上数据卡片3.1数据&#xff1a;CountData3.2结构3.3布局3.4样式总代码Home.vue参考目标 红框内部分都是卡片&#xff0c;鼠标悬停会有阴影左下是表…

java计算机毕业设计基于安卓Android的天文观星系统app uniapp 小程序

项目介绍 信息技术的发展带来了大量的数据内容,在这些数据中,想要找到自己需要的只有通过搜索引擎。如今,通过百度去查找信息成为大众的首选,然而在经济利益的驱动下,许多百度来的信息都是商业内容,很难找到真实有用的实际信息。在互联网中平台,天文信息交流和资源共享是一个非…

【每日训练】进制转换

目录 题目链接&#xff1a; 测试用例&#xff1a; 解析&#xff1a; 程序&#xff1a; 题目链接&#xff1a; 进制转换_牛客题霸_牛客网 (nowcoder.com) 测试用例&#xff1a; 解析&#xff1a; 题目描述&#xff1a; 输入一个十进制数&#xff0c;转化为对应输入的几进制数…