訓練賽-Building Numbers
阿新 • • 發佈:2018-01-24
cstring 代碼 tin -s con 裏的 scan namespace number
題意:首先告訴你,一個數字從1開始有兩種變換方式:1.當前數字的值加1
2.當前的數字值乘2;
思路:首先把數組裏的數字需要的變換次數算出來,然後用前綴和解決;
代碼:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #define ll long long using namespace std; ll a[100005];ll sum[100005];ll ans[100005]; int main() { int t; int n; intq; scanf("%d",&t); int l,r; while(t--) { memset(sum,0,sizeof(sum)); memset(ans,0,sizeof(ans)); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); ll x=a[i]; if(x==1) { ans[i]=0;continue; } while(x>1) { if((x&1)==1) { x--;ans[i]++; } else { x=x/2;ans[i]++; } } } for(int i=1;i<=n;i++) sum[i]=sum[i-1]+ans[i]; while(q--) { scanf("%d%d",&l,&r); if(l==r) printf("%lld\n",ans[l]); else printf("%lld\n",sum[r]-sum[l-1]); } } return 0; }
訓練賽-Building Numbers