关于10-28日题目的题解与总结

本文提供了三道NOIP模拟题的解题思路及代码实现。T1通过离散化简化问题,T3采用正反向SPFA算法解决最短路径问题,而T2则展示了多项式运算的复杂处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NOIP模拟题

总结:T1:10分,T2:0分,T3:100分。

总分只有可怜的110分。。。。。。


T1:离散化就可以过了

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define MAXN 500005
int n,k;
ll ans;
struct node{
    ll w;
    ll id;
}a[MAXN];
int cmp(node aa,node bb){
    return aa.id<bb.id;
}
ll w[MAXN];
int main(){
    int i,j;
    ll x,y;
//  freopen("expedition.in","r",stdin);
//  freopen("expedition.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;++i){
        scanf("%lld%lld",&x,&y);
        a[i].id=y,a[i].w=x;
    }
    sort(a+1,a+n+1,cmp);
    k=0;a[0].id=0;
    for(i=1;i<=n;++i){
        if(a[i].id!=a[i-1].id){
            w[++k]=a[i].w;
        }
        else w[k]+=a[i].w;
    }
    for(i=1;i<=k;++i){
        ans+=w[i]*w[i];
    }
    printf("%lld\n",ans);
    return 0;
}

T3:狂打一波就可以过了

#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 3010
#define MAXM 100050
struct edge{
    int to,last,w;
}edges[MAXM],new_edges[MAXM];
int que[MAXN],dis1[MAXN],dis2[MAXN],head[MAXN],head1[MAXN],cnt;
bool vis[MAXN];
void add(int u,int v,int w){edges[++cnt].to=v,edges[cnt].w=w,edges[cnt].last=head[u],head[u]=cnt;}
void addedges(int u,int v,int w){new_edges[cnt].to=v,new_edges[cnt].w=w,new_edges[cnt].last=head1[u],head1[u]=cnt;}
void zSPFA(){
    int H=0,T=0;
    memset(dis1,0x3f,sizeof dis1);
    memset(vis,false,sizeof vis);
    vis[1]=true;dis1[1]=0;que[++T]=1;
    while(H!=T){
        if(++H>MAXN-5)H=1;
        int x=que[H];vis[x]=false;
        for(int i=head[x];i;i=edges[i].last){
            int to=edges[i].to;
            if(dis1[to]>dis1[x]+edges[i].w){
                dis1[to]=dis1[x]+edges[i].w;
                if(!vis[to]){
                    vis[to]=true;
                    if(++T>MAXN-5)T=1;
                    que[T]=to;
                }
            }
        }
    }
}
void fSPFA(){
    int H=0,T=0;
    memset(dis2,0x3f,sizeof dis1);
    memset(vis,false,sizeof vis);
    vis[1]=true;dis2[1]=0;que[++T]=1;
    while(H!=T){
        if(++H>MAXN-5)H=1;
        int x=que[H];vis[x]=false;
        for(int i=head1[x];i;i=new_edges[i].last){
            int to=new_edges[i].to;
            if(dis2[to]>dis2[x]+new_edges[i].w)
            {
                dis2[to]=dis2[x]+new_edges[i].w;
                if(!vis[to]){
                    vis[to]=true;
                    if(++T>MAXN-5)T=1;
                    que[T]=to;
                }
            }
        }
    }
}
int main(){
    int i,j;
    int n,m,q;
//  freopen("production.in","r",stdin);
//  freopen("production.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);//正向建图 
        addedges(b,a,c);//反向建图 
    }
    zSPFA();//正向 
    fSPFA();//反向 
    scanf("%d",&q);
    for(i=1;i<=q;++i){
        int a,b;
        scanf("%d%d",&a,&b);
        if(dis2[a]==0x3f3f3f3f||dis1[b]==0x3f3f3f3f)printf("-1\n");
        else printf("%d\n",dis2[a]+dis1[b]);
    }
    return 0;
}

T2我不想说什么了。。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 505
#define mod 10007
struct node{
    int size,a[MAXN];
    node operator + (const node &x){
        size=size>x.size?size:x.size;
        for(int i=0;i<=size;++i)a[i]+=x.a[i];
        return *this;
    }
    node operator - (const node &x){
        size=size>x.size?size:x.size;
        for(int i=0;i<=size;++i)a[i]-=x.a[i];
        if(a[size]==0)--size;
        return *this;
    }
    node operator * (const node &x){
        node y;
        memset(y.a,0,sizeof (y.a));
        y.size=size+x.size;
        for(int i=0;i<=size;++i)
            for(int j=0;j<=x.size;++j)
                y.a[i+j]+=a[i]*x.a[j];
        return y;
    }
};
stack<node>st;
stack<char>ch;
string s;
void check(node &q){for(int i=0;i<=q.size;++i)q.a[i]=(q.a[i]%mod+mod)%mod;}
void work(){
    if(ch.top()=='+'){
        node x=st.top();st.pop();
        node y=st.top();st.pop();
        st.push(x+y);
    }
    else if(ch.top()=='-'){
        node x=st.top();st.pop();
        node y=st.top();st.pop();
        st.push(y-x);
    }
    else{
        node x=st.top();st.pop();
        node y=st.top();st.pop();
        st.push(x*y);
    }
    check(st.top());
    ch.pop();
}
bool judge(char c){
    if((c=='+'||c=='-')&&ch.top()!='(')return true;
    if(c=='*'&&ch.top()=='*')return true;
    return false;
}
int main(){
    cin>>s;
    s="(0+"+s+"+0)";
    node x;
    memset(x.a,0,sizeof(x.a));
    x.size=1;
    x.a[1]=1;
    int lens=s.size(),p=0;
    while(p<lens){
        if(s[p]=='('){
            ch.push('(');
            ++p;
        }
        if(s[p]>=48&&s[p]<=57){
            node y;
            y.size=0;
            memset(y.a,0,sizeof(y.a));
            while(s[p]>=48&&s[p]<=57){y.a[0]=y.a[0]*10+s[p++]-48;}
            st.push(y);
        }
        do{
            if(s[p]==')'){
                while(ch.top()!='(')work();
                ch.pop();
            }
            else if(s[p]=='x')st.push(x);
            else{
                while(judge(s[p]))work();
                ch.push(s[p]);
            }
            ++p;
        }while(p<lens&&s[p-1]==')');
    }
    node ans=st.top();
    printf("%d\n",ans.size);
    for(int i=0;i<=ans.size;++i){printf("%d\n",ans.a[i]);}
    return 0;
}

另:有标程:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<stack>

using namespace std;

struct node{
    int size;
    int a[510];//a[i]表示x^i的系数
    node operator + (const node &x){
        size=size>x.size?size:x.size;//取长度较大的那个
        for (int i=0;i<=size;i++) a[i]+=x.a[i];
        return *this;
    }
    node operator - (const node &x){
        size=size>x.size?size:x.size;
        for (int i=0;i<=size;i++) a[i]-=x.a[i];
        if (a[size]==0) size--;
        return *this;
    }
    node operator * (const node &x){
        node y;
        memset(y.a,0,sizeof(y.a));
        y.size=size+x.size;
        for (int i=0;i<=size;i++)
            for (int j=0;j<=x.size;j++)
                y.a[i+j]+=a[i]*x.a[j];
        return y;
    }
};
stack <node> st;//多项式栈 
stack <char> ch;//符号栈 
string s;
void check(node &q){
    for (int i=0;i<=q.size;i++){
        if (q.a[i]<0) q.a[i]+=10007;
        else if (q.a[i]>=10007) q.a[i]%=10007;
    }
}

void work(){
    if (ch.top()=='+'){
        node x=st.top(); st.pop();
        node y=st.top(); st.pop();
        x=x+y;
        st.push(x);
    }
    else if (ch.top()=='-'){
        node x=st.top(); st.pop();
        node y=st.top(); st.pop();
        x=y-x;
        st.push(x);
    }
    else{
        node x=st.top(); st.pop();
        node y=st.top(); st.pop();
        x=x*y;
        st.push(x);
    }
    check(st.top());
    ch.pop();
}

bool judge(char c){
    if ((c=='+'||c=='-')&&ch.top()!='(') return true;
    if (c=='*'&&ch.top()=='*') return true;
    return false;
}

int main(){
    cin>>s;
    s="(0+"+s+"+0)";//s = "a+b" ->s = "(0+a+b+0)" 
    node x;
    memset(x.a,0,sizeof(x.a));
    x.size=1;
    x.a[1]=1;
    int p=0,lens=s.size();
    while (p<lens){
        while (s[p]=='('){//对(处理 
            ch.push('(');
            p++;
        }
        if (s[p]<='9'&&s[p]>='0'){//对数字处理 
            node y;
            y.size=0;
            memset(y.a,0,sizeof(y.a));
            while (s[p]<='9'&&s[p]>='0') y.a[0]=y.a[0]*10+s[p++]-'0';
            st.push(y);
        }
        do{
            if (s[p]==')'){//对)处理 
                while (ch.top()!='(') work();
                ch.pop();
            }
            else if (s[p]=='x') st.push(x);//对x处理 
            else{//对+,-,*处理 
                while (judge(s[p])) work();
                ch.push(s[p]);
            }
            p++;
        }
        while (p<lens&&s[p-1]==')');
    }
    node ans=st.top();
    printf("%d\n",ans.size);
    for (int i=0;i<=ans.size;i++) printf("%d\n",ans.a[i]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值