zoukankan      html  css  js  c++  java
  • Codeforces 311C Fetch the Treasure 取模意义下的最短路 (看题解)

    Fetch the Treasure

    感觉这题很nb啊, 虽然套了一个一点都不有趣的壳子。

    我们注意到 k 的值在 1e4以内, 我们用d[ i ] 表示在模 k == i 能达到的最小的值是谁。

    用最短路取更新。。

    #include<bits/stdc++.h>
    #define LL long long
    #define LD long double
    #define ull unsigned long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PLL pair<LL, LL>
    #define PLI pair<LL, int>
    #define PII pair<int, int>
    #define SZ(x) ((int)x.size())
    #define ALL(x) (x).begin(), (x).end()
    #define fio ios::sync_with_stdio(false); cin.tie(0);
    
    using namespace std;
    
    const int N = 1e5 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 + 7;
    const double eps = 1e-8;
    const double PI = acos(-1);
    
    template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
    template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;}
    template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
    template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;}
    
    LL h;
    int n, m, k;
    LL a[N];
    int c[N];
    LL d[N];
    bool ban[N];
    
    vector<PII> vc[N];
    set<PII> Set;
    
    int main() {
        memset(d, INF, sizeof(d));
        scanf("%lld%d%d%d", &h, &n, &m, &k);
        d[0] = k;
        for(int i = 1; i <= n; i++) scanf("%lld%d", &a[i], &c[i]), a[i]--;
        for(int i = 1; i <= n; i++) {
            if(a[i] % k == 0) {
                Set.insert(mk(c[i], -i));
                ban[i] = true;
            }
        }
        while(m--) {
            int op; scanf("%d", &op);
            if(op == 1) {
                LL x; scanf("%lld", &x);
                priority_queue<PLI, vector<PLI>, greater<PLI> > que;
                chkmin(d[x % k], x);
                for(int i = 0; i < k; i++) if(d[i] < INF) que.push(mk(d[i], i));
                while(!que.empty()) {
                    int u = que.top().se; LL dis = que.top().fi;
                    que.pop();
                    if(dis > d[u]) continue;
                    int v = (u + x) % k;
                    if(chkmin(d[v], dis + x)) {
                        que.push(mk(d[v], v));
                    }
                }
                for(int i = 1; i <= n; i++) {
                    if(ban[i]) continue;
                    if(d[a[i] % k] > a[i]) continue;
                    ban[i] = true;
                    Set.insert(mk(c[i], -i));
                }
            } else if(op == 2) {
                int x, y;
                scanf("%d%d", &x, &y);
                if(ban[x]) {
                    Set.erase(mk(c[x], -x));
                    c[x] -= y;
                    Set.insert(mk(c[x], -x));
                } else {
                    c[x] -= y;
                }
            } else {
                if(!SZ(Set)) puts("0");
                else {
                    printf("%d
    ", Set.rbegin()->fi);
                    Set.erase(*Set.rbegin());
                }
            }
        }
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/CJLHY/p/10901009.html
Copyright © 2011-2022 走看看