首页 > 其他分享 >2024 (ICPC) Jiangxi Provincial Contest L 题 Campus 题解

2024 (ICPC) Jiangxi Provincial Contest L 题 Campus 题解

时间:2025-01-20 23:32:11浏览次数:1  
标签:Provincial Contest int 题解 ll vec now id dis

简单思路

首先对于所有的出口求一遍最短路,由于出口只会打开并关闭一次,所以大门的开启状态是相当有限的(最多大概30种),我们对于每一种状态直接暴力求答案最后输出即可。

复杂度大概\(O(knlogn)\)

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define endl '\n'
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define Forget_that return
#define Just_go 0
#define Endl endl
#define ednl endl
#define eldn endl
#define dnel endl
#define enndl endl
#define Ednl endl
#define Edml endl
#define llmax 9223372036854775807
#define intmax 2147483647

ll n, m, k, T;

struct edge
{
    int to;
    ll value;
    edge(int too, int val)
    {
        to = too;
        value = val;
    }
    bool operator<(const edge &b) const
    {
        return value > b.value;
    }
};

struct point
{
    vector<edge> vec;
} arr[100005];

ll dis[100][100005];
bool isFang[100005];

void dij(int id, int p)   //求每一个出口的最短路
{
    _rep(i, 1, n) isFang[i] = false;

    _rep(i, 1, n) dis[id][i] = intmax;
    dis[id][p] = 0;

    priority_queue<edge> q;
    edge tempaaa(p, 0);
    q.push(tempaaa);

    while (!q.empty())
    {
        edge fir = q.top();
        int now = fir.to;
        q.pop();
        if (isFang[now])
            continue;
        isFang[now] = true;
        for (auto it = arr[now].vec.begin(); it != arr[now].vec.end(); it++)
        {
            if (dis[id][(*it).to] > dis[id][now] + (*it).value)
            {
                dis[id][(*it).to] = dis[id][now] + (*it).value;
                edge t((*it).to, dis[id][(*it).to]);
                q.push(t);
            }
        }
    }
}

ll people[1000006];

struct ChuKou
{
    int p;
    int beg;
    int end;
} chuKou[100];

struct zhuangtai
{
    vector<int> vec;
} timeLcx[1000006];

set<vector<int>> st;
map<vector<int>, ll> mp;

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

    cin >> n >> m >> k >> T;

    for (int i = 1; i <= n; i++)
    {
        cin >> people[i];
    }

    for (int i = 1; i <= k; i++)
    {
        cin >> chuKou[i].p >> chuKou[i].beg >> chuKou[i].end;
    }

    for (int i = 1; i <= m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        arr[u].vec.push_back(edge(v, w));
        arr[v].vec.push_back(edge(u, w));
    }

    for (int t = 1; t <= T; t++)   //记录所有门的状态
    {
        for (int i = 1; i <= k; i++)
        {
            if (t >= chuKou[i].beg && t <= chuKou[i].end)   //如果开启记录1
                timeLcx[t].vec.push_back(1);
            else
                timeLcx[t].vec.push_back(0);      //如果开启记录0
        }
        st.insert(timeLcx[t].vec);
    }

    for (int i = 1; i <= k; i++)          //求所有出口的最短路
    {
        dij(i, chuKou[i].p);
    }

    for (auto it = st.begin(); it != st.end(); it++)    //对于所有情况求最答案
    {
        vector<int> temp;
        for (int i = 0; i < (int)it->size(); i++)
        {
            if ((*it)[i] == 1)
                temp.push_back(i + 1);
        }

        if (temp.size() == 0)
        {
            mp[*it] = -1;
            continue;
        }

        ll ansJuli = 0;
        for (int i = 1; i <= n; i++)
        {
            ll minJuli = llmax;
            for (int j = 0; j < (int)temp.size(); j++)
            {
                minJuli = min(dis[temp[j]][i], minJuli);
            }
            ansJuli += people[i] * minJuli;
        }
        mp[*it] = ansJuli;             //答案记录
    }

    for (int t = 1; t <= T; t++)
    {
        cout << mp[timeLcx[t].vec] << endl;
    }

    Forget_that Just_go;
}

标签:Provincial,Contest,int,题解,ll,vec,now,id,dis
From: https://www.cnblogs.com/acidbarium/p/18682659

相关文章

  • VP AtCoder Beginner Contest 380
    A-123233模拟即可。点击查看代码voidsolve(){intcnt[10]{};intn;std::cin>>n;while(n){ ++cnt[n%10]; n/=10;}for(inti=1;i<=3;++i){ if(cnt[i]!=i){ std::cout<<"No\n&qu......
  • Codeforces Round 998 (Div. 3) 部分题解
    写题解的时候这场在评测,就不放代码了。E.GraphComposition题意给两个无向简单图,对图\(1\)添加若干条边或删除若干条边,使得两图的连通性一致,最少需要变更多少条边。题解求出图\(2\)的连通性,考虑图\(1\)的所有边,若违背了图\(2\)联通性的要删除(图\(2\)不联通但图\(......
  • 20250120 T2 simu题解
    简单模拟(simu)【题目描述】给定$a_1,a_2,\ldots,a_n$和$b_1,b_2,\ldots,b_n$。对于所有整数$x\in[l,r]$,模拟以下过程并求出变量$res$的最终的值。res=0fori=1ton:ifx>=a[i]:x=x-a[i]res=res+b[i]【输入格式】......
  • 「题解」二进制与一
    传送门:水滴、洛谷题目大意:给定一个正整数$n$,给出操作次数$p$。每次操作让$n$加上一个非负整数$x$,使得$n$的第$k$位为$0$(从右往左数)。如果本身为$1$就不用操作。且每次操作$n+x$回影响后续操作。问$x$的和是多少。首先我们要知道,判断$n$的第$k$位是否为$......
  • AtCoder Grand Contest 001
    AtCoderGrandContest001-AtCoder.CDEF看了题解才会。2025.1.17打比赛、补题。2025.1.18写题解。A简单贪心,排序后相邻的放一起。B有点吓人,但是画图手玩一下就可以看出,除了开头和结尾,每一轮是在走一个平行四边形,于是递归。类似辗转相除法求\(\gcd\)递归算一下(不是......
  • AtCoder Grand Contest 002
    AtCoderGrandContest002-AtCoder.EF赛时不会,ENekopedia给我讲了,F看了题解。2025.1.18打比赛、补题、写题解。A随便分讨一下。有一种是看\((b-a+1)\)的奇偶性。可以按\(a<0,a=0,a>0\)来先对\(a\)分类,再分讨对应的\(b\)。总结:注意思路清晰点,分讨要有条理,不要......
  • 题解:CF580B Kefa and Company
    CF580BKefaandCompany前言。其实本题与这道题极为相似,所以建议降橙。思路因为输入顺序不影响就结果,所以可以先给\(a\)按照工资从小到打排序一下序(这里\(a\)使用MAP)。然后再使用尺取法,只要\(a_{r+1}\)的值减\(a_l\)的值\(\ltk\)就将\(r\)加\(1\)。然后发现每......
  • [BZOJ3160] 万径人踪灭 题解
    首先正难则反,想到答案即为满足第一条要求的回文子序列数量,减去回文子串数量。回文子串数量\(hash+\)二分即可,考虑前半部分。假如我们将一个回文子序列一层层剥开,就会发现它其实是由多个相同的字母对拼成的。那么容易想到把字母\(a\)和字母\(b\)的贡献分开计算。那第一条要......
  • PKUWC 2025 题解
    本人太菜,实在不会T3,所以只有T1,T2的题解。注:考场上只做出来了Day1T1,其他题参考了其他人的题解。Day1T1电池检测题面有\(a\)个有电的电池和\(b\)个没电的电池,每次只能选择两个电池放进手电筒,只有这两个电池全有电才能让手电筒启动。问最坏情况下最少可以让手电筒启......
  • AtCoder Beginner Contest 389
    A-9x9题意一位数的乘法思路模拟代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ strings; cin>>s; cout<<(s[0]-'0')......