a53

BoB

a53
May 24th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cctype>
  3. #include <algorithm>
  4. using namespace std;
  5. struct ELEM
  6. {
  7. int x,y;
  8. };
  9. int g[300005],val[300005];
  10. long long BITree[300005];
  11. int _in_loc;
  12. char _in_buff[4096];
  13. ELEM vals[300005];
  14. int uniqueArr[300005];
  15.  
  16. bool cmp(ELEM a,ELEM b)
  17. {
  18. return a.x<b.x;
  19. }
  20. char read_ch()
  21. {
  22. ++_in_loc;
  23. if (_in_loc == 4096) {
  24. _in_loc = 0;
  25. fread(_in_buff, 1, 4096,stdin);
  26. }
  27. return _in_buff[_in_loc];
  28. }
  29.  
  30. int read()
  31. {
  32. int u32 = 0; char c;
  33. while (!isdigit(c = read_ch()) );
  34. u32 = c - '0';
  35. while (isdigit(c = read_ch())) {
  36. u32 = u32 * 10 + c - '0';
  37. }
  38. return u32;
  39. }
  40. inline long long getSum(int index)
  41. {
  42. long long sum = 0;
  43. while (index > 0) {
  44. if(sum<BITree[index])
  45. sum=BITree[index];
  46. index -= index & (-index);
  47. }
  48. return sum;
  49. }
  50. inline void updateBIT(int newIndex,int index,long long val)
  51. {
  52. while (index <= newIndex) {
  53. if(val>BITree[index])
  54. BITree[index]=val;
  55. index += index & (-index);
  56. }
  57. }
  58. inline long long resolve(int n)
  59. {
  60. int newindex = 0;
  61. long long max_sum;
  62. for (register int i = 0; i < n; i++) {
  63. vals[i].x=g[i];
  64. vals[i].y=i;
  65. }
  66. sort(vals,vals+n,cmp);
  67. for(register int i=0;i<n;++i)
  68. {
  69. if(vals[i].x==vals[i-1].x)
  70. uniqueArr[vals[i].y]=uniqueArr[vals[i-1].y];
  71. else
  72. uniqueArr[vals[i].y]=++newindex;
  73. }
  74. for (register int i = 0; i < n; i++) {
  75. max_sum = getSum(uniqueArr[i] - 1);
  76. updateBIT(newindex, uniqueArr[i], max_sum + val[i]);
  77. }
  78. return getSum(newindex);
  79. }
  80.  
  81. int main()
  82. {
  83. int n;
  84. scanf("%d",&n);
  85. _in_loc = 4095;
  86. for(register int i=0;i<n;++i)
  87. {
  88. g[i]=read();
  89. val[i]=read();
  90. }
  91. printf("%lld\n",resolve(n));
  92. return 0;
  93. }
Add Comment
Please, Sign In to add comment