-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathtransform.cpp
87 lines (72 loc) · 1.58 KB
/
transform.cpp
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
#include <cstdio>
#include <algorithm>
#define N 260001
using namespace std;
long long n,x,y,i,j,k,S,Sol,root,nod,rad2,val1,val2;
long long Rad[N],Val[N],tata[N],Card[N],a[N];
int main()
{
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
scanf("%lld%lld%lld",&n,&x,&y);
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
S+=a[i];
}
for(i=n;i>=1;i--)
{
if(!Rad[a[i]])
{
Rad[a[i]]=i;
Val[i]=a[i];
}
tata[i]=Rad[a[i]];
++Card[a[i]];
}
Sol=0;
for(i=1;i<=n;i++)
{
nod = i;
while(nod != tata[nod])
nod=tata[nod];
val1=Val[nod];
val2=1 + (i * x + val1 * y) % n;
rad2=Rad[val2];
if(val1 == val2)
{
--Card[val1];
if(Card[val1]==0)
{
Val[nod]=0;
Rad[val1]=0;
}
}
else
{
S = S + Card[val1] * (val2-val1);
Card[val2] = Card[val2] + Card[val1] - 1;
Card[val1]=0;
if(nod<rad2)
{
tata[nod]=rad2;
Rad[val2]=rad2;
Val[rad2]=val2;
Rad[val1]=0;
Val[nod]=0;
}
else
{
tata[rad2]=nod;
Rad[val2]=nod;
Val[nod]=val2;
Rad[val1]=0;
Val[rad2]=0;
}
}
tata[i]=0;
Sol=max(Sol,S);
}
printf("%lld",Sol);
return 0;
}