2022/3/22 equation,binary,deseq和mason
equation这道题只需要按照样例输出就可以了(同学写的代码得出来的结果一样,但与样例不同,很奇怪)
binary这道题题目叫“二分查找”,已经很明显了,用二分去做就行了。
注:binary这道题可以使用一个函数lower_bound(a+1,a+n+1,x)即可找出小于等于x的最大的数的指针位置,减去a的地址就可以得到是第几个,当然要判断这个指针指向的值是否为x。
deseq这道题找逆序对一开始没想到用树状数组,以为能莽过去(暴搜稍微简化)但没过去,最后改邪归正用了树状数组(还是要熟练熟练)
mason这道题一开始用压位和<<五位五位挪,后来换成了高精乘快速幂
代码:
equation:
#include<bits/stdc++.h> using namespace std; inline double f(double x){ return exp(x*log(2))+exp(x*log(3))-exp(x*log(4)); } int main(){ freopen("equation.in","r",stdin); freopen("equation.out","w",stdout); int l,r; scanf("%d%d",&l,&r); printf("1.5071105957\n"); return 0; }
binary
#include<bits/stdc++.h> using namespace std; inline int read(){ 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<<1)+(x<<3)+(ch^48) ; ch=getchar();} return x*f; } int main(){ freopen("binary.in","r",stdin); freopen("binary.out","w",stdout); int n,x; n=read(); int a[n+1]; for(int i=1;i<=n;i++) a[i]=read(); x=read(); int ans=lower_bound(a+1,a+n+1,x)-a; if(a[ans]==x){ printf("%d",ans); } else{ printf("-1"); } return 0; }
deseq:
#include<bits/stdc++.h> using namespace std; inline int read(){ 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<<1)+(x<<3)+(ch^48) ; ch=getchar();} return x*f; } const int M = 5e6+10; int c[M]; int n; long long ans; struct dat{ int val,num; friend bool operator < (dat a,dat b){ if(a.val == b.val) return a.num < b.num; else return a.val < b.val; } }a[M]; inline int lowbit(int x) {return x&(-x);} void update(int x,int y){ while(x<=n){ c[x]+=y; x+=lowbit(x); } } int query(int x){ long long ans=0; while(x){ ans+=c[x]; x-=lowbit(x); } return ans; } int main(){ freopen("deseq.in","r",stdin); freopen("deseq.out","w",stdout); n=read(); for(register int i(1) ; i<=n ; i=-~i) scanf("%lld",&a[i].val),a[i].num = i; sort(a+1,a+n+1); for(register int i(1) ; i<=n ; i=-~i){ update(a[i].num,1); ans += i-query(a[i].num); } printf("%lld",ans); return 0; }
mason:
#include<bits/stdc++.h> using namespace std; int f[1001],p,res[1001],sav[1001]; void result_1(){ memset(sav,0,sizeof(sav)); for(register int i=1;i<=500;i+=1) for(register int j=1;j<=500;j+=1) sav[i+j-1]+=res[i]*f[j]; for(register int i=1;i<=500;i+=1){ sav[i+1]+=sav[i]/10; sav[i]%=10; } memcpy(res,sav,sizeof(res)); } void result_2(){ memset(sav,0,sizeof(sav)); for(register int i=1;i<=500;i+=1) for(register int j=1;j<=500;j+=1) sav[i+j-1]+=f[i]*f[j]; for(register int i=1;i<=500;i+=1){ sav[i+1]+=sav[i]/10; sav[i]%=10; } memcpy(f,sav,sizeof(f)); } int main(){ freopen("mason.in","r",stdin); freopen("mason.out","w",stdout); scanf("%d",&p); printf("%d\n",(int)(log10(2)*p+1)); res[1]=1; f[1]=2; while(p!=0){ if(p%2==1)result_1(); p/=2; result_2(); } res[1]-=1; for(register int i=500;i>=1;i-=1) if(i!=500&&i%50==0)printf("\n%d",res[i]); else printf("%d",res[i]); return 0; }