找关键debug别乱搞
#include<bits/stdc++.h> #define xx first #define yy second //pair 成员简化 using namespace std; typedef long long ll; typedef pair <int ,int>pii;//pair const int maxn =1e3+5; pii can[maxn],peg[maxn]; int num[maxn],ans1[maxn*2];//开数据范围 int n,p,ans; bool add(int x,int pos) { num[x]++; if(num[x]==1) peg[x].xx=pos; if(num[x]==2) peg[x].yy=pos; if(num[x]>2) { return true; } return false; }//加扣子的动作及附加判断成不成立 bool check(int x,int pos) { return (peg[x].xx!=pos&&peg[x].yy!=pos); }//检查是否可在该点插入,标记防原点被占据 int main () { ios::sync_with_stdio(false); cin.tie(0);//加速输入输出 cin>>n; for(int i=1;i<=n;++i) { cin>>can[i].xx>>can[i].yy; } cin>>p; int f=0; for(int i=1,j=1;i<=p&&j<=n;++i) { int x; cin>>x; if(x>can[n].yy) continue;//判断超出最右 while(j<n&&can[j].yy<x) j++;//右移判断 if(x<can[j].xx) continue;//位左 if(add(j,x)) f=1; if(x==can[j].yy&&j<n) { if(can[j+1].xx==x) { if(add(j+1,x)) f=1; } }//特殊状态 } if(f) { cout<<"impossible"<<endl; return 0; } for(int i=1;i<=n;++i) { if(num[i]==2) continue; else { if(i+1<=n&&check(i,can[i].yy)&&can[i+1].xx==can[i].yy&&num[i+1]<=1) { ans1[++ans]=can[i].yy; add(i,ans1[ans]); add(i+1,ans1[ans]); }//先判断特殊状态 if(num[i]==1) { if(check(i,can[i].xx+1)) { ans1[++ans]=can[i].xx+1; } else ans1[++ans]=can[i].xx+2; } if(num[i]==0) { ans1[++ans]=can[i].xx+1; ans1[++ans]=can[i].xx+2; }//填空 } } cout<<ans<<endl; sort(ans1+1,ans1+1+ans);//防止先出的贪心点 for(int i=1;i<=ans;++i) { cout<<ans1[i]<<" "; }//不用太执着于结构(影响不大),把ans单独分出会导致本没有输出,却输出了0 cout<<endl; return 0; }
状态模拟加贪心
最新推荐文章于 2024-10-01 04:42:58 发布