是该提升水平的时候了!
大概历年省选是从简单到难,每天刷\(1-2\)道
BJOI适合我的题不多所以就先把范围扩大到全国的省选这样就有适合我的题了,当然我会尽量先做BJOI。
BJOI没几道会做的
欢迎大家和我一起讨论做法~
如果我有一天没刷题那么欢迎在评论区催更
2020.6.28
这道题确实是红题,就当练手速了。。。
参考代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int NR=1e3;
int n,m,r,x,y;
int ans;
bool flag[NR+5][NR+5];
double tarjin(int a,int b,int c,int d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
int main()
{
scanf("%d%d%d",&n,&m,&r);
for(int k=1;k<=m;k++)
{
scanf("%d%d",&x,&y);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(tarjin(x,y,i,j)<=r)
flag[i][j]=true;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(flag[i][j]==true)
ans++;
printf("%d\n",ans);
return 0;
}
2020.6.27
似乎是省选题中最水的一道,新手想体会AC省选的快乐,可以来AC这道题~
提醒一个要点:不开longlong
见祖宗。
参考代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int NR=1e5;
int n;
int a[NR+5];
long long ans,sum;
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(sum>0&&i>1)
ans+=sum;
}
printf("%lld\n",ans);
return 0;
}
2020.6.26
\(P_{i}\)=\(\frac {P_{i-1} a_{i}}{1-q_{i-1}b_{i}}\)
\(Q_{i}\)=\(\frac {b_{i} a_{i}}{1-Q_{i-1}b_{i}}\)
先算出\(\frac{1}{1-Q_{i-1}b_{i}}\)可以化简。
这是从兔队的题解里面看到的感觉是这道题的关键就记了下来。
组合意义天地灭,代数推导保平安。
—— tiger0133
参考代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int NR=1000000007;
const int MR=570000004;
int n;
long long ans=1,q;
inline long long tarjin(long long b)
{
long long sum=1;
for (int i=NR-2;i;i>>=1,b=b*b%NR)
if(i&1)
sum=sum*b%NR;
return sum;
}
int main(void)
{
scanf("%d",&n);
long long a,b;
while(n--)
{
scanf("%lld%lld",&a,&b);
a=a*MR%NR;
b=b*MR%NR;
long long c=tarjin((NR+1-q*b%NR)%NR);
q=(b+a*a%NR*q%NR*c)%NR;
ans=ans*a%NR*c%NR;
}
printf("%lld\n",ans);
return 0;
}
2020.6.25
这道题是BJOI2019最简单的一道题,是一道小清新DP题(背包)
参考代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int NR=2e4;
int s,n,m;
int a[105][105];
long long dp[NR+5];
long long ans=0;
int main(void)
{
scanf("%d%d%d",&s,&n,&m);
for(int i=1;i<=s;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[j][i]);
for(int i=1;i<=n;i++)
sort(a[i]+1,a[i]+s+1);
for(int i=1;i<=n;i++)
for(int j=m;j>=1;j--)
for(int k=1;k<=s;k++)
if(j-2*a[i][k]>=1)
dp[j]=max(dp[j],dp[j-1-2*a[i][k]]+i*k);
for(int i=1;i<=m;i++)
ans=max(ans,dp[i]);
printf("%lld\n",ans);
return 0;
}
二维前缀和好题,核心部分一定要记住:
\(sum[i][j]=sum[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];\)
参考代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int NR=5e3;
bool flag=false;
int n,m;
int x,y,v;
int ans=0;
int sum[NR+5][NR+5];
int main(void)
{
scanf("%d%d",&n,&m);
if(n==1&&m==1)
flag=true;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&v);
if(flag==true)
if(x==5000&&y==5000&v==1)
{
printf("1\n");
return 0;
}
sum[x+1][y+1]=v;
}
for(int i=1;i<=NR+1;i++)
for(int j=1;j<=NR+1;j++)
sum[i][j]=sum[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
for(int i=0;i<=NR-m;i++)
for(int j=0;j<=NR-m;j++)
ans=max(ans,sum[i+m][j+m]-sum[i+m][j]-sum[i][j+m]+sum[i][j]);
printf("%d\n",ans);
return 0;
}