Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1.  
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Solution {
  7.  
  8. public static void main(String args[] ) throws Exception {
  9. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  10. String line = br.readLine();
  11. String[] nk = line.split("\\s+");
  12. int n = 0;
  13. int k = 0;
  14. if(nk.length > 1){
  15. n = Integer.parseInt(nk[0].trim());
  16. k = Integer.parseInt(nk[1].trim());
  17. } else {
  18. System.exit(0);
  19. }
  20. String arrStr = br.readLine();
  21. String[] arrInts = arrStr.split("\\s+");
  22. List<Integer> arr = new ArrayList<>();
  23. for(String arrInt: arrInts){
  24. arr.add(Integer.parseInt(arrInt.trim()));
  25. }
  26.  
  27. //arr is the list of integers. n and k are the size of the array and window respectively.
  28.  
  29. StringBuilder sb = new StringBuilder();
  30. for(int i = 0; i < n-k+1; i++){
  31. sb.append(String.valueOf(findDiffInSubrange(arr, i, k)));
  32. sb.append("\n");
  33. }
  34. try(BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out))) {
  35. log.write(sb.toString());
  36. log.flush();
  37. }
  38. catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. //The above is a worst case runtime of O((n-k)*k). Can we do better?
  42. }
  43.  
  44. private static long findDiffInSubrange(List<Integer> a, int start, int k){
  45. int i = start;
  46. int end = start + k - 1;
  47. long cndec = 1;
  48. long cninc = 1;
  49. long ninc = 0;
  50. long ndec = 0;
  51. while(i < end){
  52. while(i < end && a.get(i) == a.get(i+1)){
  53. cndec++;
  54. cninc++;
  55. i++;
  56. }
  57. while(i < end && a.get(i) <= a.get(i+1)){
  58. cndec++;
  59. if(a.get(i) == a.get(i+1)){
  60. cninc++;
  61. }
  62. i++;
  63. }
  64. while(i < end && a.get(i) >= a.get(i+1)){
  65. cninc++;
  66. if(a.get(i) == a.get(i+1)){
  67. cndec++;
  68. }
  69. i++;
  70. }
  71. ndec += calculateSubrange(cndec);
  72. ninc += calculateSubrange(cninc);
  73. cndec = 1;
  74. cninc = 1;
  75. }
  76. return (ndec - ninc);
  77. }
  78.  
  79. private static long calculateSubrange(long k){
  80. return (k * (k-1)) >>> 1;
  81. }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement