NOIP模拟赛五
其他人都好高,我菜死了……
T1
写对了,但没写对。思路和代码都对了,但细节错了,没有判断 的情况导致挂了40pts,傻逼出题人还说往样例里面加了hack了,淦。
不过好像是因为我的写法不同所以也只挂了40pts,只能说玄学了。
code
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=114514,M=1919810;
ll n,b,a,ans1,ans2,tot;
//723787
//804201 9 429
int main(){
cin>>n>>a>>b;
ll x=n;
if(a==1){
if(b==1) cout<<ceil((double)n*1.0/2.0);
else if(b>=n) cout<<n;
else{
ll x=n/(2*b);
ll y=n%(2*b);
cout<<b*x+(y>b?b:y);
}
return 0;
}
while(x>0){
++tot;
ll val=x-(x-b)/a;
if(x-b<0) val=x; //就是这个判断,同失40pts
if(tot&1) ans1+=val;
else ans2+=val;
x=(x-b)/a;
}
cout<<max(ans1,ans2);
return 0;
}
T2
一个出题人说的比较简单的dp?但是我不会,我也不想补了,反正现在的水平肯定写不出来,还不如去做点更能提升自己的题。
做法先放这里:
T3
暴力有50pts?6。不过旁边的老哥没加读入优化第三个点挂了emm。
大致做法:二维前缀和。但是有点看不懂。
贺了榜上的正解,做出来的人还是非常多的,但是我菜/ll
code
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=514,M=1919810;
ll n,Q,opt,a,b,sum;
ll s1[N][N],s2[N][N],s3[N][N];
int main(){
//freopen("Aha4.in","r",stdin);
//freopen("Aha4.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>Q;
while(Q--){
cin>>opt>>a>>b;
if(a>b) swap(a,b);
if(opt==1){
sum+=b-a;
for(int i=a;i<=n;++i) ++s1[i][b];
for(int i=b;i>=1;--i) ++s2[a][i];
for(int i=b;i<=n;++i) ++s3[b-a][i];
}
else{
ll ans=sum;
for(int i=1;i<=n;++i)
if(b<=i) ans-=(b-a)*(s1[a][i]);
else if(a+b<2*i) ans-=s1[a][i]*(2*i-a-b);
for(int i=a+1;i<=n;++i)
if(a+b>2*i) ans-=s2[i][b]*(a+b-2*i);
for(int i=1;i<=n;++i)
if(2*i>b-a) ans-=(b>i+a?s3[i][b-1]-s3[i][a+i]:0)*(2*i-(b-a));
cout<<ans<<'\n';
}
}
return 0;
}
T4
頑張って