2017年多校联合训练 第二场(成电)
2017-07-27 18:49
239 查看
Link
官方题解
1001 Is Derek lying?
hdoj6045题目链接
用same表示两个字符串对应位置相同的个数,用diff表示两个字符串对应位置不同的个数,易得same+diff=N
稍加分析易知:
-diff<=X-Y<=diff
0<=X+Y<=2*same+diff(=2*n-diff)
1003 Maximum Sequence
hdoj6047题目链接
对于每一个b[k],即每个左端点,在考虑放到a[i],i∈(n,2*n]的数的时候,把区间[b[k],i)分为[b[k],n],[n+1,i)两个区间
首先预处理a[i]-=i,再预处理出后缀最大值,c[i]表示max{a[i],…,a
}
vs数组变相记录了题目中的b数组,mn表示最左端点
贪心策略就是,所能放的最大值c[mn]一定要放在a[n+1],并且可以保证a[n+1]=max{a[n+1],…,a[2*n]}
再回到第一句说的两个区间,易知第一个区间的最大值为c[b[k]],第二个区间的最大值为a[n+1]-(n+1)=c[mn]-(n+1)
1009 TrickGCD
hdoj6053题目链接
莫比乌斯反演
首先看到题目里说gcd>=2就该联想到取补集,用所有的情况数减去gcd==1的情况更为简便
f(d)表示d==gcd(b[1],b[2],…,b
)的情况数
F(d)表示d|gcd(b[1],b[2],…,b
)的情况数,易得:F(d)=∏ni=1⌊aid⌋
由莫比乌斯反演得:f(x)=∑x|dμ(dx)∗F(d)
我们要求的f(1)=∑μ(d)∗F(d)=∑μ(d)∗∏ni=1⌊aid⌋
预处理F数组,每次对于i,找出所有满足⌊di⌋==j的数,乘进去
1011 Regular polygon
hdoj6055题目链接
稍加分析易知,在所给点的坐标均为整数的情况下,能构成的正多边形只能是正方形
n方暴力,确定两点之后判断是否存在能与他俩组成正方形的两点
最后答案除以4,因为一个正方形四个点任取两个,再减去两个点在对角线上的情况,C(4,2)-2=4
官方题解
1001 Is Derek lying?
hdoj6045题目链接
用same表示两个字符串对应位置相同的个数,用diff表示两个字符串对应位置不同的个数,易得same+diff=N
稍加分析易知:
-diff<=X-Y<=diff
0<=X+Y<=2*same+diff(=2*n-diff)
#include<bits/stdc++.h> using namespace std; #define N 80005 int main() { int t,n,x,y,i,s; char a ,b ; scanf("%d",&t); while(t--){ scanf("%d%d%d%s%s",&n,&x,&y,a,b); for(s=i=0;i<n;i++)if(a[i]!=b[i]) s++; puts(abs(x-y)<=s&&x+y<=2*n-s?"Not lying":"Lying"); } }
1003 Maximum Sequence
hdoj6047题目链接
对于每一个b[k],即每个左端点,在考虑放到a[i],i∈(n,2*n]的数的时候,把区间[b[k],i)分为[b[k],n],[n+1,i)两个区间
首先预处理a[i]-=i,再预处理出后缀最大值,c[i]表示max{a[i],…,a
}
vs数组变相记录了题目中的b数组,mn表示最左端点
贪心策略就是,所能放的最大值c[mn]一定要放在a[n+1],并且可以保证a[n+1]=max{a[n+1],…,a[2*n]}
再回到第一句说的两个区间,易知第一个区间的最大值为c[b[k]],第二个区间的最大值为a[n+1]-(n+1)=c[mn]-(n+1)
#include<bits/stdc++.h> using namespace std; typedef long long LL; const LL M=1e9+7; #define N 250005 int n,i,x,a ,c ,mn,tmp; LL ans,vs ; int main() { while(~scanf("%d",&n)){ for(i=1;i<=n;i++) scanf("%d",&a[i]),a[i]-=i,vs[i]=0; for(c[n+1]=0,i=n;i;i--) c[i]=max(a[i],c[i+1]); for(mn=N,i=1;i<=n;i++) scanf("%d",&x),vs[x]++,mn=min(mn,x); tmp=c[mn]-(n+1); for(ans=0,i=n;i&&n;i--)if(vs[i]) ans=(ans+vs[i]*max(tmp,c[i])%M)%M,n-=vs[i]; printf("%lld\n",ans); } }
1009 TrickGCD
hdoj6053题目链接
莫比乌斯反演
首先看到题目里说gcd>=2就该联想到取补集,用所有的情况数减去gcd==1的情况更为简便
f(d)表示d==gcd(b[1],b[2],…,b
)的情况数
F(d)表示d|gcd(b[1],b[2],…,b
)的情况数,易得:F(d)=∏ni=1⌊aid⌋
由莫比乌斯反演得:f(x)=∑x|dμ(dx)∗F(d)
我们要求的f(1)=∑μ(d)∗F(d)=∑μ(d)∗∏ni=1⌊aid⌋
预处理F数组,每次对于i,找出所有满足⌊di⌋==j的数,乘进去
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define ms(x) memset(x,0,sizeof(x)) const int N=1e5+5; const LL M=1e9+7; bool vs ; int pm ,a ; LL mu ,F ,ans,tmp; void mobius() { mu[1]=1; int tot=0; for(int i=2;i<N;i++){ if(!vs[i]) pm[tot++]=i,mu[i]=-1; for(int j=0;j<tot;j++){ if(i*pm[j]>N) break; vs[i*pm[j]]=1; mu[i*pm[j]]=i%pm[j]?-mu[i]:0; } } } LL pow_mod(LL a,LL b) { LL s=1; while(b){ if(b&1) s=s* baf0 a%M; b>>=1; a=a*a%M; } return s; } int main() { mobius(); int t,c,n,x,mn,mx,i,j; scanf("%d",&t); for(c=1;c<=t;c++){ scanf("%d",&n); ms(a),ms(F),mn=N,mx=0,ans=1; while(n--) scanf("%d",&x),a[x]++,mn=min(mn,x),mx=max(mx,x),ans=ans*x%M; for(i=1;i<=mx;i++) a[i]+=a[i-1]; for(i=1;i<=mn;i++)for(F[i]=j=1;j*i<=mx;j++) F[i]=F[i]*pow_mod(j,a[min(i*(j+1)-1,mx)]-a[i*j-1])%M; for(tmp=0,i=mn;i;i--) tmp=(tmp+F[i]*mu[i]%M)%M; printf("Case #%d: %lld\n",c,(ans-tmp+M)%M); } }
1011 Regular polygon
hdoj6055题目链接
稍加分析易知,在所给点的坐标均为整数的情况下,能构成的正多边形只能是正方形
n方暴力,确定两点之后判断是否存在能与他俩组成正方形的两点
最后答案除以4,因为一个正方形四个点任取两个,再减去两个点在对角线上的情况,C(4,2)-2=4
#include<bits/stdc++.h> using namespace std; int x[505],y[505],vs[205][205],n,i,j,ans,dx,dy,x1,y1,x2,y2; bool chk(int a,int b) { return a>=0&&a<=200&&b>=0&&b<=200; } //防止x1,y1,x2,y2越界 int main() { while(~scanf("%d",&n)){ memset(vs,0,sizeof(vs)); for(i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]),x[i]+=100,y[i]+=100,vs[x[i]][y[i]]++; for(ans=0,i=1;i<n;i++)for(j=i+1;j<=n;j++){ dx=x[i]-x[j],dy=y[i]-y[j]; x1=x[i]+dy,y1=y[i]-dx; x2=x[j]+dy,y2=y[j]-dx; if(chk(x1,y1)&&chk(x2,y2)) ans+=vs[x1][y1]*vs[x2][y2]; x1=x[i]-dy,y1=y[i]+dx; x2=x[j]-dy,y2=y[j]+dx; if(chk(x1,y1)&&chk(x2,y2)) ans+=vs[x1][y1]*vs[x2][y2]; } printf("%d\n",ans/4); } }
相关文章推荐
- 2017年多校联合训练 第七场(杭二中)
- 2017年多校联合训练 第一场(北航)
- 2017年多校联合训练 第五场(吉如一)
- 2017年多校联合训练 第六场(福州大学)
- 2017年多校联合训练 第三场(洪华敦)
- 07.25.17 2017年多校联合训练第1场
- 2017 7.27多校训练第二场补题
- 2017 多校训练第二场 HDU 6053 TrickGCD
- 2016多校联合训练第二场 1001 Acperience 公式推导
- 2015年多校联合训练第四场(Olympiad)hdu5327
- HDU 6040& 2017年多校训练第一场 1008题
- 2017 多校训练第二场 HDU 6045 Is Derek lying?
- (2017多校训练第二场)HDU - 6055 & POJ - 2002 Regular polygon 哈希
- 2015年多校联合训练第四场(Problem Killer)hdu5328
- HDU 4876 ZCC loves cards (2014多校联合训练第二场1005) 解题报告(暴力+剪枝)
- (2017多校训练第二场)HDU - 6052 To my boyfriend 思维题
- 2017多校联合第二场 1011题 hdu 6055 Regular polygon 计算几何
- (2017多校训练第二场)HDU - 6047 Maximum Sequence 贪心 + 单调队列
- 2017 多校训练第二场 HDU 6047 Maximum Sequence
- 2015年多校联合训练第三场RGCDQ(hdu5317)