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 }
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 }
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 }
