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; }