a53

Transform1

a53
Dec 17th, 2019
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 260001
  4. using namespace std;
  5. long long n,x,y,i,j,k,S,Sol,root,nod,rad2,val1,val2;
  6. long long Rad[N],Val[N],tata[N],Card[N],a[N];
  7.  
  8. int main()
  9. {
  10. freopen("transform.in","r",stdin);
  11. freopen("transform.out","w",stdout);
  12. scanf("%lld%lld%lld",&n,&x,&y);
  13. for(i=1;i<=n;i++)
  14. {
  15. scanf("%lld",&a[i]);
  16. S+=a[i];
  17. }
  18. for(i=n;i>=1;i--)
  19. {
  20. if(!Rad[a[i]])
  21. {
  22. Rad[a[i]]=i;
  23. Val[i]=a[i];
  24. }
  25. tata[i]=Rad[a[i]];
  26. ++Card[a[i]];
  27. }
  28. Sol=0;
  29. for(i=1;i<=n;i++)
  30. {
  31. nod = i;
  32. while(nod != tata[nod])
  33. nod=tata[nod];
  34. val1=Val[nod];
  35. val2=1 + (i * x + val1 * y) % n;
  36. rad2=Rad[val2];
  37. if(val1 == val2)
  38. {
  39. --Card[val1];
  40. if(Card[val1]==0)
  41. {
  42. Val[nod]=0;
  43. Rad[val1]=0;
  44. }
  45. }
  46. else
  47. {
  48. S = S + Card[val1] * (val2-val1);
  49. Card[val2] = Card[val2] + Card[val1] - 1;
  50. Card[val1]=0;
  51.  
  52. if(nod<rad2)
  53. {
  54. tata[nod]=rad2;
  55. Rad[val2]=rad2;
  56. Val[rad2]=val2;
  57. Rad[val1]=0;
  58. Val[nod]=0;
  59. }
  60. else
  61. {
  62. tata[rad2]=nod;
  63. Rad[val2]=nod;
  64. Val[nod]=val2;
  65. Rad[val1]=0;
  66. Val[rad2]=0;
  67. }
  68. }
  69. tata[i]=0;
  70. Sol=max(Sol,S);
  71. }
  72. printf("%lld",Sol);
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment