好好复习初赛,我压线过的
瞎搞的封面
1.分糖果
一般来说T1都不会太难,其实他还是不是很难
我太蒻了,考场半小时才想出来
咳咳,一看数据范围有有 10^9,一看就不是用暴力做的。
假如有n个小朋友(包括你),你搬了k块糖果,那么你最终得到的奖励就是 k mod n 块糖果。也就是说,假如你最少搬l块糖果,最多搬k块糖果,你如果要得到最多的奖励,就要在l到r之间选一个数,使得这个数模n的值最大。
那么最优的情况下会剩 n - 1 块糖果,当然,样例 2告诉我们,有时候我们没法这么贪心,可能最优的结果达不到 n - 1,那么就说明,在l到r之间,数越大,模n的值就越大。所以对于这种情况,就直接拿r块糖果,结果一定是最优的。而其他情况最优值就是n - 1。
那么,你们要的代码来了:
#include<bits/stdc++.h>
using namespace std;
int n,l,r;
int main(){
cin>>n>>l>>r;
cout<<min(r,l+(n-1-l%n))%n; //先尝试将余数补到n-1,如果超过r,那么结果就是r mod n,否则就是n-1
return 0;
}
2.插入排序
T2不是很难,避下坑就好了
由于给的条件是修改次数不超过 5000,我们应该在修改处做文章。
注意到一个数组 a进行“示范代码”之后,数ai 在 aj 之前的充要条件是以下两者中成立一个:
-
<a
-
=a且i<j
考虑维护一个数组b储存各个数在数组a中的相对排名,那么开始输入a时进行统计(用以上两条判断)之后:
每进行一次操作 2 ,输出。
每进行一次操作 1 ,即将修改成v。此时用O(n) 遍历数组中的各个元素,如果某一个元素i满足在数组插入排序后原本在x之前,现在在x之后(仍然用两条判定),因为i与数组中其他数的相对位置没有变化,使增加一,减少一即可。另外一种情况同理。
#include<bits/stdc++.h>
using namespace std;
int n,q,a[8005],b[8005],num,x,v,ans;
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(i==j||a[j]<a[i]||a[j]==a[i])b[i]++;
else b[j]++;
}//这里的b[