第25次csp题解(前三题)

1、未初始化警告

#include
using namespace std;
const int N = 1e5+10;
bool st[N];
int n,k;
int main()
{
    cin>>n>>k;
    int cnt = 0;
    for(int i=0;i<k;i++)
    {
        int a,b;
        cin>>a>>b;
        if(b!=0&&!st[b]) cnt++;
        st[a] = true;
    }
    cout<<cnt<<endl;

    return 0;
}

2、出现计划
差分

#include
using namespace std;
const int N = 4e5+10;
int n,m,k;
int b[N];
void inset(int l,int r,int c)
{
    b[l]+=c;
    b[r+1]-=c;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        int left = x-y+1;
        left = left>0?left:1;
        int right = x;
        inset(left,right,1);
    }
    for(int i=1;i<=N;i++)
    {
        b[i] = b[i-1]+b[i];
    }
    while(m--)
    {
        int x;
        cin>>x;
        cout<<b[x+k]<<endl;
    }
    return 0;

}

3、计算资源调度器

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 1010, M = 2020;
struct Node
{
    int bel; // 属于哪个可用区
    vector<int> v; // 有哪些计算任务
}nodes[N];
vector<int> co[N]; // co[i]表示第i个可用区内有哪些计算节点
int n,m;
bool st[N]; // 对于每个询问哪些计算节点是满足要求的
unordered_map<int,vector<int>> mp; // 编号为i的应用的计算任务在哪些计算节点上运行
void funb(int na)
{
    // 计算节点亲和性
    if(na == 0)
    {
        for (int i = 1; i <= n; i ++ ) st[i] = true;
    }
    else
    {
        for(auto x : co[na]) st[x] = true;
    }
}
int get_ver(vector<int>& ans,int c)
{
    // 必须要和c在同一个可行区
    unordered_map<int,int> alls;
    for(auto &x : mp[c])
    {
        alls[nodes[x].bel] = 1;
    }
    int t = 0;
    for(auto x : ans)
    {
        int belong = nodes[x].bel;
        if(c != 0 && !alls[belong]) continue;
        if(t == 0) t = x;
        else
        {
            int s1 = nodes[x].v.size(),s2 = nodes[t].v.size();
            if(s1 < s2) t = x;
            else if(s1 == s2 && x < t) t = x;
        }
    }
    return t;
}
int get_ver(vector<int>& ans,int c,int d,int e)
{
    int t = 0;
    unordered_map<int,int> vis,alls;
    for(auto &x : mp[d])
    {
        vis[x] = 1;
    }
    
    for(auto &x : mp[c])
    {
        alls[nodes[x].bel] = 1;
    }
    for(auto x : ans)
    {
        int belong = nodes[x].bel;
        if(!vis[x])
        {
            if(c != 0 && !alls[belong]) continue;
            if(t == 0) t = x;
            else
            {
                int s1 = nodes[x].v.size(),s2 = nodes[t].v.size();
                if(s1 < s2) t = x;
                else if(s1 == s2 && x < t) t = x;
            }
        }
    }
    if(t == 0 && e == 0) return get_ver(ans,c);
    return t;
}
void update(int t,int a)
{
    nodes[t].v.push_back(a);
    mp[a].push_back(t);
}
vector<int> get(int num,int a,int b,int c,int d,int e)
{
    memset(st,0,sizeof st);
    funb(b);
    //func(c);
    // 保存一下反亲和性之前可以用哪些节点
    vector<int> ans;
    for(int i = 1;i <= n; i ++)
    {
        if(st[i]) ans.push_back(i);
    }
    vector<int> res;
    if(ans.size() == 0)
    {
        for(int i = 1;i <= num; i ++) res.push_back(0);
        return res;
    }
    if(d == 0)
    {
        for(int i = 1; i <= num; i ++)
        {
            int t = get_ver(ans,c);
            res.push_back(t);
            if(t != 0) update(t,a);
        }
    }
    else
    {
        for(int i = 1; i <= num; i ++)
        {
            int t = get_ver(ans,c,d,e);
            res.push_back(t);
            if(t != 0) update(t,a);
        }
    }
    return res;
    
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ )
    {
        int x;
        cin >> x;
        nodes[i].bel = x;
        co[x].push_back(i);
    }
    int Q;
    cin >> Q;
    while(Q --)
    {
        int f,a,b,c,d,e;
        cin >> f >> a >> b >> c >> d >> e;
        auto ans = get(f,a,b,c,d,e);
        for(auto &x : ans) cout << x <<" ";
        cout << "\n";
    }
    return 0;
}

你可能感兴趣的:(csp,算法,c++)