You are given a string
S
S
S consisting of lowercase English letters. The length of
S
S
S is between
3
3
3 and
100
100
100, inclusive.
All characters but one of
S
S
S are the same.
Find
x
x
x such that the
x
x
x-th character of
S
S
S differs from all other characters.
S
S
S is a string of length between
3
3
3 and
100
100
100, inclusive, consisting of two different lowercase English letters.
All characters but one of
S
S
S are the same.
The input is given from Standard Input in the following format:
S S S
Print the answer.
yay
2
The second character of yay differs from the first and third characters.
egg
1
zzzzzwz
6
具体见文末视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
string S;
cin >> S;
S = ' ' + S;
unordered_map<char, int> Cnt;
for (int i = 1; i < S.size(); i ++)
Cnt[S[i]] ++;
for (auto v : Cnt)
if (v.second == 1)
{
for (int i = 1; i < S.size(); i ++)
if (S[i] == v.first)
{
cout << i << endl;
return 0;
}
}
return 0;
}
There are
N
N
N people standing in a line. The person standing at the
i
i
i-th position from the front is person
P
i
P_i
Pi.
Process
Q
Q
Q queries. The
i
i
i-th query is as follows:
You are given integers
A
i
A_i
Ai and
B
i
B_i
Bi. Between person
A
i
A_i
Ai and person
B
i
B_i
Bi, print the person number of the person standing further to the front.
All inputs are integers.
1
≤
N
≤
100
1 \leq N \leq 100
1≤N≤100
1
≤
P
i
≤
N
1 \leq P_i \leq N
1≤Pi≤N
P
i
≠
P
j
(
i
≠
j
)
P_i \neq P_j\ (i \neq j)
Pi=Pj (i=j)
1
≤
Q
≤
100
1 \leq Q \leq 100
1≤Q≤100
KaTeX parse error: Expected 'EOF', got '&' at position 12: 1 \leq A_i &̲lt; B_i \leq N
The input is given from Standard Input in the following format:
N
N
N
P
1
P_1
P1
…
\ldots
…
P
N
P_N
PN
Q
Q
Q
A
1
A_1
A1
B
1
B_1
B1
⋮
\vdots
⋮
A
Q
A_Q
AQ
B
Q
B_Q
BQ
Print Q Q Q lines. The i i i-th line should contain the response for the i i i-th query.
3
2 1 3
3
2 3
1 2
1 3
2
2
1
In the first query, person
2
2
2 is at the first position from the front, and person
3
3
3 is at the third position, so person
2
2
2 is further to the front.
In the second query, person
1
1
1 is at the second position from the front, and person
2
2
2 is at the first position, so person
2
2
2 is further to the front.
In the third query, person
1
1
1 is at the second position from the front, and person
3
3
3 is at the third position, so person
1
1
1 is further to the front.
7
3 7 2 1 6 5 4
13
2 3
1 2
1 3
3 6
3 7
2 4
3 7
1 3
4 7
1 6
2 4
1 3
1 3
3
2
3
3
3
2
3
3
7
1
2
3
3
具体见文末视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 1e2 + 10;
int N, Q;
int P[SIZE];
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N;
int X;
for (int i = 1; i <= N; i ++)
cin >> X, P[X] = i;
cin >> Q;
while (Q --)
{
int l, r;
cin >> l >> r;
if (P[l] > P[r]) cout << r << endl;
else cout << l << endl;
}
return 0;
}
You are given a string
S
S
S of length
N
N
N consisting of lowercase English letters.
You will perform an operation
Q
Q
Q times on the string
S
S
S.
The
i
i
i-th operation
(
1
≤
i
≤
Q
)
(1\leq i\leq Q)
(1≤i≤Q) is represented by a pair of characters
(
c
i
,
d
i
)
(c _ i,d _ i)
(ci,di), which corresponds to the following operation:
Replace all occurrences of the character
c
i
c _ i
ci in
S
S
S with the character
d
i
d _ i
di.
Print the string
S
S
S after all operations are completed.
1
≤
N
≤
2
×
1
0
5
1\leq N\leq2\times10^5
1≤N≤2×105
S
S
S is a string of length
N
N
N consisting of lowercase English letters.
1
≤
Q
≤
2
×
1
0
5
1\leq Q\leq2\times10^5
1≤Q≤2×105
c
i
c _ i
ci and
d
i
d _ i
di are lowercase English letters
(
1
≤
i
≤
Q
)
(1\leq i\leq Q)
(1≤i≤Q).
N
N
N and
Q
Q
Q are integers.
The input is given from Standard Input in the following format:
N
N
N
S
S
S
Q
Q
Q
c
1
c _ 1
c1
d
1
d _ 1
d1
c
2
c _ 2
c2
d
2
d _ 2
d2
⋮
\vdots
⋮
c
Q
c _ Q
cQ
d
Q
d _ Q
dQ
Print the string S S S after all operations are completed.
7
atcoder
4
r a
t e
d v
a r
recover
S
S
S changes as follows: atcoder → atcodea → aecodea → aecovea → recover.
For example, in the fourth operation, all occurrences of a in
S
=
S={}
S=aecovea (the first and seventh characters) are replaced with r, resulting in
S
=
S={}
S=recover.
After all operations are completed,
S
=
S={}
S=recover, so print recover.
3
abc
4
a a
s k
n n
z b
abc
There may be operations where c i = d i c _ i=d _ i ci=di or S S S does not contain c i c _ i ci.
34
supercalifragilisticexpialidocious
20
g c
l g
g m
c m
r o
s e
a a
o f
f s
e t
t l
d v
p k
v h
x i
h n
n j
i r
s i
u a
laklimamriiamrmrllrmlrkramrjimrial
具体见文末视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 2e5 + 10;
int N, Q;
string S;
int P[27], Vis[27];
int Find(int x)
{
if (P[x] != x) P[x] = Find(P[x]);
return P[x];
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N >> S;
S = ' ' + S;
for (int i = 0; i < 26; i ++)
P[i] = i;
cin >> Q;
while (Q --)
{
char a, b;
cin >> a >> b;
for (int i = 0; i < 26; i ++)
if (P[i] == a - 'a')
P[i] = b - 'a';
}
for (int i = 1; i <= N; i ++)
cout << char(P[S[i] - 'a'] + 'a');
return 0;
}
You are given a sequence of non-negative integers
A
=
(
A
1
,
…
,
A
N
)
A=(A_1,\ldots,A_N)
A=(A1,…,AN) of length
N
N
N. Find the number of pairs of integers
(
i
,
j
)
(i,j)
(i,j) that satisfy both of the following conditions:
KaTeX parse error: Expected 'EOF', got '&' at position 9: 1\leq i &̲lt; j\leq N
A
i
A
j
A_i A_j
AiAj is a square number.
Here, a non-negative integer
a
a
a is called a square number when it can be expressed as
a
=
d
2
a=d^2
a=d2 using some non-negative integer
d
d
d.
All inputs are integers.
2
≤
N
≤
2
×
1
0
5
2\leq N\leq 2\times 10^5
2≤N≤2×105
0
≤
A
i
≤
2
×
1
0
5
0\leq A_i\leq 2\times 10^5
0≤Ai≤2×105
The input is given from Standard Input in the following format:
N
N
N
A
1
A_1
A1
…
\ldots
…
A
N
A_N
AN
Print the answer.
5
0 3 2 8 12
6
Six pairs of integers,
(
i
,
j
)
=
(
1
,
2
)
,
(
1
,
3
)
,
(
1
,
4
)
,
(
1
,
5
)
,
(
2
,
5
)
,
(
3
,
4
)
(i,j)=(1,2),(1,3),(1,4),(1,5),(2,5),(3,4)
(i,j)=(1,2),(1,3),(1,4),(1,5),(2,5),(3,4), satisfy the conditions.
For example,
A
2
A
5
=
36
A_2A_5=36
A2A5=36, and
36
36
36 is a square number, so the pair
(
i
,
j
)
=
(
2
,
5
)
(i,j)=(2,5)
(i,j)=(2,5) satisfies the conditions.
8
2 2 4 6 3 100 100 25
7
两种方法可以求解,具体见文末视频。
方法1:
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 2e5 + 10;
int N;
int A[SIZE], Vis[SIZE], Cnt[SIZE];
int fact[SIZE], id, id2;
PII f2[SIZE];
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N;
int mx = 0;
for (int i = 1; i <= N; i ++)
cin >> A[i], Cnt[A[i]] ++, mx = max(mx, A[i]);
int Result = 0;
for (int i = 1; i <= mx; i ++)
{
id = 0, id2 = 0;
for (int j = 1; j <= i / j; j ++)
if (i % j == 0)
{
fact[ ++ id] = j;
if (i / j != j) fact[ ++ id] = i / j;
}
for (int j = 1; j <= id; j ++)
for (int k = 1; k <= id; k ++)
f2[ ++ id2] = {fact[j] * fact[k], i * i / fact[j] / fact[k]};
int T1 = 0, T2 = 0;
for (int j = 1; j <= id2; j ++)
{
auto v = f2[j];
if (v.first > mx || v.second > mx) continue;
if (v.first == v.second && !Vis[v.first])
T1 += Cnt[v.first] * max(0ll, Cnt[v.first] - 1) / 2, Vis[v.first] = Vis[v.second] = 1;
else if (!Vis[v.first])
T2 += Cnt[v.first] * Cnt[v.second], Vis[v.first] = Vis[v.second] = 1;
}
for (int j = 1; j <= id2; j ++)
{
auto v = f2[j];
if (v.first > mx || v.second > mx) continue;
Vis[v.first] = Vis[v.second] = 0;
}
Result += T1 + T2;
}
int Zero = 0;
for (int i = 1; i <= N; i ++)
{
if (A[i]) continue;
Result += N - Zero - 1;
Zero ++;
}
cout << Result << endl;
return 0;
}
方法2:
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 2e5 + 10;
int N;
int A[SIZE], Cnt[SIZE];
int primes[SIZE], cnt;
bool st[SIZE];
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N;
get_primes(SIZE - 10);
int Result = 0;
for (int i = 1; i <= N; i ++)
{
cin >> A[i];
if (!A[i]) continue;
for (int j = 0; j < cnt; j ++)
{
if (primes[j] * primes[j] > A[i]) break;
while (A[i] && A[i] % (primes[j] * primes[j]) == 0)
A[i] /= (primes[j] * primes[j]);
}
Result += Cnt[A[i]];
Cnt[A[i]] ++;
}
int Zero = 0;
for (int i = 1; i <= N; i ++)
{
if (A[i]) continue;
Result += N - Zero - 1;
Zero ++;
}
cout << Result << endl;
return 0;
}
In the country of AtCoder, there are
N
N
N stations: station
1
1
1, station
2
2
2,
…
\ldots
…, station
N
N
N.
You are given
M
M
M pieces of information about trains in the country. The
i
i
i-th piece of information
(
1
≤
i
≤
M
)
(1\leq i\leq M)
(1≤i≤M) is represented by a tuple of six positive integers
(
l
i
,
d
i
,
k
i
,
c
i
,
A
i
,
B
i
)
(l _ i,d _ i,k _ i,c _ i,A _ i,B _ i)
(li,di,ki,ci,Ai,Bi), which corresponds to the following information:
For each
t
=
l
i
,
l
i
+
d
i
,
l
i
+
2
d
i
,
…
,
l
i
+
(
k
i
−
1
)
d
i
t=l _ i,l _ i+d _ i,l _ i+2d _ i,\ldots,l _ i+(k _ i-1)d _ i
t=li,li+di,li+2di,…,li+(ki−1)di, there is a train as follows:
The train departs from station
A
i
A _ i
Ai at time
t
t
t and arrives at station
B
i
B _ i
Bi at time
t
+
c
i
t+c _ i
t+ci.
No trains exist other than those described by this information, and it is impossible to move from one station to another by any means other than by train.
Also, assume that the time required for transfers is negligible.
Let
f
(
S
)
f(S)
f(S) be the latest time at which one can arrive at station
N
N
N from station
S
S
S.
More precisely,
f
(
S
)
f(S)
f(S) is defined as the maximum value of
t
t
t for which there is a sequence of tuples of four integers
(
(
t
i
,
c
i
,
A
i
,
B
i
)
)
i
=
1
,
2
,
…
,
k
\big((t _ i,c _ i,A _ i,B _ i)\big) _ {i=1,2,\ldots,k}
((ti,ci,Ai,Bi))i=1,2,…,k that satisfies all of the following conditions:
t
≤
t
1
t\leq t _ 1
t≤t1
A
1
=
S
,
B
k
=
N
A _ 1=S,B _ k=N
A1=S,Bk=N
B
i
=
A
i
+
1
B _ i=A _ {i+1}
Bi=Ai+1 for all
1
≤
i
<
k
1\leq i\lt k
1≤i<k,
For all
1
≤
i
≤
k
1\leq i\leq k
1≤i≤k, there is a train that departs from station
A
i
A _ i
Ai at time
t
i
t _ i
ti and arrives at station
B
i
B _ i
Bi at time
t
i
+
c
i
t _ i+c _ i
ti+ci.
t
i
+
c
i
≤
t
i
+
1
t _ i+c _ i\leq t _ {i+1}
ti+ci≤ti+1 for all
1
≤
i
<
k
1\leq i\lt k
1≤i<k.
If no such
t
t
t exists, set
f
(
S
)
=
−
∞
f(S)=-\infty
f(S)=−∞.
Find
f
(
1
)
,
f
(
2
)
,
…
,
f
(
N
−
1
)
f(1),f(2),\ldots,f(N-1)
f(1),f(2),…,f(N−1).
2
≤
N
≤
2
×
1
0
5
2\leq N\leq2\times10 ^ 5
2≤N≤2×105
1
≤
M
≤
2
×
1
0
5
1\leq M\leq2\times10 ^ 5
1≤M≤2×105
1
≤
l
i
,
d
i
,
k
i
,
c
i
≤
1
0
9
(
1
≤
i
≤
M
)
1\leq l _ i,d _ i,k _ i,c _ i\leq10 ^ 9\ (1\leq i\leq M)
1≤li,di,ki,ci≤109 (1≤i≤M)
1
≤
A
i
,
B
i
≤
N
(
1
≤
i
≤
M
)
1\leq A _ i,B _ i\leq N\ (1\leq i\leq M)
1≤Ai,Bi≤N (1≤i≤M)
A
i
≠
B
i
(
1
≤
i
≤
M
)
A _ i\neq B _ i\ (1\leq i\leq M)
Ai=Bi (1≤i≤M)
All input values are integers.
The input is given from Standard Input in the following format:
N
N
N
M
M
M
l
1
l _ 1
l1
d
1
d _ 1
d1
k
1
k _ 1
k1
c
1
c _ 1
c1
A
1
A _ 1
A1
B
1
B _ 1
B1
l
2
l _ 2
l2
d
2
d _ 2
d2
k
2
k _ 2
k2
c
2
c _ 2
c2
A
2
A _ 2
A2
B
2
B _ 2
B2
⋮
\vdots
⋮
l
M
l _ M
lM
d
M
d _ M
dM
k
M
k _ M
kM
c
M
c _ M
cM
A
M
A _ M
AM
B
M
B _ M
BM
Print
N
−
1
N-1
N−1 lines.
The
k
k
k-th line should contain
f
(
k
)
f(k)
f(k) if
f
(
k
)
≠
−
∞
f(k)\neq-\infty
f(k)=−∞, and Unreachable if
f
(
k
)
=
−
∞
f(k)=-\infty
f(k)=−∞.
6 7
10 5 10 3 1 3
13 5 10 2 3 4
15 5 10 7 4 6
3 10 2 4 2 5
7 10 2 3 5 6
5 3 18 2 2 3
6 3 20 4 2 1
55
56
58
60
17
The following diagram shows the trains running in the country (information about arrival and departure times is omitted).

Consider the latest time at which one can arrive at station
6
6
6 from station
2
2
2.
As shown in the following diagram, one can arrive at station
6
6
6 by departing from station
2
2
2 at time
56
56
56 and moving as station
2
→
2\rightarrow
2→ station
3
→
3\rightarrow
3→ station
4
→
4\rightarrow
4→ station
6
6
6.

It is impossible to depart from station
2
2
2 after time
56
56
56 and arrive at station
6
6
6, so
f
(
2
)
=
56
f(2)=56
f(2)=56.
5 5
1000000000 1000000000 1000000000 1000000000 1 5
5 9 2 6 2 3
10 4 1 6 2 3
1 1 1 1 3 5
3 1 4 1 5 1
1000000000000000000
Unreachable
1
Unreachable
There is a train that departs from station
1
1
1 at time
1
0
18
10 ^ {18}
1018 and arrives at station
5
5
5 at time
1
0
18
+
1
0
9
10 ^ {18}+10 ^ 9
1018+109. There are no trains departing from station
1
1
1 after that time, so
f
(
1
)
=
1
0
18
f(1)=10 ^ {18}
f(1)=1018.
As seen here, the answer may not fit within a
32
bit
32\operatorname{bit}
32bit integer.
Also, both the second and third pieces of information guarantee that there is a train that departs from station
2
2
2 at time
14
14
14 and arrives at station
3
3
3 at time
20
20
20.
As seen here, some trains may appear in multiple pieces of information.
16 20
4018 9698 2850 3026 8 11
2310 7571 7732 1862 13 14
2440 2121 20 1849 11 16
2560 5115 190 3655 5 16
1936 6664 39 8822 4 16
7597 8325 20 7576 12 5
5396 1088 540 7765 15 1
3226 88 6988 2504 13 5
1838 7490 63 4098 8 3
1456 5042 4 2815 14 7
3762 6803 5054 6994 10 9
9526 6001 61 8025 7 8
5176 6747 107 3403 1 5
2014 5533 2031 8127 8 11
8102 5878 58 9548 9 10
3788 174 3088 5950 3 13
7778 5389 100 9003 10 15
556 9425 9458 109 3 11
5725 7937 10 3282 2 9
6951 7211 8590 1994 15 12
720358
77158
540926
255168
969295
Unreachable
369586
466218
343148
541289
42739
165772
618082
16582
591828
具体见文末视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 2e5 + 10, INF = 3e18 + 1;
int N, M;
struct Information
{
int l, d, r, c, u;
bool operator< (const Information &T)const { return r < T.r; }
}w[SIZE];
int h[SIZE], e[SIZE], ne[SIZE], idx;
int Dist[SIZE], Vis[SIZE];
void add(int a, int b, Information c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}
void Dijkstra(int S)
{
memset(Dist, -0x3f, sizeof Dist);
priority_queue<Information, vector<Information>> Heap;
Heap.push({INF, 0, INF, 0, S}), Dist[S] = INF;
while (Heap.size())
{
auto T = Heap.top();
Heap.pop();
int u = T.u;
if (Vis[u]) continue;
Vis[u] = 1;
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i], Time;
auto v = w[i];
v.l += v.c, v.r += v.c;
if (T.r >= v.r) Time = v.r;
else Time = v.l + (T.r - v.l) / v.d * v.d;
Dist[j] = max(Time - v.c, Dist[j]), v.r = Time - v.c, v.u = j;
Heap.push(v);
}
}
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
memset(h, -1, sizeof h);
cin >> N >> M;
int l, d, k, c, a, b;
for (int i = 1; i <= M; i ++)
cin >> l >> d >> k >> c >> a >> b, add(b, a, {l, d, l + (k - 1) * d, c});
Dijkstra(N);
for (int i = 1; i < N; i ++)
if (Dist[i] < 0) cout << "Unreachable" << endl;
else cout << Dist[i] << endl;
return 0;
}
You will play a game against a dealer.
The game uses a
D
D
D-sided die (dice) that shows an integer from
1
1
1 to
D
D
D with equal probability, and two variables
x
x
x and
y
y
y initialized to
0
0
0. The game proceeds as follows:
You may perform the following operation any number of times: roll the die and add the result to
x
x
x. You can choose whether to continue rolling or not after each roll.
Then, the dealer will repeat the following operation as long as KaTeX parse error: Expected 'EOF', got '&' at position 3: y &̲lt; L: roll the die and add the result to
y
y
y.
If KaTeX parse error: Expected 'EOF', got '&' at position 3: x &̲gt; N, you lose. Otherwise, you win if KaTeX parse error: Expected 'EOF', got '&' at position 3: y &̲gt; N or KaTeX parse error: Expected 'EOF', got '&' at position 3: x &̲gt; y and lose if neither is satisfied.
Determine the probability of your winning when you act in a way that maximizes the probability of winning.
All inputs are integers.
1
≤
L
≤
N
≤
2
×
1
0
5
1 \leq L \leq N \leq 2 \times 10^5
1≤L≤N≤2×105
1
≤
D
≤
N
1 \leq D \leq N
1≤D≤N
The input is given from Standard Input in the following format:
N N N L L L D D D
Print the answer. Your output will be considered correct if its absolute or relative error from the true value is at most 1 0 − 6 10^{-6} 10−6.
3 2 2
0.468750000000000
It can be proved that the optimal strategy is to continue rolling as long as x x x is not greater than 2 2 2.
200000 200000 200000
0.999986408692793
方法1:利用线段树
方法2:前缀和方法
具体见文末视频。
方法1:
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 1e6 + 10;
int N, L, D;
double f[SIZE], g[SIZE], dp[SIZE];
struct Segment
{
int l, r;
double Sum;
}Tree[SIZE << 2];
void Pushup(int u)
{
Tree[u].Sum = Tree[u << 1].Sum + Tree[u << 1 | 1].Sum;
}
void Build(int u, int l, int r)
{
Tree[u] = {l, r};
if (l == r) return;
int mid = l + r >> 1;
Build(u << 1, l, mid), Build(u << 1 | 1, mid + 1, r);
}
void Modify(int u, int x, double d)
{
if (Tree[u].l == Tree[u].r)
{
Tree[u].Sum = d;
return;
}
int mid = Tree[u].l + Tree[u].r >> 1;
if (mid >= x) Modify(u << 1, x, d);
else Modify(u << 1 | 1, x, d);
Pushup(u);
}
double Query(int u, int l, int r)
{
if (Tree[u].l >= l && Tree[u].r <= r)
return Tree[u].Sum;
int mid = Tree[u].l + Tree[u].r >> 1;
double Result = 0;
if (mid >= l) Result += Query(u << 1, l, r);
if (mid < r) Result += Query(u << 1 | 1, l, r);
return Result;
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N >> L >> D;
Build(1, 0, max(L + D - 1, N));
f[0] = 1.0;
Modify(1, 0, 1.0);
for (int i = 1; i <= L + D - 1; i ++)
{
if (i >= L) f[i] = Query(1, i - min(D, i), L - 1) / D;
else f[i] = Query(1, i - min(i, D), i - 1) / D;
Modify(1, i, f[i]);
}
for (int i = 0; i < L; i ++)
f[i] = 0;
for (int i = N + 1; i <= L + D - 1; i ++)
f[0] += f[i];
for (int i = 1; i <= N; i ++)
f[i] += f[i - 1];
for (int i = N; i >= 0; i --)
{
int l = i + 1, r = min(i + D, N);
if (l <= r) dp[i] = Query(1, l, r) / D;
dp[i] = max(dp[i], f[i - 1]);
Modify(1, i, dp[i]);
}
printf("%.8lf\n", dp[0]);
return 0;
}
方法2:
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 4e5 + 10;
int N, L, D;
double f[SIZE], g[SIZE], dp[SIZE];
double S[SIZE];
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N >> L >> D;
f[0] = 1.0, S[0] = 1.0;
for (int i = 1; i <= L + D - 1; i ++)
{
if (i >= L) f[i] = (S[L - 1] - (min(i, D) == i ? 0 : S[i - min(i, D) - 1])) / D;
else f[i] = (S[i - 1] - (min(i, D) == i ? 0 : S[i - min(i, D) - 1])) / D;
S[i] = S[i - 1] + f[i];
}
for (int i = 0; i < L; i ++)
f[i] = 0;
for (int i = N + 1; i <= L + D - 1; i ++)
f[0] += f[i];
for (int i = 1; i <= N; i ++)
f[i] += f[i - 1];
for (int i = N; i >= 0; i --)
{
int l = i + 1, r = min(i + D, N);
if (l <= r) dp[i] = (S[l] - S[r + 1]) / D;
dp[i] = max(dp[i], f[i - 1]);
S[i] = S[i + 1] + dp[i];
}
printf("%.8lf\n", dp[0]);
return 0;
}
You are given an integer sequence
A
=
(
A
1
,
A
2
,
…
,
A
N
)
A=(A_1,A_2,\ldots,A_N)
A=(A1,A2,…,AN) of length
N
N
N.
Process
Q
Q
Q operations in order. There are three types of operations:
A type-1 operation is represented by a triple of integers
(
l
,
r
,
x
)
(l,r,x)
(l,r,x), which corresponds to replacing
A
i
A_i
Ai with
max
{
A
i
,
x
}
\max\lbrace A_i,x\rbrace
max{Ai,x} for each
i
=
l
,
l
+
1
,
…
,
r
i=l,l+1,\ldots,r
i=l,l+1,…,r.
A type-2 operation is represented by an integer
i
i
i, which corresponds to canceling the
i
i
i-th operation (it is guaranteed that the
i
i
i-th operation is of type 1 and has not already been canceled). The new sequence
A
A
A can be obtained by performing all type-1 operations that have not been canceled, starting from the initial state.
A type-3 operation is represented by an integer
i
i
i, which corresponds to printing the current value of
A
i
A_i
Ai.
1
≤
N
≤
2
×
1
0
5
1\leq N\leq2\times10^5
1≤N≤2×105
1
≤
A
i
≤
1
0
9
(
1
≤
i
≤
N
)
1\leq A_i\leq10^9\ (1\leq i\leq N)
1≤Ai≤109 (1≤i≤N)
1
≤
Q
≤
2
×
1
0
5
1\leq Q\leq2\times10^5
1≤Q≤2×105
In a type-1 operation,
1
≤
l
≤
r
≤
N
1\leq l\leq r\leq N
1≤l≤r≤N and
1
≤
x
≤
1
0
9
1\leq x\leq10^9
1≤x≤109.
In a type-2 operation,
i
i
i is not greater than the number of operations given before, and
1
≤
i
1\leq i
1≤i.
In a type-2 operation, the
i
i
i-th operation is of type 1.
In type-2 operations, the same
i
i
i does not appear multiple times.
In a type-3 operation,
1
≤
i
≤
N
1\leq i\leq N
1≤i≤N.
All input values are integers.
The input is given from Standard Input in the following format:
N
N
N
A
1
A_1
A1
A
2
A_2
A2
…
\ldots
…
A
N
A_N
AN
Q
Q
Q
query
1
\operatorname{query}_1
query1
query
2
\operatorname{query}_2
query2
⋮
\vdots
⋮
query
Q
\operatorname{query}_Q
queryQ
Here,
query
k
(
1
≤
k
≤
Q
)
\operatorname{query}_k\ (1\leq k\leq Q)
queryk (1≤k≤Q) represents the
k
k
k-th operation, and depending on the type of the
k
k
k-th operation, one of the following is given.
For a type-1 operation, the following is given, meaning that the
k
k
k-th operation is a type-1 operation represented by
(
l
,
r
,
x
)
(l,r,x)
(l,r,x):
1 1 1 l l l r r r x x x
For a type-2 operation, the following is given, meaning that the k k k-th operation is a type-2 operation represented by i i i:
2 2 2 i i i
For a type-3 operation, the following is given, meaning that the k k k-th operation is a type-3 operation represented by i i i:
3 3 3 i i i
Let
q
q
q be the number of type-3 operations. Print
q
q
q lines.
The
i
i
i-th line
(
1
≤
i
≤
q
)
(1\leq i\leq q)
(1≤i≤q) should contain the value that should be printed for the
i
i
i-th given type-3 operation.
6
2 7 1 8 2 8
15
3 1
3 3
3 4
1 1 5 4
3 1
3 3
3 4
1 3 6 9
3 1
3 3
3 4
2 4
3 1
3 3
3 4
2
1
8
4
4
8
4
9
9
2
9
9
Initially, the sequence
A
A
A is
(
2
,
7
,
1
,
8
,
2
,
8
)
(2,7,1,8,2,8)
(2,7,1,8,2,8).
For the
1
1
1-st,
2
2
2-nd,
3
3
3-rd operations, print the values of
A
1
,
A
3
,
A
4
A_1, A_3, A_4
A1,A3,A4, which are
2
,
1
,
8
2,1,8
2,1,8, respectively.
The
4
4
4-th operation replaces the values of
A
1
,
A
2
,
A
3
,
A
4
,
A
5
A_1, A_2, A_3, A_4, A_5
A1,A2,A3,A4,A5 with
max
{
A
i
,
4
}
\max\lbrace A_i,4\rbrace
max{Ai,4}.
Just after this operation,
A
A
A is
(
4
,
7
,
4
,
8
,
4
,
8
)
(4,7,4,8,4,8)
(4,7,4,8,4,8).
For the
5
5
5-th,
6
6
6-th,
7
7
7-th operations, print the values of
A
1
,
A
3
,
A
4
A_1, A_3, A_4
A1,A3,A4 at this point, which are
4
,
4
,
8
4,4,8
4,4,8, respectively.
The
8
8
8-th operation replaces the values of
A
3
,
A
4
,
A
5
,
A
6
A_3, A_4, A_5, A_6
A3,A4,A5,A6 with
max
{
A
i
,
9
}
\max\lbrace A_i,9\rbrace
max{Ai,9}.
Just after this operation,
A
A
A is
(
4
,
7
,
9
,
9
,
9
,
9
)
(4,7,9,9,9,9)
(4,7,9,9,9,9).
For the
9
9
9-th,
10
10
10-th,
11
11
11-th operations, print the values of
A
1
,
A
3
,
A
4
A_1, A_3, A_4
A1,A3,A4 at this point, which are
4
,
9
,
9
4,9,9
4,9,9, respectively.
The
12
12
12-th operation cancels the
4
4
4-th operation.
Just after this operation,
A
A
A is
(
2
,
7
,
9
,
9
,
9
,
9
)
(2,7,9,9,9,9)
(2,7,9,9,9,9).
For the
13
13
13-th,
14
14
14-th,
15
15
15-th operations, print the values of
A
1
,
A
3
,
A
4
A_1, A_3, A_4
A1,A3,A4 at this point, which are
2
,
9
,
9
2,9,9
2,9,9, respectively.
24
721 78 541 256 970 478 370 467 344 542 43 166 619 17 592 222 983 729 338 747 62 452 815 838
35
3 10
3 8
3 8
3 13
3 9
1 1 17 251
3 3
3 19
3 13
3 22
3 1
3 15
3 18
3 10
3 15
1 16 19 883
1 8 23 212
3 5
3 13
2 6
3 15
1 5 18 914
2 17
3 20
1 23 23 56
3 13
2 25
3 13
3 13
3 10
2 16
1 17 22 308
3 19
3 17
3 7
542
467
467
619
344
541
338
619
452
721
592
729
542
592
970
619
592
747
914
914
914
914
338
983
914
具体见文末视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 2e5 + 10;
int N, Q;
int A[SIZE];
struct Segment
{
int l, r;
map<int, int> Cnt;
}Tree[SIZE << 2];
void Build(int u, int l, int r)
{
Tree[u] = {l, r};
if (l == r)
{
Tree[u].Cnt[A[l]] ++;
return;
}
int mid = l + r >> 1;
Build(u << 1, l, mid), Build(u << 1 | 1, mid + 1, r);
}
void Modify(int u, int l, int r, int d, int k)
{
if (Tree[u].l >= l && Tree[u].r <= r)
{
if (k == 1) Tree[u].Cnt[d] ++;
else
{
Tree[u].Cnt[d] --;
if (!Tree[u].Cnt[d]) Tree[u].Cnt.erase(d);
}
return ;
}
int mid = Tree[u].l + Tree[u].r >> 1;
if (mid >= l) Modify(u << 1, l, r, d, k);
if (mid < r) Modify(u << 1 | 1, l, r, d, k);
}
int Query(int u, int x)
{
if (Tree[u].l == Tree[u].r && Tree[u].l == x)
return Tree[u].Cnt.rbegin() -> first;
int mid = Tree[u].l + Tree[u].r >> 1, v = -1e18;
if (Tree[u].Cnt.size()) v = Tree[u].Cnt.rbegin() -> first;
if (mid >= x) return max(v, Query(u << 1, x));
else return max(v, Query(u << 1 | 1, x));
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N;
for (int i = 1; i <= N; i ++)
cin >> A[i];
Build(1, 1, N);
cin >> Q;
std::vector<array<int, 3>> qry;
qry.resize(Q + 1);
int idx = 0;
while (Q --)
{
int op, l, r, x;
cin >> op >> l;
idx ++;
if (op == 1)
cin >> r >> x, Modify(1, l, r, x, 1), qry[idx] = {l, r, x};
else if (op == 2)
Modify(1, qry[l][0], qry[l][1], qry[l][2], 2);
else
cout << Query(1, l) << endl;
}
return 0;
}
AtCoder Beginner Contest 342(ABCDEFG)
欢迎大家关注我的B站空间:https://space.bilibili.com/630340560
最后祝大家早日