The Preliminary Contest for ICPC Asia Nanjing 2019(A B D H F)

A. The beautiful values of the palace

待补


B. super_log

题意:研究一下就是求幂塔函数 %m的值。

思路:扩展欧拉降幂。

 AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const long long mod = 1e9 + 7;
 5 int a, b, m;
 6 ll eular(ll n)
 7 {
 8     ll ans = n;
 9     for(int i = 2;i * i <= n;i++)
10     {
11         if(n % i == 0)
12         {
13             ans -= ans / i;
14             while(n % i == 0) n /= i;
15         }
16     }
17     if(n != 1) ans -= ans / n;
18     return ans;
19 }
20 int ksm(ll a, ll n, ll mod)
21 {
22     if(n == 0) return 1;
23     if(a <= 1) return a;
24     if (n == 0)
25         return 1;
26     if (a<=1)
27         return a;
28     bool flag = false;
29     ll t = 1;
30     for (int i = 0; i < n; i++)
31     {
32         t = t*a;
33         if (t >= mod)
34         {
35             flag = true;
36             break;
37         }
38     }
39     ll ans = 1;
40     while (n)
41     {
42         if (n & 1)
43         {
44             ans *= a;
45             ans %= mod;
46         }
47         a = a * a % mod;
48         n >>= 1;
49     }
50     if (flag)
51     {
52         ans += mod;
53     }
54     return ans;
55 }
56 ll dfs(int a,int b,ll mod)
57 {
58     if (b == 0)
59         return 1;
60     if (b == 1)
61         return a;
62     if (mod == 1)
63         return 1;
64     ll h1 = ksm(a, dfs(a, b-1, eular(mod)),mod);
65     return h1;
66 }
67 int main()
68 {
69     int t;
70     cin >>t;
71     while(t--)
72     {
73         cin >> a >> b >> m;
74         cout << dfs(a, b, m) % m << endl;
75     }
76     return 0;
77 }
View Code

D. Robots

待补


F. Greedy Sequence

题意:题意好绕的啊,自己看吧。

思路:用线段树查询区间最大值,因为对于每个数 i,只有比他小的数才有用,所以从小到大枚举,在线段树中(此时所有值都小于 i )。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define lson l , m , rt << 1
 4 #define rson m + 1, r, rt << 1 | 1
 5 #define ls rt << 1
 6 #define rs rt << 1 | 1
 7 #define lr2 (l + r) / 2
 8 const int maxn = 1e5+ 50;
 9 int n, k, a[maxn], pos[maxn];
10 int ans[maxn];
11 int sum[maxn* 4] ;
12 void up(int rt){
13     sum[rt] = max(sum[ls], sum[rs]);
14 }
15 void build(int l ,int r, int rt)
16 {
17     sum[rt] = 0;
18     if(l == r) return ;
19     int m = lr2;
20     build(lson);
21     build(rson);
22     up(rt);
23 }
24 int query(int a, int b, int l, int r, int rt)
25 {
26     if(a <= l && b >= r) return sum[rt];
27     int ans = 0;
28     int m = lr2;
29     if(a <= m) ans = max(ans,query(a, b, lson));
30     if(b > m) ans = max(ans, query(a, b, rson));
31     return ans;
32 }
33 void update(int k, int v, int l, int r, int rt)
34 {
35     if(l == r){
36         sum[rt] = v;
37         return;
38     }
39     int m = lr2;
40     if(k <= m) update(k, v, lson);
41     else update(k, v, rson);
42     up(rt);
43 }
44 int main()
45 {
46     std::ios::sync_with_stdio(false);
47     int t;
48     cin >> t;
49     while(t--)
50     {
51         cin >> n >> k;
52         for(int i = 1;i <= n;i++){
53             cin >> a[i];
54             pos[a[i]] = i;
55         }
56         build(1, n, 1);
57         for(int i = 1;i <= n;i++)
58         {
59             int l = max(1, pos[i] - k);
60             int r = min(n, pos[i] + k);
61             int x = query(l, r , 1, n, 1);
62             update(pos[i], i, 1, n, 1);
63             ans[i] = ans[x] + 1;
64         }
65         for(int i = 1;i <= n;i++){
66             cout << ans[i];
67             if(i == n)cout << endl;
68             else cout << " ";
69         }
70     }
71     return 0;
72 }
View Code

H. Holy Grail

题意:给你一张n点m边的有向图,无重边,无负加权循环。请你加6对顶点,请你加6条权值最小的边使之没有负圈。

思路:每给一对顶点,跑一遍最短路,没有负环的条件是没有一条来的路和加的边加起来为负,所以每次加的边和答案为反向最短路。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<queue>
 5 #include<cstring>
 6 #include<algorithm>
 7 using namespace std;
 8 const int maxn = 1e5+5;
 9 const int INF = 0x3f3f3f3f;
10 typedef long long ll;
11 typedef pair<ll,int> P;
12 int n,m;
13 struct edge{
14     int to;
15     ll cost;
16 }es[maxn];
17 vector <edge> G[maxn];
18 ll d[maxn];
19 void dijkstra(int s)
20 {
21     priority_queue<P,vector<P>,greater<P> > que;
22     fill(d,d+m+1,INF);
23     d[s] = 0;
24     que.push(P(0,s));
25     while(!que.empty())
26     {
27         P p= que.top();que.pop();
28         int v = p.second;
29         if(d[v] < p.first) continue;
30         for(int i = 0;i < G[v].size();i++)
31         {
32             edge e = G[v][i];;
33             if(d[e.to] > d[v] + e.cost)
34             {
35 
36                 d[e.to]= d[v] + e.cost;
37                 que.push(P(d[e.to],e.to));
38             }
39         }
40     }
41 }
42 int main()
43 {
44     std::ios::sync_with_stdio(false);
45     std::cin.tie(0);std::cout.tie(0);
46     int t;
47     cin >> t;
48     while(t--)
49     {
50         cin >> n >> m;
51         for(int i = 0;i <= n;i++)G[i].clear();
52         int count = 0;
53         int a,b,c;
54         for(int i = 0;i < m;i++)
55         {
56            cin >> a >> b >> c;
57             es[count].to = b;
58             es[count].cost = c;
59             G[a].push_back(es[count++]);
60         }
61         for(int i = 0;i < 6;i++){
62             cin >> a >> b;
63             dijkstra(b);
64             cout << -d[a] << endl;
65             es[count].to = b;
66             es[count].cost = -d[a];
67             G[a].push_back(es[count++]);
68         }
69 
70     }
71 
72     return 0;
73 }
View Code

猜你喜欢

转载自www.cnblogs.com/Carered/p/11444406.html