0
点赞
收藏
分享

微信扫一扫

每日一题。

1.在这里插入图片描述

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n;
ll a[500010];
ll al[500010],ar[500010];
ll bl[500010],br[500010];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    stack<ll >s1,s2;
    s1.push(1);s2.push(1);
    al[1]=bl[1]=0;
    for(ll i=2;i<=n;i++)
    {
        while(!s1.empty()&&a[s1.top()]<=a[i])s1.pop();
        while(!s2.empty()&&a[s2.top()]>=a[i])s2.pop();
        if(s1.empty())al[i]=0;
        else al[i]=s1.top();
        if(s2.empty())bl[i]=0;
        else bl[i]=s2.top();
        s1.push(i);s2.push(i);
    }
    ar[n]=br[n]=n+1;
    stack<ll >s3,s4;
    s3.push(n);s4.push(n);
    for(ll i=n-1;i>=1;i--)
    {
        while(!s3.empty()&&a[s3.top()]<a[i])s3.pop();
        while(!s4.empty()&&a[s4.top()]>a[i])s4.pop();
        if(s3.empty())ar[i]=n+1;
        else ar[i]=s3.top();
        if(s4.empty())br[i]=n+1;
        else br[i]=s4.top();
        s3.push(i);s4.push(i);
    }
    ll ans=0;
    for(ll i=1;i<=n;i++)
    {
        ans+=(i-al[i])*(ar[i]-i)*a[i];
        ans-=(i-bl[i])*(br[i]-i)*a[i];
    }
    cout<<ans<<"\n";
    return 0;
}

2.在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int a[105][105];
int dp[105][105][105][105];
int Dp(int k,int l,int r,int cur)
{
    if(dp[k][l][r][cur]==-1)
    {
        if(k==1)
        {
            dp[k][l][r][cur]=0;
            return dp[k][l][r][cur];
        }
        else
        {
            dp[k][l][r][cur]=0x3f3f3f3f;
            for(int i=1;i<=n;i++)
            {
                if(i==cur)continue;
                if(i>l&&i<r&&a[cur][i]<0x3f3f3f3f)
                {
                    int L=l,R=r;
                    if(i>cur)L=cur;
                    else R=cur;
                    dp[k][l][r][cur]=min(dp[k][l][r][cur],Dp(k-1,L,R,i)+a[cur][i]);
                }
            }
            return dp[k][l][r][cur];
        }
    }
    else return dp[k][l][r][cur];
}
int main()
{

        cin>>n>>k>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i!=j)a[i][j]=0x3f3f3f3f;
            }
        }
        for(int i=0;i<m;i++)
        {
            int x,y,w;
            scanf("%d%d%d",&x,&y,&w);
            a[x][y]=min(w,a[x][y]);
        }
        for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
            for(int w=0;w<=n+1;w++)
            {
                for(int q=0;q<=n+1;q++)
                {
                    dp[i][j][w][q]=-1;
                }
            }
        }
    }
        int output=0x3f3f3f3f;
        for(int i=1;i<=n;i++)
        {
            output=min(output,Dp(k,0,n+1,i));
        }
        if(output==0x3f3f3f3f||output==-1)printf("-1\n");
        else
        printf("%d\n",output);

}

在这里插入图片描述
lca(最近公共祖先)

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n,m;
ll a[200010],b[200010],k[200010][20],d[200010];
vector<int >v[200010];

void dfs(int x)
{
    for(int i=0;i<v[x].size();i++)
    {
        if(d[v[x][i]]==0)
        {
            d[v[x][i]]=d[x]+1;
            k[v[x][i]][0]=x;
            b[v[x][i]]=a[v[x][i]]^b[x];
            int q=0,p=x;
            while(k[p][q]>0)
            {
                k[v[x][i]][q+1]=k[p][q];
                p=k[p][q++];
            }

            dfs(v[x][i]);
        }
    }
}

int lca(int a,int b)
{
    if(d[a]<d[b])swap(a,b);
    int q=log2(d[a])+1;
    for(int i=q;i>=0;i--)
    {
        if(d[k[a][i]]>=d[b])a=k[a][i];
    }
    if(a==b)return a;
    for(int i=q;i>=0;i--)
    {
        if(k[a][i]!=k[b][i])
        {
            a=k[a][i];
            b=k[b][i];
        }
    }
    if(k[a][0]==k[b][0])return k[a][0];
    else return -1;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<n;i++)
    {
        int x,y;cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    b[1]=a[1];
    d[1]=1;
    dfs(1);
    while(m--)
    {
        int x,y;cin>>x>>y;
        int z=lca(x,y);
        if(z!=-1)
        {
            cout<<(b[x]^b[y]^a[z])<<"\n";
        }
    }
    return 0;
}

4.在这里插入图片描述
抽屉原理

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n;
int a[100010];
int b[100010];
vector<int> f[100010];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin>>n;
    int flag=-1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=(b[i-1]+a[i])%n;
        f[b[i]%n].push_back(i);
        if(f[b[i]%n].size()>=2)flag=b[i]%n;
        if(f[0].size()>0)flag=0;
    }
    if(flag==-1)cout<<"-1\n";
    else
    {
        if(flag==0)
        {
            cout<<f[0][0]<<"\n";
            for(int i=1;i<=f[0][0];i++)cout<<i<<" ";
        }
        else
        {
            cout<<f[flag][1]-f[flag][0]<<"\n";
            for(int i=f[flag][0]+1;i<=f[flag][1];i++)cout<<i<<" ";
        }
    }


    return 0;
}

5.在这里插入图片描述记得了解一下后缀最大值

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n,q;
struct node
{
    int id,x,y;
}a[1000010];

int b[1000010],c[1000010];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>b[i];
    int maxn=-1;
    vector<int >v;
    for(int i=1;i<=q;i++)
    {
        cin>>a[i].id;
        if(a[i].id==1)
        {
            cin>>a[i].x>>a[i].y;
            c[a[i].x]=i;
        }
        else
        {
            cin>>a[i].x;
            if(maxn==-1||a[maxn].x<a[i].x)
            {
                maxn=i;
                v.clear();
            }
            else v.push_back(i);
        }
    }
    int m=v.size();
    vector<int>vm(m+1);
    if(m!=0)
    {
        vm[m-1]=a[v[m-1]].x;
        for(int i=m-2;i>=0;i--)
        {
            vm[i]=max(vm[i+1],a[v[i]].x);
        }
    }
    for(int i=1;i<=n;i++)
    {

        if(maxn==-1)
        {
            if(c[i]==0)cout<<b[i];
            else cout<<a[c[i]].y;
        }
        else
        {
            if(c[i]==0)
            {
                if(b[i]>a[maxn].x)cout<<b[i];
                else cout<<a[maxn].x;
            }
            else
            {
                if(c[i]<maxn)
                {
                    if(a[c[i]].y>a[maxn].x)cout<<a[c[i]].y;
                    else cout<<a[maxn].x;
                }
                else
                {
                    if(a[c[i]].y>a[maxn].x)cout<<a[c[i]].y;
                    else
                    {
                        if(m==0)cout<<a[c[i]].y;
                        else
                        {
                            if(v[m-1]<c[i])cout<<a[c[i]].y;
                            else
                            {
                                int l=0,r=m-1;
                                while(l<r)
                                {
                                    int mid=l+(r-l)/2;
                                    if(v[mid]>c[i])r=mid;
                                    else l=mid+1;
                                }
                                if(vm[l]>a[c[i]].y)cout<<vm[l];
                                else cout<<a[c[i]].y;
                            }
                        }
                    }
                }
            }
        }
        cout<<" ";
    }
    return 0;
}

举报

相关推荐

0 条评论