Div2 都不能A完,手速还是不行
A题:
#include
using namespace std;
int x,y,_x,_y;
int main(void){
register int i;
scanf("%d%d",&x,&y);
if(y==0){
puts("No");
return 0;
}
_x=0,_y=1;
_y=y,_x=y-1;
if(x<_x){
puts("No");
return 0;
}else{
if(((x-_x)%2)==0)puts("Yes");
else puts("No");
}
return 0;
}
B题:
#include
using namespace std;
int n,y;
long long ans;
int main(void){
register int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
y=i^j;
if(y>n)continue;
if(i+j>y&&j+y>i&&i+y>j)++ans;
}
printf("%d\n",ans/6);
return 0;
}
C题:
#include
#include
using namespace std;
unsigned long long n,k,sum=1;
int main(void){
register int i;
scanf("%llu%llu",&n,&k);
for(i=1;i<=k;++i)
if(n%i!=i-1){
puts("No");
return 0;
}
puts("Yes");
return 0;
}
D题:
#include
#include
#include
using namespace std;
struct Y{
long long x,y;
inline bool operator<(const Y&a)const{
return x*a.y>a.x*y;
}
}a[200005];
int n;
long long ans,sumh,sum;
char s[200005];
int main(void){
register int i,j,len;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%s",s+1);
len=strlen(s+1);
for(j=1;j<=len;++j)
if(s[j]=='s')a[i].x+=1;
else a[i].y+=1,++sumh,++sum;
for(j=1;j<=len;++j)
if(s[j]=='s'){
ans+=sumh;
}else --sumh;
}
sort(a+1,a+n+1);
for(i=1;i<=n;++i)
sum-=a[i].y,ans+=a[i].x*sum;
printf("%lld\n",ans);
return 0;
}
E题:
n∗c2 dp 很显然,加个单调队列优化就秒了
#include
#include
#include
using namespace std;
#define ll long long
inline char tc(void){
static char fl[10000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,10000,stdin),A==B)?EOF:*A++;
}
inline ll read(void){
ll a=0;char c;
while((c=tc())<'0'||c>'9');
while(c>='0'&&c<='9')a=a*10+c-'0',c=tc();
return a;
}
ll n,W,B,X,sum,c[1005],last,cost[1005],l,r,mx,ans,a[10005],b[10005];
ll f[1005][10005];
int main(void){
ll i,j;
n=read(),W=read(),B=read(),X=read();
for(i=1;i<=n;++i)c[i]=read();
for(i=1;i<=n;++i)cost[i]=read();
memset(f,0xff,sizeof(f)),f[0][0]=W-X;
for(i=1;i<=n;++i){
l=1,r=0,sum+=c[i],last=sum,mx=0;
for(j=0;j<=sum;++j){
if(j<=last){
if(f[i-1][j]!=-1||i-1==0&&j==0){
ll x;
f[i-1][j],x=min(f[i-1][j]+X,W+j*B)+j*cost[i];//mx=max(mx,f[i-1][j]+X);
while(l<=r&&x>=a[r])--r;
a[++r]=x,b[r]=j;
}
}
while(l<=r&&b[l]+c[i]if(l<=r&&a[l]>=j*cost[i])f[i][j]=a[l]-j*cost[i];
}
}
for(i=1;i<=n;++i)
for(j=0;j<=sum;++j)
if(f[i][j]!=-1)
ans=max(ans,j);
printf("%lld\n",ans);
return 0;
}