时间原因 快速水了A——D

A、

题目描述

现在给你一个递推公式:
n=0 an=1 ; n=1 an=2 ;n>1 an=2*a(n-1)-a(n-2)
求该数列的第 n 项。由于答案可能过大,你只需要输出答案对 998244353 取模后的值。

输入描述:

一个正整数 n (1≤n≤998244351) 。

输出描述:

一个整数,对应答案。

示例1

输入

1

输出

2

示例2

输入

2

输出

3

备注:

如果没有解题思路,可以算一下前几项看看。
#includeusing namespace std;#define int long long #define fp(i,a,b) for(int i=a;i<=b;++i)#define PII pairconst int N=2e5+10;const int mod=1e9+7;const double eps=1e-5;typedef double db;int n;signed main(){cin>>n;cout<<n+1<<"\n";return 0;} 

B、

题目描述

校园里目前有 N名学生,这些学生属于 M 个班级。第 i个人属于第Ai​ 个班级。突然,放学铃声响起,你还没来得及思索,就已经有 K名学生已经冲出了学校。你不知道已经跑出学校的学生属于哪些班级,但是,你想知道,目前还没出校的学生中,最多有多少学生是属于同一个班级的。

输入描述:

第一行三个正整数 N(1≤N≤10^5),M(1≤M≤N),K(1≤K≤N)含义如上所述。

第二行N个正整数 Ai​(1≤Ai≤M),含义如上所述。

输出描述:

一个整数,表示目前学校里最多有多少同学是属于同一个班级的。

示例1

输入

6 3 33 1 2 3 3 2

输出

3
#includeusing namespace std;#define int long long #define fp(i,a,b) for(int i=a;i<=b;++i)#define PII pairconst int N=2e5+10;const int mod=1e9+7;const double eps=1e-5;typedef double db;int n,m,k;int a[N];int cnt[N];signed main(){int mmax=0;cin>>n>>m>>k;fp(i,1,n)cin>>a[i],cnt[a[i]]++,mmax=max(mmax,a[i]);sort(cnt+1,cnt+1+mmax);int sum=0;for(int i=1;i=k){cout<<cnt[mmax];}else{cout<<cnt[mmax]-(k-sum);}return 0;} 

C、

题目描述

本题和 D 题的唯一区别是 N 的范围。
校园里目前有 N 名学生,这些学生属于 M 个班级。第 i(i=1,2,…,N)个人属于第Ai​ 个班级。突然,放学铃声响起,你还没来得及思索,就已经有 K 名学生已经冲出了学校。然而,由于某班级的老师还在拖堂,可以确定这个班级目前还没有任何学生离校。现在请你求出,假设恰好只有班级 j(j=1,2,…,M)的老师还在拖堂,在剩下的未拖堂的班级中,还留在学校的人数最多的班级的最少的可能人数是多少。

输入描述:

第一行三个正整数 N(1≤N≤10^2),M(1≤M≤N),K(1≤K≤N)含义如上所述。第二行 N个正整数 Ai​(1≤Ai≤M),含义如上所述。

输出描述:

M个整数,第 i 个整数表示恰好只有班级 i 的老师还在拖堂,在剩下的未拖堂的班级中,还留在学校的人数最多的班级的最少的可能人数是多少。如果班级 i 拖堂就不可能有 K 名学生冲出学校,则输出 -1。

示例1

输入

6 3 33 1 2 3 3 2

输出

1 1 0

示例2

输入

6 3 43 1 2 3 3 2

输出

1 0 -1
#includeusing namespace std;#define int long long #define fp(i,a,b) for(int i=a;i<=b;++i)#define PII pairconst int N=2e5+10;const int mod=1e9+7;const double eps=1e-5;typedef double db;int n,m,k;int a[N];int cnt[N];int cnts[N];signed main(){cin>>n>>m>>k; fp(i,1,n)cin>>a[i],cnt[a[i]]++;for(int i=1;i<=m;i++){if(n-cnt[i]<k){cout<<-1<<" ";continue;}for(int j=0;j<=n;j++){int sum=0;for(int t=1;t<=m;t++){if(t==i)continue;sum+=max(0ll,cnt[t]-j);}if(sum<=k){cout<<j<<" ";break;} }}return 0;} 

O(n^3)暴力

D、

#includeusing namespace std;#define int long long #define fp(i,a,b) for(int i=a;i<=b;++i)#define PII pairconst int N=2e6+10;const int mod=1e9+7;const double eps=1e-5;typedef double db;int n,m,k;int a[N];int sum1[N],sum2[N];int calc(int x,int i){return (sum2[x]-(a[i]>=x)*a[i])-(sum1[x]-(a[i]>=x))*x;}signed main(){cin>>n>>m>>k; int x;for(int i=1;i>x,a[x]++;for(int i=1;i=0;i--)sum1[i]+=sum1[i+1],sum2[i]+=sum2[i+1];for(int i=1;i<=m;i++){if(n-a[i]<k){cout<<-1<<" ";continue;}int l=0,r=n;while(l>1;if(calc(mid,i)<=k)r=mid;else l=mid+1;}cout<<l<<" ";}return 0;} 

O(nlogn) 后缀优化+二分