Link:
A:
……
#include <bits/stdc++.h> using namespace std; int a,b; int main() { scanf("%d%d",&a,&b); if(a>0) puts("Positive"); else if(a<=0&&b>=0) puts("Zero"); else if((b-a)&1) puts("Positive"); else puts("Negative"); return 0; }
B:
分别用$cnt[i]$和$ok[i]$记录当前的个数以及是否可能计入答案
注意模拟时用$ok[x[i]]$来更新$ok[y[i]]$
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; int n,m,x,y,cnt[MAXN],ok[MAXN],res; int main() { scanf("%d%d",&n,&m); ok[1]=1; for(int i=1;i<=n;i++) cnt[i]=1; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); cnt[x]--;cnt[y]++; if(ok[x]) ok[y]=true; if(ok[x]&&!cnt[x]) ok[x]=false; } for(int i=1;i<=n;i++) res+=ok[i]; printf("%d",res); return 0; }
C:
又是一道构造题……
遇到输出Possible/Impossible的题目先想一想Impossible的条件是什么
对于此题,明显如果没有$dat[i]+dat[i+1]\ge L$则无解
那么有解时从两边一路断到中间即可
#include <bits/stdc++.h> using namespace std; int n,l,pos,a,b; int main() { scanf("%d%d%d",&n,&l,&a); for(int i=2;i<=n;i++) { b=a;scanf("%d",&a); if(a+b>=l) pos=i-1; } if(!pos) return puts("Impossible"),0; puts("Possible"); for(int i=1;i<=pos-1;i++) printf("%d\n",i); for(int i=n-1;i>=pos;i--) printf("%d\n",i); return 0; }