2021省赛选拔赛

  |  
solved A B C D E F G H I J K L
11 / 12 O Ø Ø Ø Ø · Ø O O O O Ø
  • O:比赛时通过
  • Ø:赛后通过
  • !:比赛时尝试了未通过
  • ·:比赛时未尝试

比赛链接

A - Array Permutation

solved by Tryna. 00:24(+)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int manx = 1e5 + 10;
const int mod = 1e9 + 7;

ll qpow(ll n, ll k) {
ll ans = 1;
while(k) {
if(k & 1)
ans = ans * n % mod;
n = n * n % mod;
k >>= 1;
}
return ans;
}

void solve() {
ll n;
scanf("%lld", &n);
printf("%lld\n", qpow(2, n - 1));
}

int main() {
int t = 1;
scanf("%d", &t);
while(t--)
solve();
return 0;
}

B - Baom and Fibonacci

solved by Tryna. (-)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define LL __int128;
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
#define mp(a,b) make_pair(a,b)
#define PAUSE system("pause");
const double eps = 1e-8;
const int maxn = 5e6 + 10;
const int N = 3;
const int mod = 998244353;
int prime[maxn], check[maxn];
ll phi[maxn];
unordered_map<ll, ll> ans_phi;
ll f1[N][N]={{1,1,1}};
ll A[N][N]={
{0,1,0},
{1,1,1},
{0,0,1}
};

void mul(ll a[][N],ll b[][N]){
ll c[N][N]={0};
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
c[i][j] = (c[i][j] + a[i][k] * b[k][j] % mod) % mod;
memcpy(a,c,sizeof c);
}

void quick_pow(ll a[][N], ll k){
ll E[N][N]={ //单位阵
{1,0,0},
{0,1,0},
{0,0,1}
};
while(k){
if(k&1) mul(E,a);
mul(a,a);
k>>=1;
}
memcpy(a,E,sizeof E);
}
void init() {
phi[1] = 1;
int tot = 0;
for(int i = 2; i <= maxn; i++) {
if(!check[i]) {
prime[tot++] = i;
phi[i] = i - 1;
}
for(int j = 0; j < tot; j++) {
if(i * prime[j] > maxn) break;
check[i * prime[j]] = true;
if(i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else{
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
for(int i = 1; i <= maxn; i++) {
phi[i] += phi[i - 1];
}
}
ll get_phi(ll x) {
if(x <= maxn) return phi[x];
if(ans_phi[x]) return ans_phi[x];
ll ans;
if(x % 2 == 0)
ans = x / 2 % mod * (x + 1) % mod;
else
ans = (x + 1) / 2 % mod * x % mod;
// ll ans = (ll)(x + 1) % mod * (ll)x % mod / 2;
for(ll l = 2, r; l <= x; l = r + 1){
r = x / (x / l);
ans = (ans - (r - l + 1) * get_phi(x / l) % mod + mod) % mod;
// ans -= (r - l + 1) * get_phi(x / l);
}
ans_phi[x] = ans;
return ans;
}
ll get_ans(ll n) {
ll sum = 0;
ll last = 0;
for(ll l = 1, r; l <= n; l = r + 1){
r = n / (n / l);
// ans += (r - l + 1) * (n / l);
ll res = ((2 * get_phi(n / l) - 1) % mod) % mod;
// sum = (sum + (2 * get_phi(n / l) - 1) * (r - l + 1) % mod) % mod;
// printf("*%lld %lld\n", l, r);
ll f1[N][N]={{1,1,1}};
ll A[N][N]={
{0,1,0},
{1,1,1},
{0,0,1}
};
quick_pow(A, r - 1);
mul(f1, A);
// last = (f1[0][2] + mod + last) % mod;
ll tmp = (f1[0][2] - last + mod) % mod;
// printf("*%lld %lld %lld %lld\n", tmp, res, l, r);
sum = (sum + res * tmp % mod) % mod;
// printf("*%lld %lld %lld %lld %lld\n", sum, res, tmp, l, r);
last = f1[0][2] % mod;
}
return sum;
}
void solve(){
ll n;
scanf("%lld", &n);
printf("%lld\n", get_ans(n));
}
int main() {
init();
int t = 1;
// scanf("%d", &t);
// cin>>t;
// for(int i = 1; i <= 5; i++)
// printf("*%d\n", phi[i]);
while(t--)
solve();
return 0;
}

C - Circle Minimal

sovled by lllllan. (-)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;

int n;
int cir[maxn];
int pre[maxn]; // e
int vis[maxn], dfn;

struct edge {
int id, v, w;
friend bool operator<(const edge &A, const edge &B) {
return A.w < B.w; }
};
vector<edge> G[maxn];

int c1, c2;
struct Edge {
int a, b, w;
friend bool operator<(const Edge &A, const Edge &B) {
return A.w < B.w; }
} E[maxn], dE[maxn * 10];

void dfs (int u, int fa) {
pre[u] = fa;
vis[u] = ++dfn;
for (auto e : G[u]) {
int v = e.v;
if (v == fa) continue;
if (vis[v]) {
if (vis[v] < vis[u]) continue;
while (1) {
cir[v] = 1;
if (v == u) break;
v = pre[v];
}
} else dfs(v, u);
}
}

int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
int u, v, w; scanf("%d%d%d", &u, &v, &w);
G[u].push_back({i, v, w});
G[v].push_back({i, u, w});
}
dfs(1, 0);

for (int u = 1; u <= n; ++u) if (cir[u]) {
for (auto e : G[u]) {
int v = e.v;
if (cir[v] == 1) E[++c1] = {e.id, 0, e.w};
}
}

for (int u = 1; u <= n; ++u) {
sort(G[u].begin(), G[u].end());
for (int i = 0, sz = G[u].size(); i < sz; ++i) {
if (i > 2) break;
for (int j = i + 1; j < sz; ++j) {
if (j > 2) break;
dE[++c2] = {G[u][i].id, G[u][j].id, G[u][i].w + G[u][j].w};
}
}
}

sort(E + 1, E + c1 + 1);
sort(dE + 1, dE + c2 + 1);

int flag = 1;
int ans = 0x3f3f3f3f;
for (int i = 1; i <= c1 && flag; ++i) {
if (E[i].w >= ans) break;
for (int j = 1; j <= c2 && flag; ++j) {
if (dE[1].w >= ans) flag = 0;
if (dE[j].w >= ans) break;
if (E[i].a == dE[j].a || E[i].a == dE[j].b) continue;
ans = min(ans, E[i].w + dE[j].w);
break;
}
}

printf("%d\n", ans);
return 0;
}

D - Double Pleasure

solved by Sstee1XD. (-)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <bits/stdc++.h>

using namespace std;

#define endl "\n"

inline int read() {
int f = 0; int x = 0; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) f |= (ch == '-');
for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
if (f) x = -x;
return x;
}

typedef long long ll;

const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 210;

ll a, b;
ll dp[20][227][227];
int dit[27], tot;
int num[17];
int t[] = {2, 3, 5, 7};

bool check(int a, int b) {
for (int i = 0; i < 4; ++i) {
if (b % t[i]) continue;
if (a % t[i] == 0) return true;
}
return false;
}

ll dfs(int pos, int v, int last, int now, bool lim) {
if (!pos) {
if (!v) return 0;
if (!now) return 1;
last += mod;
return check(last, now);
}
if (!lim && v && dp[pos][last][now]) return dp[pos][last][now];
int to = lim? dit[pos] : 9;
ll tmp = 0;
for (int i = 0; i <= to; ++i) {
ll go = now;
if (i != 0) {
if (i == 2 || i == 4 || i == 8) {
if (go % 2) go *= 2;
}
if (i == 3 || i == 9) {
if (go % 3) go *= 3;
}
if (i == 5) {
if (go % 5) go *= 5;
}
if (i == 6) {
if (go % 2) go *= 2;
if (go % 3) go *= 3;
}
if (i == 7) {
if (go % 7) go *= 7;
}
} else {
if (v) go = 0;
}
tmp += dfs(pos - 1, v || i, (last * 10 + i) % mod, go, lim && i == to);
}
if (!lim && v) dp[pos][last][now] = tmp;
return tmp;
}

ll gao(ll v) {
tot = 0;
while (v) {
dit[++tot] = v % 10;
v /= 10;
}
return dfs(tot, 0, 0, 1, true);
}

void solve() {
scanf("%lld%lld", &a, &b);
ll pre = gao(a - 1);
ll ans = gao(b);
printf("%lld\n", ans - pre);
}

int main() {
int t = 1;
t = read();
while (t--) solve();
return 0;
}

E - Eaom and Longzhu

solved by Sstee1XD, lllllan. (-)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 510;

int n, m;

ll x[8][8];
ll dp[maxn][1 << 8][8];

int vis[maxn][1 << 8][8];

int cnt, head[maxn];
struct edge { int v, w, next; } e[maxn * maxn];
void add (int u, int v, int w) {
e[++cnt] = {v, w, head[u]}; head[u] = cnt;
e[++cnt] = {u, w, head[v]}; head[v] = cnt;
}

struct node {
int id, sta, pre; ll s;
bool operator<(const node &A)const {
return A.s < s; }
};

void Dij () {
for (int i = 1; i <= n; ++i) {
int tot = 1 << 7;
for (int j = 0; j < tot; ++j) {
for (int k = 0; k < 8; ++k) {
dp[i][j][k] = 0x3f3f3f3f3f3f3f3f;
}
}
}

priority_queue<node> Q;
for (int i = 0; i < 7; ++i) {
int sta = 1 << i;
Q.push({1, sta, i + 1, 0});
dp[1][sta][i + 1] = 0;
}
while (Q.size()) {
node u = Q.top(); Q.pop();
if (u.id == n && u.sta + 1 == (1 << 7)) return (void)(printf("%lld\n", u.s));
if (vis[u.id][u.sta][u.pre]) continue;
vis[u.id][u.sta][u.pre] = 1;
for (int i = head[u.id]; i; i = e[i].next) {
int v = e[i].v, w = e[i].w;
for (int k = 0; k < 7; ++k) {
int sta = 1 << k;
int Sta = u.sta | sta;
if (vis[v][Sta][k + 1]) continue;
if (dp[v][Sta][k + 1] <= u.s + (ll)w - x[u.pre][k + 1] * w / 10) continue;
// printf("cost %d longzhu %d %d recover %lld\n", w, u.pre, k + 1, x[u.pre][k + 1] * w / 10);
dp[v][Sta][k + 1] = u.s + (ll)w - x[u.pre][k + 1] * w / 10;
Q.push({v, Sta, k + 1, dp[v][Sta][k + 1]});
// printf(" -> pos %d get longzhu %d cost = %lld\n", v, k + 1, dp[v][Sta][k + 1]);
}
}
}

printf("-1");
}

int main () {
scanf("%d%d", &n, &m);

for (int i = 1; i <= 7; ++i) {
for (int j = 1; j <= 7; ++j) {
scanf("%lld", x[i] + j);
}
}

for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}

Dij();
return 0;
}

G - Guess Strings

solved by Sstee1XD, Tryna. (-)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <bits/stdc++.h>

using namespace std;

#define endl "\n"

inline int read() {
int f = 0; int x = 0; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) f |= (ch == '-');
for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
if (f) x = -x;
return x;
}

typedef long long ll;

const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;

char c[2];
int num;
int g;
string s, ans;

void ask(string s) {
cout << "ASK " << s << endl;
cout.flush();
cin >> g;
}

void pt(string s) {
cout << "ANSWER " << s << endl;
}

void solve() {
c[1] = 'x';
for (char i = 'a'; i <= 'z'; ++i) {
cout << "ASK " << i << endl;
cout.flush();
cin >> g;
if (g) {
c[num++] = i;
}
if (num == 2) break;
}
s += c[0];
ans += c[0];
srand(time(0));
while (1) {
int f = rand() % 2;
s = ans + c[f];
ask(s);
if (g) {
ans = s;
continue;
}
s = ans + c[f ^ 1];
ask(s);
if (g) {
ans = s;
continue;
}
break;
}
while (1) {
int f = rand() % 2;
s = c[f] + ans;
ask(s);
if (g) {
ans = s;
continue;
}
s = c[f ^ 1] + ans;
ask(s);
if (g) {
ans = s;
continue;
}
break;
}
pt(ans);
}

int main() {
int t = 1;
while (t--) solve();
return 0;
}

H - Hsueh- And Treasure

solved by Sstee1XD & Tryna. 04:46(+1)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 1e5 + 7;

int cas;

ll x, y, fx, fy, tx, ty;
ll now, last;
ll sx[N];
ll sy[N];
int tot;

void gao() {
if ((ty - y) & 1) {
if (last & 1) {
sx[++tot] = fx * x;
sy[tot] = ty * fy;
} else {
sx[++tot] = fx * x;
sy[tot] = fy * (ty - 1);
sx[++tot] = fx * x;
sy[tot] = fy * ty;
}
} else {
if (last & 1) {
sx[++tot] = fx * x;
sy[tot] = fy * (ty + 1);
sx[++tot] = fx * x;
sy[tot] = fy * (ty + 1);
sx[++tot] = fx * x;
sy[tot] = fy * ty;
} else {
sx[++tot] = fx * x;
sy[tot] = ty * fy;
}
}
}

void gaoY() {
if (last >= ty) {
gao();
return;
}
y += last;
sx[++tot] = fx * x;
sy[tot] = fy * y;
now++;
while (1) {
y += now;
if (y >= ty) {
last = now;
y -= now;
gao();
return;
}
now++;
sx[++tot] = fx * x;
sy[tot] = fy * y;
}
}

void gaoX() {
while (1) {
x += now;
if (x >= tx) {
last = x - tx;
x = tx;
gaoY();
return;
}
now++;
sx[++tot] = fx * x;
sy[tot] = fy * y;
}
}

void solve() {
x = 0;
y = 0;
now = 1;
last = 0;
tot = 0;
scanf("%lld %lld", &tx, &ty);
fx = 1, fy = 1;
if (tx < 0) fx = -1;
if (ty < 0) fy = -1;
tx = abs(tx);
ty = abs(ty);
printf("Case #%d:\n", ++cas);
if (tx == 0 && ty == 0) {
puts("0");
return;
}
gaoX();
printf("%d\n", tot);
for (int i = 1; i <= tot; ++i) {
printf("%lld %lld\n", sx[i], sy[i]);
}
}

int main() {
int t = 1;
scanf("%d", &t);
while(t--) solve();
return 0;
}

I - Iaom and Chicken feet

solved by lllllan & Tryna. 02:01(+)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int maxn = 5e5 + 10;
const ll mod = 998244353;

int n;
ll ans;
ll deg[maxn];

int cnt, head[maxn];
struct edge { int v, next; } e[maxn << 1];
void add (int u, int v) {
e[++cnt] = {v, head[u]}; head[u] = cnt;
e[++cnt] = {u, head[v]}; head[v] = cnt;
}

ll s[maxn];
void init() {
s[0] = 1;
s[1] = 1;
for(ll i = 2; i <= 500000; i++) {
s[i] = s[i - 1] * i % mod;
}
}

ll qpow(ll n, ll k) {
ll ans = 1;
while(k) {
if(k & 1) {
ans = ans * n % mod;
}
n = n * n % mod;
k >>= 1;
}
return ans;
}

ll C(ll n, ll m) {
if(n < m) return 0;
return s[n] * qpow(s[n - m] * s[m] % mod, mod - 2) % mod;
}

void dfs (int u, int fa) {
deg[u] = 0;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (v == fa) continue;
dfs(v, u);
deg[u]++;
}
}

void DFS (int u, int fa) {
ll res = 0;
ll sum = deg[u] + (fa != 0);
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (v == fa) {
if (fa == 1 && deg[fa] >= 4)
res = (res + C(deg[fa] - 1, 3)) % mod;
if (fa != 1 && deg[fa] >= 3)
res = (res + C(deg[fa], 3)) % mod;
} else {
DFS(v, u);
if (deg[v] >= 3){
res = (res + C(deg[v], (ll)3)) % mod;
}
}
}
ans = (ans + res * C(sum - 1, 2)) % mod;
}

void solve() {
scanf("%d", &n);
for (int i = 1, u, v; i < n; ++i) {
scanf("%d%d", &u, &v);
add(u, v);
}
dfs(1, 0);
DFS(1, 0);
printf("%lld\n", ans);
}

int main() {
init();
int t = 1;
while(t--) solve();
return 0;
}

J - Jew Sorting

solved by Setee1XD. 00:30(+)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 1e5;

int ans = 1;
int a[N], k, n;

struct Seg{
int minn[N << 2], maxx[N << 2];
bool flag[N << 2];

void up(int id, int l, int r) {
if (flag[id << 1 | 1] && flag[id << 1] && maxx[id << 1] <= minn[id << 1 | 1]) {
flag[id] = true;
minn[id] = minn[id << 1];
maxx[id] = maxx[id << 1 | 1];
ans = max(r - l + 1, ans);
}
}

void build(int id, int l, int r) {
flag[id] = false;
minn[id] = 0;
maxx[id] = 0;
if (l == r) {
flag[id] = true;
maxx[id] = a[l];
minn[id] = a[l];
return;
}
int mid = l + r >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
up(id, l, r);
}
}seg;

void solve() {
scanf("%d", &k);
int n = 1 << k;
for (int i = 1; i<= n; ++i) {
scanf("%d", &a[i]);
}
seg.build(1, 1, n);
printf("%d\n", k - __lg(ans));
}

int main() {
int t = 1;
while(t--) solve();
return 0;
}

K - K-Clearing II

solved by Sstee1XD. 02:55(+2)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include<bits/stdc++.h>
using namespace std;

const int N = 2e6 + 10;

typedef long long ll;

int n, q, m, k, idk;
int a[N], b[N], id[N];
ll tot[N], had[N];
int num[N];

int lowbit(int x) {
return x & -x;
}

void add(int i, ll v, ll bit[]) {
while (i <= q) {
bit[i] += v;
i += lowbit(i);
}
}

ll query(int i, ll bit[]) {
ll res = 0;
while (i > 0) {
res += bit[i];
i -= lowbit(i);
}
return res;
}

void ins(int i) {
if (!num[i]) {
add(i, 1ll, had);
}
add(i, 1ll, tot);
num[i]++;
}

void del(int i) {
num[i]--;
add(i, -1ll, tot);
if (!num[i]) {
add(i, -1ll, had);
}

}

ll gao(int u, int v) {
if (!num[idk]) return 0;
ll res = 0;
int l = idk + 1, r = q, mid;
while (l <= r) {
mid = l + r >> 1;
ll tmp = query(mid, had) - query(idk - 1, had);
if (tmp < mid - idk + 1) r = mid - 1;
else l = mid + 1;
}
int len = b[l - 1] - b[idk] + 1;
int pos = lower_bound(b + 1, b + 1 + q, len) - b;
if (pos > q || b[pos] > len) pos--;
if (pos <= 0) return 0;
len = pos;
return query(len, tot);
}


void solve() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b + 1, b + 1 + n);
q = unique(b + 1, b + 1 + n) - b - 1;
int Q = q;
for (int i = 2; i <= q; ++i) {
if (b[i] - b[i - 1] > 1) {
b[++Q] = b[i] - 1;
}
}
q = Q;
sort(b + 1, b + 1 + q);
for (int i = 1; i <= n; ++i) {
id[i] = lower_bound(b + 1, b + 1 + q, a[i]) - b;
if (a[i] == k) idk = id[i];
}
if (!idk) {
puts("0");
return;
}
ll ans = 0;
for (int i = 1; i <= m; ++i) {
ins(id[i]);
}
for (int i = 1; i + m - 1 <= n; ++i) {
if (i != 1) {
del(id[i - 1]);
ins(id[i + m - 1]);
}
ans += gao(i, i + m - 1);
}
printf("%lld\n", ans);
}

int main() {
int t = 1;
while(t--) solve();
return 0;
}

L - Little H And Reboot

solved by Tryna. (-)

AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int maxn = 8e2 + 9;
#define eps 1e-8
int sgn(double x) {
if(fabs(x) < eps) return 0;
else return x < 0 ? -1 : 1;
}
struct Point {
double x, y;
Point() {}
Point(double x, double y):x(x),y(y) {}
Point operator - (Point B) {
return Point(x - B.x, y - B.y);
}
bool operator == (Point B){return sgn(x - B.x) == 0 && sgn(y - B.y) == 0;}
} P[maxn], st, ed;
struct Line {
Point p1, p2;
Line() {}
Line(Point p1, Point p2):p1(p1),p2(p2) {}
} L[maxn];

int n;
struct Edge {
int v;
double w;
Edge(int _v = 0, double _w = 0) {
v = _v;
w = _w;
}
};
vector<Edge>G[maxn];

double Dist(Point A, Point B) {
return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}
double Cross(Point A, Point B) {
return A.x * B.y - A.y * B.x;
}
bool intersect(Point a, Point b, Point c, Point d){
//两线段是否非规范相交
if(a == c || a == d) return 0;
if(b == c || b == d) return 0;
return
max(a.x, b.x) >= min(c.x, d.x)&&
max(c.x, d.x) >= min(a.x, b.x)&&
max(a.y, b.y) >= min(c.y, d.y)&&
max(c.y, d.y) >= min(a.y, b.y)&&
sgn(Cross(b - a, c - a)) * sgn(Cross(b - a, d - a)) <= 0&&
sgn(Cross(d - c, a - c)) * sgn(Cross(d - c, b - c)) <= 0;
}

const double inf = 0x3f3f3f3f;
int vis[maxn], num;
double dis[maxn];
struct node {
int id; double s;
bool operator<(const node &A)const{
return A.s < s;}
};

bool check(Point a, Point b) {
for(int i = 1; i <= num; i++) {
if(i % 4 == 1) {
if(intersect(a, b, P[i], P[i + 2]) || intersect(a, b, P[i + 1], P[i + 3])) return 0;
}
if(i % 4 == 0 && intersect(a, b, P[i], P[i - 3])) return 0;
if(i % 4 != 0 && intersect(a, b, P[i], P[i + 1])) return 0;
}
return 1;
}

void Dij () {
for (int i = 1; i <= num; ++i) dis[i] = 99999999.0;
priority_queue<node> Q;
dis[0] = 0;
Q.push({0, 0.0});
while (Q.size()) {
node u = Q.top(); Q.pop();
if (u.id == num) return (void)(printf("%.20f\n", u.s));
if (vis[u.id]) continue;
vis[u.id] = 1;
for (int i = 0, sz = G[u.id].size(); i < sz; ++i) {
int v = G[u.id][i].v;
double d = G[u.id][i].w;
if (vis[v]) continue;
if (dis[v] - (dis[u.id] + d) > eps) {
dis[v] = dis[u.id] + d;
Q.push({v, dis[v]});
}
}
}
}

void solve() {
scanf("%d", &n);
if(n == 0) {
scanf("%lf %lf %lf %lf", &st.x, &st.y, &ed.x, &ed.y);
printf("%.20f\n", Dist(st, ed));
return ;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= 4; j++) {
num++;
scanf("%lf %lf", &P[num].x, &P[num].y);
}
}
num++;
scanf("%lf %lf %lf %lf", &P[0].x, &P[0].y, &P[num].x, &P[num].y);
for(int i = 0; i < num; i++) {
for(int j = i + 1; j <= num; j++) {
if(check(P[i], P[j])) {
G[i].pb({j, Dist(P[i], P[j])});
G[j].pb({i, Dist(P[i], P[j])});
}
}
}
Dij();
}

int main() {
int t = 1;
// scanf("%d", &t);
while(t--)
solve();
return 0;
}
文章目录
  1. A - Array Permutation
  2. B - Baom and Fibonacci
  3. C - Circle Minimal
  4. D - Double Pleasure
  5. E - Eaom and Longzhu
  6. G - Guess Strings
  7. H - Hsueh- And Treasure
  8. I - Iaom and Chicken feet
  9. J - Jew Sorting
  10. K - K-Clearing II
  11. L - Little H And Reboot
|