A - 解方程
看着吓人,实则low得一比,就是求(a,b)到(c,d)的距离。
#include <cstdio>
#include <cmath>
using namespace std;
double dis(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
double a,b,c,d;
int t;
for(scanf("%d",&t);t--;){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
printf("%.1lf\n",dis(a,b,c,d));
}
}
B - Project Euler #1: Multiples of 3 and 5
简单容斥原理。_3+_5后_15会被重算一次,所以求出_3,_5,_15这道题就出来了。
#include <cstdio>
int main(){
int n,t;long long _3,_5,_15;
for(scanf("%d",&t);t--;){
scanf("%d",&n);
_3=(n-1)/3;
_3=(_3+1)*_3/2;
_5=(n-1)/5;
_5=(_5+1)*_5/2;
_15=(n-1)/15;
_15=(_15+1)*_15/2;
printf("%lld\n",_3*3+_5*5-_15*15);
}
}
C - Laser
和上题一样,依然是判断重合部分,这道题就能过了。
#include <cstdio>
int main(){
int t;long long a,b,c,d,box1,box2,tt,m,n;
for(scanf("%d",&t);t--;){
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&a,&b,&c,&d);
if(c<a)tt=c,c=a,a=tt;
if(d<b)tt=b,b=d,d=tt;
c=c-a+1;d=d-b+1;a=1;b=1;
box1=(n-c+1)*(m-d+1);
if(n-c+1-c+1<=0||m-d+1-d+1<=0)box2=0;
else box2=(n-c+1-c+1)*(m-d+1-d+1);
printf("%lld\n",(long long)n*m-box1*2+box2);
}
}
D - Pride
DP水过去,开开心心…
#include <cstdio>
#include <algorithm>
using namespace std;
int gcd(int x,int y){
int t;
while(y){t=x%y;x=y;y=t;}
return x;
}
int dp[2005][2005];
int main(){
int n,flag,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&dp[i][i]),ans+=(dp[i][i]!=1);
for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)dp[i][j]=gcd(dp[i][j-1],dp[j][j]);
for(int s=1;s<=n;s++){
flag=0;
for(int i=1,cur;(cur=i+s-1)<=n;i++){
if(dp[i][cur]==1){
if(s==1)printf("%d",ans);
else printf("%d",n+s-2);
return 0;
}
}
}
printf("-1");
}
E - Strange Counter
模拟,完全水题。
#include <cstdio>
#define beg 3
int main(){
long long t,val;
while(~scanf("%lld",&t)){
val=beg;
while(t>val)t-=val,val<<=1;
printf("%lld\n",val-t+1);
}
}
F - Simple Skewness
搞出差分后二分。
#include <cstdio>
#include <algorithm>
#define FF(_i,_l,_r) for(int _i=_l;_i<=(_r);_i++)
#define INTMAX 0x7fffffff
#define MAXN 200000
using namespace std;
typedef long long ll;
int n,ansi=1,len=0;
int A[MAXN+5];double S[MAXN+5];
inline double solve(int i,int cur){
return (S[n]-S[n-cur]+S[i]-S[i-cur-1])/(2*cur+1);
}
int main() {
scanf("%d",&n);
FF(i,1,n)scanf("%d",&A[i]);
sort(A+1,A+1+n);
FF(i,1,n)S[i]=S[i-1]+A[i];
int l,r,m,llen;
double ans=-INTMAX,anss=0;
FF(i,1,n){
int l=1,r=min(i-1,n-i),llen=0;
while(r>=l){
m=(l+r)>>1;
if(solve(i,m)>solve(i,m-1))llen=m,l=m+1;
else r=m-1;
}
if((anss=solve(i,llen)-A[i])>ans)ans=anss,len=llen,ansi=i;
}
printf("%d\n",len*2+1);
FF(i,ansi-len,ansi)printf("%d ",A[i]);
FF(i,n-len+1,n)printf("%d ",A[i]);
}
G - Bash and a Tough Math Puzzle
线段树维护gcd。
#include <cstdio>
using namespace std;
const int N=500000;
int gcd(int a,int b){
int r;
while(b){r=a%b;a=b;b=r;}
return a;
}
inline int readi(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int sgt[(N<<2)+5],n;
void bui(int pos,int l,int r){
if(l==r)sgt[pos]=readi();
else{
int m=(l+r)>>1,lc=pos<<1;
bui(lc,l,m);
bui(lc|1,m+1,r);
sgt[pos]=gcd(sgt[lc],sgt[lc|1]);
}
}
int ans,tl,tr,a,v;
void upd(int pos,int l,int r){
if(l==r&&r==a)sgt[pos]=v;
else{
int m=(l+r)>>1,lc=pos<<1;
if(a>m)upd(lc|1,m+1,r);
else upd(lc,l,m);
sgt[pos]=gcd(sgt[lc],sgt[lc|1]);
}
}
void qry(int pos,int l,int r){
if(ans>1)return ;
if(l==r)ans++;
else{
int m=(l+r)>>1,lc=pos<<1;
if(m>=tl&&sgt[lc]%v)qry(lc,l,m);
if(m<tr&&sgt[lc|1]%v)qry(lc|1,m+1,r);
}
}
int main(){
bui(1,1,n=readi());
int Q,q;
for(Q=readi();Q--;){
q=readi();
if(--q){
a=readi();v=readi();
upd(1,1,n);
}
else {
ans=0;
tl=readi();tr=readi();v=readi();
qry(1,1,n);
if(ans<=1)puts("YES");
else puts("NO");
}
}
}
H - Masha and Cactus
仙人掌…完全不懂,还是磨练磨练再a这题吧。