zoukankan      html  css  js  c++  java
  • 2019 ICPC NanChang Regional Online Contest

    有点毒的比赛。

    题目链接:https://www.jisuanke.com/contest/3870?view=challenges


    B:

    添加一个点连接所有救火点,路径设为0,就变成了跑两次dijkstra的题。

     1 /* Contest nanchang_2019_online
     2  * Problem B
     3  * Team: Make One For Us
     4  */
     5 #include <bits/stdc++.h>
     6 
     7 using namespace std;
     8 
     9 const long long int INF = 10000000000000L;
    10 
    11 struct edge {
    12     int u, v;
    13     long long int w;
    14 };
    15 
    16 struct node {
    17     int u;
    18     long long int d;
    19     bool operator < (const node &n) const {
    20         return d > n.d;
    21     }
    22 };
    23 
    24 long long int read(void) {
    25     char ch;
    26     do {
    27         ch = getchar();
    28     } while (!isdigit(ch));
    29     long long int ret = 0;
    30     while (isdigit(ch)) {
    31         ret *= 10;
    32         ret += ch - '0';
    33         ch = getchar();
    34     }
    35     return ret;
    36 }
    37 
    38 void dijkstra(vector <vector <int>> &graph, vector <edge> &edges, vector <long long int> &dis, int s) {
    39     priority_queue <node> pq;
    40     pq.push({s, dis[s] = 0});
    41     vector <int> vis(graph.size());
    42     while (!pq.empty()) {
    43         auto tmp = pq.top();
    44         pq.pop();
    45         if (vis[tmp.u]) {
    46             continue;
    47         }
    48         vis[tmp.u] = true;
    49         for (unsigned int i = 0; i < graph[tmp.u].size(); i++) {
    50             edge &e = edges[graph[tmp.u][i]];
    51             if (dis[e.v] > dis[e.u] + e.w) {
    52                 pq.push((node) {e.v, dis[e.v] = dis[e.u] + e.w});
    53             }
    54         }
    55     }
    56 }
    57 
    58 int main(void) {
    59     ios::sync_with_stdio(false);
    60     cin.tie(nullptr);
    61     int T;
    62     T = read();
    63     while (T--) {
    64         int n = read(), m = read(), s = read(), k = read(), c = read();
    65         int ptr = 0;
    66         vector <edge> edges(2 * m + k);
    67         vector <vector <int>> graph(n + 1);
    68         auto add_edge = [&] (int u, int v, long long int w) {
    69             graph[u].emplace_back(ptr);
    70             edges[ptr++] = ((edge) {u, v, w});
    71         };
    72         for (int i = 0; i < k; i++) {
    73             int v = read();
    74             add_edge(0, v, 0);
    75         }
    76         for (int i = 0; i < m; i++) {
    77             int u = read(), v = read();
    78             long long int w = read();
    79             add_edge(u, v, w);
    80             add_edge(v, u, w);
    81         }
    82 
    83         vector <long long int> dis(n + 1, INF);
    84         dijkstra(graph, edges, dis, s);
    85         auto ans_s = *max_element(dis.begin() + 1, dis.end());
    86         for (int i = 0; i <= n; i++) {
    87             dis[i] = INF;
    88         }
    89         dijkstra(graph, edges, dis, 0);
    90         auto ans_k = *max_element(dis.begin() + 1, dis.end());
    91 
    92         if (ans_k * c < ans_s) {
    93             cout << ans_k << endl;
    94         } else {
    95             cout << ans_s << endl;
    96         }
    97     }
    98     return 0;
    99 }
    View Code

    C:

    一开始以为是莫队后来发现不对,就以为是字符串乱搞,结果是线段树维护dp矩阵区间合并。原题是Codeforces goodbye 2016 E。(tourist都没做出来的题这么多人做出来,有点假啊)

    E:

    一个n有4e7的约瑟夫问题居然是模拟,死都不信,垃圾数据。

    G:

    签到。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson (curpos<<1)
    15 #define rson (curpos<<1|1)
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 int t;
    21 
    22 int main() {
    23     scanf("%d", &t);
    24     while (t--) {
    25         ll n; scanf("%lld", &n);
    26         if (n == 1) puts("18000");
    27         else puts("0");
    28     }
    29     return 0;
    30 }
    View Code

    H:

    二分矩阵快速幂+记忆化。

     1 #include<bits/stdc++.h>
     2 typedef long long ull;
     3 
     4 using namespace std;
     5 
     6 const int maxn = 1e6 + 10;
     7 const ull mod = 998244353;
     8 
     9 struct Matrix {
    10     ull mem[2][2];
    11     void init() {
    12         memset(mem, 0, sizeof(mem));
    13     }
    14     Matrix operator*(const Matrix &rhs)const {
    15         Matrix ret; ret.init();
    16         for (int i = 0; i < 2; i++) {
    17             for (int j = 0; j < 2; j++) {
    18                 for (int k = 0; k < 2; k++)
    19                     ret.mem[i][j] += mem[i][k] * rhs.mem[k][j];
    20                 ret.mem[i][j] %= mod;
    21             }
    22         }
    23         return ret;
    24     }
    25 } mAns, mBase;
    26 unordered_map<ull, Matrix> M;
    27 
    28 int tot = 0;
    29 Matrix solve(ull n) {
    30     if (M.count(n)) return M[n];
    31     if (n == 1) {
    32         M[n] = mBase;
    33         return mBase;
    34     }
    35     Matrix ret = solve(n / 2ull);
    36     ret = ret * ret;
    37     if (n % 2ull == 1ull) ret = ret * mBase;
    38     return M[n] = ret;
    39 }
    40 
    41 int main() {
    42     ull q, n;
    43     cin >> q >> n;
    44     ull lastans = 0ull;
    45     ull ans = 0;
    46     for (int i = 1ull; i <= q; i++) {
    47         mAns.mem[0][0] = 1, mAns.mem[0][1] = 0;
    48         mBase.mem[0][0] = 3, mBase.mem[0][1] = 1, mBase.mem[1][0] = 2;
    49         if (i >= 2ull) n = (n ^ (ans * ans));
    50         Matrix val = solve(n % (mod - 1));
    51         ans = val.mem[0][1];
    52         lastans = (lastans ^ ans);
    53     }
    54     cout << lastans << endl;
    55     return 0;
    56 }
    View Code

    L:

    三位偏序,cdq分治。待补。

  • 相关阅读:
    623. Add One Row to Tree 将一行添加到树中
    771. Jewels and Stones 珠宝和石头
    216. Combination Sum III 组合总数三
    384. Shuffle an Array 随机播放一个数组
    382. Linked List Random Node 链接列表随机节点
    向github项目push代码后,Jenkins实现其自动构建
    centos下安装Jenkins
    python提取批量文件内的指定内容
    批处理实现:批量为文件添加注释
    python抓取每期双色球中奖号码,用于分析
  • 原文地址:https://www.cnblogs.com/JHSeng/p/11490112.html
Copyright © 2011-2022 走看看