6.3错题总结

· · 个人记录

T3(P8893 「UOI-R1」智能推荐)

考试思路:dfs从k开始,如果能做第参数题,就标记,不能就看还要做第几题才能做

考试代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,p,r,ans;
vector<int>e[5005];
bool vis[5005],flag;
void dfs(int x)
{
    if(vis[x]==1)
        return ;
    if(e[x].size()==0)
    {
        flag=1;
        return ;
    }
    bool s=0;
    for(int i=0;i<e[x].size();i++)
        if(vis[e[x][i]]==0)
            dfs(e[x][i]),s=1;
    if(s==0)
    {
        vis[x]=1;
        ans++;
        return ;
    }
    for(int i=0;i<e[x].size();i++)
        if(vis[e[x][i]]==0)
            s=0;
    if(s==0)
        flag=1;
    else
    {
        vis[x]=1;
        ans++;
    }
    return ;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k>>p;
    for(int i=1;i<=p;i++)
    {
        int x;
        cin>>x;
        vis[x]=1;
    }
    cin>>r;
    for(int i=1;i<=r;i++)
    {
        int s,m;
        cin>>s>>m;
        for(int j=1;j<=m;j++)
        {
            int x;
            cin>>x;
            e[s].push_back(x);
        }
    }
    dfs(k);
    if(flag==1)
        cout<<"-1\n";
    else
        cout<<ans;
    return 0;
}

错误原因:算法都搞错了

正确思路:拓扑+dp

正确代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int n,m,p,in[N],dp[N];
vector<int>v[N];
queue<int>q;
bool vis[N];
void topu()
{
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=0;i<v[x].size();i++)
        {
            int y=v[x][i];  
            in[y]--;
            if(in[y]==0)
            {
                if(!vis[y])
                    dp[y]=max(dp[y],dp[x]+1);
                q.push(y);
            }
        }
    }
}
int main()
{
    cin>>n>>m>>p;
    for(int i=1;i<=p;i++)
    {
        int x;
        cin>>x;
        q.push(x);
        vis[x]=1;
    }
    int r;
    cin>>r;
    for(int i=1;i<=r;i++)
    {
        int id,x;
        cin>>id>>x;
        for(int j=1;j<=x;j++)
        {
            int x1;
            cin>>x1;
            v[x1].push_back(id);
            in[id]++;
        }
    }
    topu();
    if(dp[m]<=0)
    {
        cout<<-1<<endl;
        return 0;
    }
    cout<<dp[m]<<endl;
    return 0;
}

T4(P3948 数据结构)

考试思路:骗分

考试代码:

#include<bits/stdc++.h>
using namespace std;
int n,opt,mod,mn,mx;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>opt>>mod>>mn>>mx;
    if(mod==2)
    {
        while(opt--)
        {
            char a;
            int l,r,x;
            cin>>a>>l>>r;
            if(a=='Q')
                cout<<r-l+1<<'\n';
            else
                cin>>x;
        }
        cin>>opt;
        while(opt--)
        {
            int l,r;
            cin>>l>>r;
            cout<<r-l+1<<'\n';
        }
    }
    else
        cout<<-1;
    return 0;
}

错误原因:题面太唬人,给吓倒了

正确思路:差分,如果询问,就转前缀再判断

正确代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[80010],b[80010],sum[80010],ans,now,n,opt,mod,mn,mx,l,r,x,f;
char ch[5];
signed main()
{
    cin>>n>>opt>>mod>>mn>>mx;
    for(int j=1;j<=opt;j++)
    {
        cin>>ch>>l>>r;
        if(ch[0]=='A')
        {
            cin>>x;
            b[l]+=x;
            b[r+1]-=x;
        }
        else
        {
            ans=0;
            now=0;
            for(int i=1;i<=r;i++)
            {
                now+=b[i];
                if(i>=l&&(now*i)%mod>=mn&&(now*i)%mod<=mx)
                    ans++;
            }
            cout<<ans<<'\n';
        }
    }
    cin>>f;
    for(int i=1;i<=n;i++)
    {
        a[i]=a[i-1]+b[i];
        if((a[i]*i)%mod>=mn&&(a[i]*i)%mod<=mx)
            sum[i]=sum[i-1]+1;
        else
            sum[i]=sum[i-1];
    }
    for(int j=1;j<=f;j++)
    {
        cin>>l>>r;
        cout<<sum[r]-sum[l-1]<<'\n';
    }
    return 0;
}