2022/3/22 equation,binary,deseq和mason
阿新 • • 發佈:2022-03-22
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; }