Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)

B2 - TV Subscriptions (Hard Version)

Traversal, maintain a set and set <pair <int, int >> can

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e6+7;
 5 const ll mod = 1e9 + 9;
 6 #define afdafafafdafaf y1;
 7 int ar[maxn], n, m, k;
 8  
 9 int d[maxn];
10 int main()
11 {
12     int t;
13     scanf("%d", &t);
14     while(t--){
15         scanf("%d%d%d", &n, &m, &k);
16         for(int i=1;i<=n;i++)scanf("%d", ar+i);
17         for(int i=1;i<=n;i++)d[ar[i]] = 0;
18         set<int> s;
19         set<pair<int,int> > sp;
20         for(int i=1;i<=k;i++){
21             d[ar[i]]++;
22         }
23         for(int i=1;i<=k;i++){
24             s.insert(ar[i]);
25             sp.insert(make_pair(ar[i], d[ar[i]]));
26         }
27         int ans = s.size();
28         for(int i = k + 1; i <= n; i++){
29             int x = ar[i - k];
30             sp.erase(make_pair(x, d[x]));
31             d[x]--;
32             if(d[x] > 0){
33                 sp.insert(make_pair(x, d[x]));
34             }
35             else{
36                 s.erase(x);
37             }
38             x = ar[i];
39             sp.erase(make_pair(x, d[x]));
40             d[x]++;
41             sp.insert(make_pair(x, d[x]));
42             if(d[x] == 1)s.insert(x);
43             ans = min(ans, int(s.size()));
44         }
45         printf("%d\n", ans);
46     }
47     
48     return 0;
49 }
View Code

 

C - p-binary

Violence try. . . .

try a try, ac is ok

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e6+7;
 5 const ll mod = 1e9 + 9;
 6 #define afdafafafdafaf y1;
 7 int ar[maxn], n, m, k;
 8  
 9 int d[maxn];
10 int main()
11 {
12     ll n, p;
13     int flag = 0;
14     scanf("%lld%lld", &n, &p);
15     for(ll i=1;i<=int(3e5);i++){
16         ll x = n - p * i, pre = x;
17         int ins = 0;
18         while(x > 0){
19             if(x & 1)ins++;
20             x /= 2;
21         }
22         if(i <= pre && i >= ins){
23             printf("%d\n", i);
24             flag = 1;
25             break;
26         }
27     }
28     if(flag != 1){
29         printf("-1\n");
30     }
31     return 0;
32 }
View Code

 

D - Power Products

If a number of the form x ^ k may be formed, then the power of each of his prime factors must be a multiple of k, and the power factor for each mass% k of each number, the value of k is complemented (i.e. compensation value * the original value is in the form x ^ k) 

And multiplying the number can identify each can meet a minimum fill condition value, to find a set number of

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e6+7;
 5 const ll mod = 1e9 + 9;
 6 #define afdafafafdafaf y1;
 7 int ar[maxn], n, m, k;
 8  
 9 int d[maxn], rev[maxn];
10 int main()
11 {
12     scanf("%d%d", &n, &k);
13     for(int i=1;i<=n;i++)scanf("%d", ar+i);
14     for(int in=1;in<=n;in++){
15         ll x = ar[in];
16         ll re = 1;
17         for(int i=2; i<=sqrt(x);i++){
18             int ins = 0;
19             ll base = 1, ss = 1;
20             while(x % i == 0){
21                 ss *= i;
22                 ins++;
23                 x /= i;
24             }
25             if(ins > 0){
26                 for(int j=0;j<k;j++){
27                     base *= i;
28                     if(base > ll(1e10)){
29                         base = 0;
30                         ar[in] = 0;
31                         re = 0;
32                         break;
33                     }
34                 }
35                 if(base == 0)break;
36                 while(ss % base == 0){
37                     ss /= base;
38                     ar[in] /= base;
39                 }
40                 assert(base % ss == 0);
41                 if(ss != 1)re *= (base / ss);
42                 if(re > int(1e5)){
43                     re = 0;
44                     ar[in] = 0;
45                     break;
46                 }
47             }
48         }
49         if(x > 1 && re != 0){
50             for(int j = 0; j < k - 1; j++){
51                 re *= x;
52                 if(re > int(1e5)){
53                     re = 0;
54                     ar[in] = 0;
55                     break;
56                 }
57             }
58         }
59         if(ar[in] > 0)d[ar[in]]++;
60         rev[in] = re;
61         //cout<< ar[in] << ' ' << rev[in] << '\n';
62     }
63     ll sum = 0;
64     for(int i=1;i<=n;i++){
65         if(rev[i] > int(1e5) || rev[i] == 0)continue;
66         sum += d[rev[i]];
67         if(ar[i] == rev[i] && ar[i] > 0)sum--;
68     }
69     printf("%lld\n", sum / 2);
70  
71   
72      Return  0 ;
73 }
View Code

 

E - Rock Is Push

Seeking the right for each point down and went to the farthest point

When the number of times each dp just need to calculate the left point down the road, the number of the above point to the right

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 2e3+7;
 5 const ll mod = 1e9 + 7;
 6 #define afdafafafdafaf y1;
 7 int ar[maxn], n, m, k;
 8  
 9 char g[maxn][maxn];
10 ll s[2][maxn][maxn<<2];
11 void add(int ins, int x, int y, ll val){
12     while(y <= max(n, m)){
13         s[ins][x][y] += val + mod;
14         s[ins][x][y] %= mod;
15         y += y & (-y);
16     }
17 }
18 ll que(int ins, int x, int y){
19     ll ans = 0;
20     while(y > 0){
21         ans += s[ins][x][y] + mod;
22         ans %= mod;
23         y -= y & (-y);
24     }
25     return ans;
26 }
27 void add_all(int ins, int x, int l, int r, ll val){
28     add(ins, x, l, val);
29     add(ins, x, r+1, -val);
30 }
31 int r[maxn][maxn], c[maxn][maxn], f_r[maxn], f_c[maxn];
32 ll ans[maxn][maxn];
33 int main()
34 {
35     scanf("%d%d", &n, &m);
36     for(int i=1;i<=n;i++){
37         scanf("%s", g[i] + 1);
38     }
39     for(int i=1;i<=n;i++){
40         //cout << g[i] + 1 << '\n';
41     }
42     for(int i = n; i >= 1; i--){
43         for(int j = m; j >= 1; j--){
44             r[i][j] = r[i][j+1] + (g[i][j] == '.'); 
45             c[i][j] = c[i+1][j] + (g[i][j] == '.'); 
46         }
47     }
48     /*
49     for(int i=1;i<=n;i++){
50         for(int j=1;j<=m;j++)cout<< r[i][j] << ' '; cout << '\n';
51     }
52     for(int i=1;i<=n;i++){
53         for(int j=1;j<=m;j++)cout<< c[i][j] << ' '; cout << '\n';
54     }
55     cout<<"\n\n";
56     */
57     for(int i=1;i<=n;i++){
58         for(int j=1;j<=m;j++){
59             ll rs = 0, cs = 0;
60             if(i == 1 && j == 1){
61                 rs = cs = 1;
62             }
63             if(j != 1){
64                 rs = que(0, i, j);
65             }
66             int len1;
67             len1 = c[i+1][j];
68             add_all(1, j, i+1, i+len1, rs);
69             if(i != 1){
70                 cs = que(1, j, i);
71             }
72             int len2 = r[i][j+1];
73             add_all(0, i, j+1, j+len2, cs);
74             if(i == 1 && j == 1)ans[i][j] = 1;
75             else ans[i][j] = rs + cs;
76             //cout<< i <<' ' << j << ' ' << rs << ' ' << cs << ' ' << len1 << ' ' << len2 << '\n';
77         }
78     }
79     printf("%lld\n", ans[n][m] % mod);
80     return 0;
81 }
View Code

Drag God dp complexity more Niubi

It attached links

https://codeforc.es/contest/1246/submission/63454015

 

Guess you like

Origin www.cnblogs.com/wa007/p/11746204.html