8.21NOIP Day7模拟赛

T1

不难看出加号后面是不会加左括号的,只有减号后面会加括号

在减号后面加括号等价于在无括号情况下区间乘上 \(-1\)

显然的,我们可以将所有的区间改为只有不交和包含两种关系

由于所有数非负,所以我们要尽可能使区间乘 \(-1\) 次数为奇数的次数最小

观察发现,对于存在包含关系的区间集合,我们可以构造方案,使得只有第一个左端点到第二个左端点这一段被覆盖奇数次,并且这一段一定只会被覆盖一次,所以这样一定最优

同时,对于两个不交的区间集合,如果前者至少包含两个区间,那么我们把后者合并进去一定是不劣的,最终只会留下一个复数集合

如果区间集合只有一个左端点那么只选一个点一定最优

所以我们可以枚举复数集合的左端点,对所有答案 \(ans\) 取最小值,然后最终答案为 \(sum-ans\times 2\)

#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
int x[N],n,y[N],suf[N];
char s[N];
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<n;i++)scanf("%lld %c ",&x[i],&s[i+1]);
    scanf("%lld",&x[n]);
    for(int i=1;i<=n;i++)y[i]=y[i-1]+x[i];
    int last=n+1;
    for(int i=n;i;i--)if(s[i]=='-'){
        suf[i]=last;
        last=i;
    }
    int summ=0,ans=1e15;
    while(last<=n){
        ans=min(ans,y[suf[last]-1]-y[last-1]+summ);
        summ+=x[last];
        last=suf[last];
    }
    ans=min(ans,summ);
    printf("%lld\n",y[n]-ans*2);
    return 0;
}

T2

我们对于取过最小值,取过最大值,都没取过和都取过了进行分开讨论

不难发现,最小值取了非最小值,最大值取了非最大值一定不优,所以会被自然淘汰

所以可以直接跑分层图最短路

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int> 
#define N 200005
using namespace std;
priority_queue<pair<int,pii> >q;
int dis[N][5],n,m;
vector<pii>y[N];
void dij(){
    for(int i=1;i<=n;i++)for(int j=0;j<=3;j++)dis[i][j]=1e18;
    dis[1][0]=0;
    q.push(mp(0,mp(1,0)));
    while(!q.empty()){
        int summ=-q.top().fi;
        pii u=q.top().se;
        q.pop();
        for(int i=0;i<y[u.fi].size();i++){
            if(dis[y[u.fi][i].fi][u.se]>dis[u.fi][u.se]+y[u.fi][i].se){
                dis[y[u.fi][i].fi][u.se]=dis[u.fi][u.se]+y[u.fi][i].se;
                q.push(mp(-dis[y[u.fi][i].fi][u.se],mp(y[u.fi][i].fi,u.se)));
            }
            if(!(u.se&1)&&dis[y[u.fi][i].fi][u.se+1]>dis[u.fi][u.se]+y[u.fi][i].se*2){
                dis[y[u.fi][i].fi][u.se+1]=dis[u.fi][u.se]+y[u.fi][i].se*2;
                q.push(mp(-dis[y[u.fi][i].fi][u.se+1],mp(y[u.fi][i].fi,u.se+1)));
            }
            if(!(u.se&2)&&dis[y[u.fi][i].fi][u.se+2]>dis[u.fi][u.se]){
                dis[y[u.fi][i].fi][u.se+2]=dis[u.fi][u.se];
                q.push(mp(-dis[y[u.fi][i].fi][u.se+2],mp(y[u.fi][i].fi,u.se+2)));
            }
            if(!u.se&&dis[y[u.fi][i].fi][u.se+3]>dis[u.fi][u.se]+y[u.fi][i].se){
                dis[y[u.fi][i].fi][u.se+3]=dis[u.fi][u.se]+y[u.fi][i].se;
                q.push(mp(-dis[y[u.fi][i].fi][u.se+3],mp(y[u.fi][i].fi,u.se+3)));
            }
        }
    }
    return;
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%lld%lld%lld",&u,&v,&w);
        y[u].pb(mp(v,w));
        y[v].pb(mp(u,w));
    }
    dij();
    for(int i=2;i<=n;i++)printf("%lld ",dis[i][3]);
    return 0;
}

T3

从大到小排序,状态为当前分组的大小为 \(i\),剩余 \(j\) 个人未分组,通过组合数跑分组背包状物转移,最终状态为 \(f_{1,0}\)

#include<bits/stdc++.h>
#define int long long 
#define N 3005
#define mod 998244353
using namespace std;
int x[N],n,P[N],inv[N],f[N][N],dp[N][N],cnt[N],to[N];
int mpow(int a,int p){
    int ans=1;
    while(p){
        if(p&1)ans=ans*a%mod;
        a=a*a%mod;
        p=p/2;
    }
    return ans;
}
int C(int u,int v){return P[u]*inv[v]%mod*inv[u-v]%mod;}
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&x[i]);
    for(int i=1;i<=n;i++)cnt[x[i]]++;
    P[0]=1,inv[0]=1;
    for(int i=1;i<=n;i++)P[i]=P[i-1]*i%mod;
    for(int i=1;i<=n;i++)inv[i]=inv[i-1]*mpow(i,mod-2)%mod;
    for(int i=0;i<=n;i++)for(int j=0;j<=i;j++)f[i][j]=C(i,j);
    dp[n+1][0]=1;
    for(int i=n;i>=1;i--){
        for(int j=0;j<=n;j++)to[j]=0;
        for(int j=0;j+cnt[i]<=n;j++)dp[i][j+cnt[i]]=dp[i+1][j];
        for(int j=1;j*i<=n;j++){
            int now=inv[j];
            for(int k=1;k<=j;k++)now=now*f[k*i][i]%mod;
            for(int k=j*i;k<=n;k++)to[k-i*j]=(to[k-i*j]+dp[i][k]*now%mod*f[k][k-i*j]%mod)%mod;
        }
        for(int j=0;j<=n;j++)dp[i][j]=(dp[i][j]+to[j])%mod;
    }
    printf("%lld\n",dp[1][0]);
    return 0;
}
posted @ 2025-08-21 11:34  Igunareo  阅读(8)  评论(0)    收藏  举报