记录编号 590298 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2022] 喵了个喵 最终得分 100
用户昵称 Gravatar王马 是否通过 通过
代码语言 C++ 运行时间 7.562 s
提交时间 2024-07-09 21:32:13 内存使用 11.46 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. ifstream fin("noip2022_meow.in");
  4. ofstream fout("noip2022_meow.out");
  5. #define cin fin
  6. #define cout fout
  7. int a[2000005],p[1000],b[1005];
  8. deque<int>q[1000];
  9. vector<pair<int,int>>ans;
  10. int pos=1,sz;
  11. int cnt[1005];
  12. queue<int>pq0;
  13. void change(int x,int y){
  14. ans.push_back({x,y});
  15. if(y==0){
  16. pq0.push(x);
  17. if(!q[x].empty() and q[x].back()==a[pos]){
  18. q[x].pop_back();
  19. cnt[a[pos]]--;
  20. if(cnt[a[pos]]==0)sz--,p[a[pos]]=0;
  21. if(q[x].empty())b[a[pos]]=0;
  22. }
  23. else{
  24. q[x].push_back(a[pos]);
  25. if(cnt[a[pos]]==0){
  26. sz++,p[a[pos]]=x;
  27. }
  28. cnt[a[pos]]++;
  29. if(q[x].size()==1)b[a[pos]]=1;
  30. }
  31. pos++;
  32. }
  33. else{
  34. pq0.push(x);
  35. pq0.push(y);
  36. if(q[x].front()==q[y].front()){
  37. b[q[x].front()]=0;
  38. cnt[q[x].front()]-=2;
  39. if(cnt[q[x].front()]==0){
  40. sz--,p[q[x].front()]=0;
  41. b[q[x].front()]=0;
  42. }
  43. q[x].pop_front();
  44. q[y].pop_front();
  45. if(!q[x].empty())b[q[x].front()]=1;
  46. if(!q[y].empty())b[q[y].front()]=1;
  47. }
  48. }
  49. }
  50. int main(){
  51. int t;
  52. cin>>t;
  53. while(t--){
  54. pos=1;
  55. sz=0;
  56. memset(p,0,sizeof p);
  57. memset(b,0,sizeof b);
  58. ans.resize(0);
  59. int n,m,k;
  60. cin>>n>>m>>k;
  61. int sp=n;
  62. while(!pq0.empty())pq0.pop();
  63. for(int i=1;i<=n;i++){
  64. if(i!=sp)pq0.push(i);
  65. }
  66. int ap[k+5]={0};
  67. for(int i=1;i<=m;i++){
  68. cin>>a[i];
  69. a[i+1]=0;
  70. }
  71. for(int i=1;i<=m;i++){
  72. if(sz==2*(n-1) and !cnt[a[i]]){
  73. int ti=i;
  74. for(int j=i+1;j<=m;j++){
  75. if(a[j]==a[i]){
  76. for(int w=i+1;w<=j;w++){
  77. ap[a[w]]=p[a[w]];
  78. }
  79. change(sp,0);
  80. for(int w=i+1;w<=j;w++){
  81. if(a[w]==a[i])change(sp,0);
  82. else change(ap[a[w]],0);
  83. }
  84. i=j;
  85. break;
  86. }
  87. if(b[a[j]]){
  88. if(ap[q[p[a[j]]].back()]){
  89. for(int w=i+1;w<=j;w++){
  90. ap[a[w]]=p[a[w]];
  91. }
  92. change(sp,0);
  93. sp=p[a[j]];
  94. for(int w=i+1;w<=j;w++){
  95. change(ap[a[w]],0);
  96. }
  97. }
  98. else{
  99. for(int w=i+1;w<=j;w++){
  100. ap[a[w]]=p[a[w]];
  101. }
  102. change(p[a[j]],0);
  103. for(int w=i+1;w<j;w++){
  104. change(ap[a[w]],0);
  105. }
  106. change(sp,0);
  107. change(sp,p[a[j]]);
  108. }
  109. i=j;
  110. break;
  111. }
  112. else{
  113. ap[a[j]]^=1;
  114. }
  115. }
  116. for(int j=ti;j<=i;j++){
  117. ap[a[j]]=0;
  118. }
  119. continue;
  120. }
  121. if(p[a[i]]){
  122. if(q[p[a[i]]].back()==a[i]){
  123. change(p[a[i]],0);
  124. }
  125. else{
  126. change(sp,0);
  127. change(sp,p[a[i]]);
  128. }
  129. }
  130. else{
  131. while(!pq0.empty() and (pq0.front()==sp or q[pq0.front()].size()>=2)){
  132. pq0.pop();
  133. }
  134. change(pq0.front(),0);
  135. }
  136. }
  137. cout<<ans.size()<<endl;
  138. for(auto it:ans){
  139. if(it.second==0)cout<<1<<' '<<it.first<<'\n';
  140. else cout<<2<<' '<<it.first<<" "<<it.second<<'\n';
  141. }
  142. assert(pos==m+1);
  143. for(int i=1;i<=n;i++){
  144. assert(q[i].empty());
  145. }
  146. }
  147. }