因为睡过了只好vp。
A:阅读理解。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N int x,y,z,t1,t2,t3; int main() { cin>>x>>y>>z>>t1>>t2>>t3; if (abs(y-x)*t1>=t3*3+t2*(abs(x-z)+abs(y-x))) cout<<"YES"; else cout<<"NO"; return 0; }
B:一个数可以作为mex当且仅当所有比它小的自然数都已出现。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 100010 int n,a[N],mx; int main() { n=read(); for (int i=1;i<=n;i++) a[i]=read(); mx=-1; for (int i=1;i<=n;i++) { if (a[i]>mx+1) {cout<<i;return 0;} mx=max(mx,a[i]); } cout<<-1; return 0; }
C:li=ri=0的人一定是最大值,给他们记录答案后将其去掉并更新其他人的li和ri即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 1010 int n,a[N],b[N],ans[N],cnt=0; int main() { n=read(); for (int i=1;i<=n;i++) a[i]=read(); for (int i=1;i<=n;i++) b[i]=read(); for (int i=1;i<=n;i++) { bool flag=0; for (int j=1;j<=n;j++) if (a[j]==0&&b[j]==0) flag=1,cnt++,ans[j]=n-i+1,a[j]=b[j]=n+2; if (!flag) {cout<<"NO";return 0;} if (cnt==n) break; int tot=0; for (int j=1;j<=n;j++) if (a[j]==n+2&&b[j]==n+2) tot++; else if (a[j]<tot) {cout<<"NO";return 0;} else a[j]-=tot; tot=0; for (int j=n;j>=1;j--) if (a[j]==n+2&&b[j]==n+2) tot++; else if (b[j]<tot) {cout<<"NO";return 0;} else b[j]-=tot; for (int j=1;j<=n;j++) if (a[j]==n+2&&b[j]==n+2) a[j]=b[j]=n+1; } cout<<"YES "; for (int i=1;i<=n;i++) cout<<ans[i]<<' '; return 0; }
D:注意到对某个位置的数取反会使所有包含他的区间的异或和取反。区间异或和显然可以转化为两个前缀的异或和。这样就可以发现我们对于每一个前缀和都可以任意决定是否取反了。花了1h没救了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 200010 int n,m,a[N]; map<int,int> f; long long ans; int main() { n=read(),m=read();f[0]++; for (int i=1;i<=n;i++) { a[i]=a[i-1]^read(); if (a[i]<(1<<m-1)) f[a[i]]++; else f[((1<<m)-1)^a[i]]++; } for (int i=1;i<=n;i++) if (a[i]>=(1<<m-1)) a[i]^=((1<<m)-1); ans=1ll*n*(n+1)>>1; sort(a,a+n+1);int t=unique(a,a+n+1)-a-1; for (int i=0;i<=t;i++) { int x=f[a[i]],p=x/2,q=(x+1)/2; ans-=1ll*p*(p-1)/2,ans-=1ll*q*(q-1)/2; } cout<<ans; return 0; }
result:rank 426