RANK :86 题数 :1
做了三题过了一个...A题最小表示法裸题, B题dp状态定错一直改一直WA,F题叉积 计算凸多边形面积。 预处理姿势错误。
补题 :
记录叉积公式的前缀和即可。
#include<bits/stdc++.h>
using namespace std;
#define maxn 123456
struct node
{
double x,y;
} a[maxn];
double sum1[maxn],sum2[maxn],sum,ans,tp;
int n,q,c,d;
int main()
{
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
a[n+1]=a[1];
for(int i=1; i<=n; i++)
{
sum1[i+1]=sum1[i]+a[i].x*a[i+1].y;
sum2[i+1]=sum2[i]+a[i].y*a[i+1].x;
}
sum=(sum1[n+1]-sum2[n+1])/2;
while(q--)
{
scanf("%d%d",&c,&d);
if(c>d)swap(c,d);
tp=a[d].x*a[c].y-a[c].x*a[d].y;
tp+=((sum1[d]-sum1[c])-(sum2[d]-sum2[c]));
tp/=2;
ans=max(ans,min(sum-tp,tp));
}
printf("%.15lf
",ans);
return 0;
}
C题 :https://ac.nowcoder.com/acm/contest/328/C
思路:转化一下,看似是一个体积为 W的完全背包但还有个额外要求,恰好完成K门课,所以预处理 假设K门课都通过一天完成。
然后剩下的天数进行完全背包求最大价值 ,这样的话原来天数的价值需要与 1天完成做差预处理。然后就可以放心的完全背包了。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 12345
int dp[maxn],n,k,w,a[maxn];
int main()
{
scanf("%d%d%d",&n,&k,&w);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(i)a[i]-=a[0];
}
dp[0]=k*a[0];
w-=k;
for(int i=1; i<n; i++)
for(int j=i; j<=w; j++)
dp[j]=max(dp[j],dp[j-i]+a[i]);
printf("%d
",dp[w]);
return 0;
}
- Rabbit的数列
- 思路:分块整体标记块内数字,如果块内出现混色需要修改为 -1,此时记得把染得色下放
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1234567 int n,q,c,x,y,a,b,big,tong[maxn]; int data[maxn],bo[maxn],ans; ll tp,L,R; void cal(int l,int r) { int j; tong[y]+=(r-l+1); for( j=l; j<=r&&j%big; j++) { if(bo[j/big]!=y&&bo[j/big]!=-1) { for(int sk=(j/big)*big; sk<(j/big+1)*big; sk++) data[sk]=bo[j/big]; bo[j/big]=-1; } tong[data[j]]--; data[j]=y; } for(; j+big-1<=r; j+=big) { if(bo[j/big]!=-1) tong[bo[j/big]]-=big; else { for(int sk=j; sk<=r&&sk<j+big; sk++) { tong[data[sk]]--; data[sk]=y; } } bo[j/big]=y; } for(; j<=r; j++) { if(bo[j/big]!=y&&bo[j/big]!=-1) { for(int sk=(j/big)*big; sk<(j/big+1)*big; sk++) data[sk]=bo[j/big]; bo[j/big]=-1; } tong[data[j]]--; data[j]=y; } } int main() { scanf("%d%d%d",&n,&c,&q); big=sqrt(n); for(int i=0; i<=n; i++) data[i]=bo[i]=1; tong[1]=n; while(q--) { scanf("%d%d%d%d",&x,&y,&a,&b); tp=tong[x]; L=((tp+b)%n*(tp+b)%n+a)%n; R=((tp*b)%n*(tp*b)%n+a)%n; tp=L; L=min(L,R); R=max(R,tp); cal(L,R); } for(int i=0; i<maxn; i++) ans=max(ans,tong[i]); printf("%d ",ans); return 0; }

#include<bits/stdc++.h>
using namespace std;
#define maxn 456
int n,m,dp[3][maxn][maxn],cur,ans,up,sum[maxn];
char str[maxn];
int main()
{
memset(dp,-1,sizeof(dp));
scanf("%d%d%s",&n,&m,str+1);
dp[0][0][0]=m;
for(int i=1; i<=n; i++)if(str[i]=='1')sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
for(int i=1; i<=n; i++)
{
up=sum[i];
memset(dp[cur^1],-1,sizeof(dp[cur^1]));
if(str[i]=='1')
{
for(int j=1; j<=up; j++)
for(int k=1; k<=min(up,m); k++)
{
dp[cur^1][j][k]=max(dp[cur^1][j][k],dp[cur][j-1][k-1]-k);
}
}
for(int j=0; j<=up; j++)
for(int k=0; k<=min(up,m); k++)
{
dp[cur^1][j][0]=max(dp[cur^1][j][0],dp[cur][j][k]);
}
cur^=1;
}
up=sum[n];
for(int i=up; i>=0; i--)
for(int k=0; k<=min(up,m); k++)
if(dp[cur][i][k]>=0)
{
printf("%d
",i);
return 0;
}
return 0;
}