fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <queue>
  5. #include <iostream>
  6. #include <set>
  7. #include <sstream>
  8. #include <algorithm>
  9. #include <vector>
  10.  
  11. using namespace std ;
  12.  
  13. int n , m , tests , zeros;
  14. vector <int > ans ;
  15. set<int > s ;
  16. int last[1<<20] , ev[1<<20] ;
  17. bool flag;
  18.  
  19. int main(void){
  20. cin >> tests ;
  21. for (;tests;--tests){
  22. cin >> n >>m ;
  23. flag = true ;
  24. zeros = 0 ;
  25. for(int i = 1 ; i <= n ; ++i) last[i] = 0 ;
  26. s.clear() ;
  27. ans.clear();
  28. for(int i = 1 ; i <= m ; ++i){
  29. cin >> ev[i] ;
  30. if(ev[i] == 0) s.insert(i) , zeros += 1;
  31. else {
  32. if(s.empty()) {
  33. puts("NO") ;
  34. flag = false ;
  35. break ;
  36. }
  37. set<int>::iterator iter = s.lower_bound(last[ev[i]]) ;
  38. if(iter == s.end()){
  39. puts("NO") ;
  40. flag = false ;
  41. break ;
  42. }
  43. else if(*iter >= last[ev[i]]){
  44. ans.push_back(ev[i]) ;
  45. last[ev[i]] = i ;
  46. s.erase(iter) ;
  47. }
  48. else{
  49. puts("NO") ;
  50. flag = false ;
  51. break ;
  52. }
  53. }
  54. }
  55. if(!flag) continue ;
  56. else {
  57. puts("YES");
  58. ans.resize(zeros) ;
  59. for(int i = 0 ; i < ans.size() ; ++i){
  60. if(i == ans.size() - 1) cout << ans[i] << endl ;
  61. else cout << ans[i] << " " ;
  62. }
  63. }
  64. }
  65.  
  66. return 0;
  67. }
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
Success #stdin #stdout 0s 11656KB
stdin
4
2 4
0 0 1 1
2 4
0 1 0 2
2 3
0 1 2
2 4
0 0 0 1
stdout
NO
YES
1 2
NO
YES
1 0 0