A:cf原题。当然是不是也没什么关系。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #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 1000010 int n,a[N]; int main() { freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); n=read(); for (int i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1); cout<<a[n]-a[1]-n+1; return 0; }
B:非常裸的矩乘。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #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 P 1000000007 #define N 9 int T,n; struct matrix { int n,a[N][N]; matrix operator *(matrix b) const { matrix c;c.n=n;memset(c.a,0,sizeof(c.a)); for (int i=0;i<n;i++) for (int j=0;j<N;j++) for (int k=0;k<N;k++) c.a[i][j]=(c.a[i][j]+1ll*a[i][k]*b.a[k][j]%P)%P; return c; } }f,a,b; int trans(int x,int y){return x*3+y;} int main() { freopen("food.in","r",stdin); freopen("food.out","w",stdout); T=read(); a.n=N;f.n=1; for (int i=0;i<3;i++) for (int j=0;j<3;j++) for (int k=0;k<3;k++) if (!(i==j&&j==k)&&!(j==0&&i+k==3)&&!((j==1||j==2)&&(i==0&&k==0))) a.a[trans(i,j)][trans(j,k)]=1; b=a; while (T--) { n=read()-2; if (n<0) {printf("3 ");continue;} a=b; for (int i=0;i<9;i++) f.a[0][i]=1; for (;n;n>>=1,a=a*a) if (n&1) f=f*a; int ans=0; for (int i=0;i<9;i++) ans=(ans+f.a[0][i])%P; printf("%d ",ans); } return 0; }
C:非常显然的堆。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> 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 #define ll long long int n,a[N],b[N],cnt; ll delta; priority_queue<ll,vector<ll>,greater<ll> >q; int main() { freopen("snow.in","r",stdin); freopen("snow.out","w",stdout); 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++) { q.push(a[i]+delta);cnt++; ll ans=0; while (!q.empty()&&q.top()<=delta+b[i]) ans+=q.top()-delta,q.pop(),cnt--; delta+=b[i]; printf("%I64d ",ans+1ll*cnt*b[i]); } return 0; }
result:300 rank1