记录编号 |
590298 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2022] 喵了个喵 |
最终得分 |
100 |
用户昵称 |
王马 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
7.562 s |
提交时间 |
2024-07-09 21:32:13 |
内存使用 |
11.46 MiB |
显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
- ifstream fin("noip2022_meow.in");
- ofstream fout("noip2022_meow.out");
- #define cin fin
- #define cout fout
- int a[2000005],p[1000],b[1005];
- deque<int>q[1000];
- vector<pair<int,int>>ans;
- int pos=1,sz;
- int cnt[1005];
- queue<int>pq0;
- void change(int x,int y){
- ans.push_back({x,y});
- if(y==0){
- pq0.push(x);
- if(!q[x].empty() and q[x].back()==a[pos]){
- q[x].pop_back();
- cnt[a[pos]]--;
- if(cnt[a[pos]]==0)sz--,p[a[pos]]=0;
- if(q[x].empty())b[a[pos]]=0;
- }
- else{
- q[x].push_back(a[pos]);
- if(cnt[a[pos]]==0){
- sz++,p[a[pos]]=x;
- }
- cnt[a[pos]]++;
- if(q[x].size()==1)b[a[pos]]=1;
- }
- pos++;
- }
- else{
- pq0.push(x);
- pq0.push(y);
- if(q[x].front()==q[y].front()){
- b[q[x].front()]=0;
- cnt[q[x].front()]-=2;
- if(cnt[q[x].front()]==0){
- sz--,p[q[x].front()]=0;
- b[q[x].front()]=0;
- }
- q[x].pop_front();
- q[y].pop_front();
- if(!q[x].empty())b[q[x].front()]=1;
- if(!q[y].empty())b[q[y].front()]=1;
- }
- }
- }
- int main(){
- int t;
- cin>>t;
- while(t--){
- pos=1;
- sz=0;
- memset(p,0,sizeof p);
- memset(b,0,sizeof b);
- ans.resize(0);
- int n,m,k;
- cin>>n>>m>>k;
- int sp=n;
- while(!pq0.empty())pq0.pop();
- for(int i=1;i<=n;i++){
- if(i!=sp)pq0.push(i);
- }
- int ap[k+5]={0};
- for(int i=1;i<=m;i++){
- cin>>a[i];
- a[i+1]=0;
- }
- for(int i=1;i<=m;i++){
- if(sz==2*(n-1) and !cnt[a[i]]){
- int ti=i;
- for(int j=i+1;j<=m;j++){
- if(a[j]==a[i]){
- for(int w=i+1;w<=j;w++){
- ap[a[w]]=p[a[w]];
- }
- change(sp,0);
- for(int w=i+1;w<=j;w++){
- if(a[w]==a[i])change(sp,0);
- else change(ap[a[w]],0);
- }
- i=j;
- break;
- }
- if(b[a[j]]){
- if(ap[q[p[a[j]]].back()]){
- for(int w=i+1;w<=j;w++){
- ap[a[w]]=p[a[w]];
- }
- change(sp,0);
- sp=p[a[j]];
- for(int w=i+1;w<=j;w++){
- change(ap[a[w]],0);
- }
- }
- else{
- for(int w=i+1;w<=j;w++){
- ap[a[w]]=p[a[w]];
- }
- change(p[a[j]],0);
- for(int w=i+1;w<j;w++){
- change(ap[a[w]],0);
- }
- change(sp,0);
- change(sp,p[a[j]]);
- }
- i=j;
- break;
- }
- else{
- ap[a[j]]^=1;
- }
- }
- for(int j=ti;j<=i;j++){
- ap[a[j]]=0;
- }
- continue;
- }
- if(p[a[i]]){
- if(q[p[a[i]]].back()==a[i]){
- change(p[a[i]],0);
- }
- else{
- change(sp,0);
- change(sp,p[a[i]]);
- }
- }
- else{
- while(!pq0.empty() and (pq0.front()==sp or q[pq0.front()].size()>=2)){
- pq0.pop();
- }
- change(pq0.front(),0);
- }
- }
- cout<<ans.size()<<endl;
- for(auto it:ans){
- if(it.second==0)cout<<1<<' '<<it.first<<'\n';
- else cout<<2<<' '<<it.first<<" "<<it.second<<'\n';
- }
- assert(pos==m+1);
- for(int i=1;i<=n;i++){
- assert(q[i].empty());
- }
- }
- }