1. 程式人生 > >訓練賽-Building Numbers

訓練賽-Building Numbers

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;
    int
q; 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