玲珑#19 A 数论打表 B RMQ+二分

来源:互联网 发布:软件系统集成商 编辑:程序博客网 时间:2024/05/16 12:59

A: http://www.ifrog.cc/acm/problem/1145


#include <bits/stdc++.h>using namespace std;int main(){int n;while(~scanf("%d",&n)){int m = n;int num;if( m >=1 && m<=10 ){num = 0;}else if(m <= 99)  num = 1;else if(m <= 998)  num = 2;else if(m <= 9997) num = 3;else if(m <= 99996) num = 4;else if(m <= 999995) num = 5;else if(m <= 9999994) num = 6;else if(m <= 99999993) num = 7;else if(m <= 999999992) num = 8;else if(m <= 9999999991) num = 9;cout<<n+num<<endl;}return 0;}


B:http://www.ifrog.cc/acm/problem/1149

#include <iostream>#include <cstdio>#include <string.h>#include <cmath>#define LL long longusing namespace std;const int AX = 2e5+666;int dp1[AX][20];int dp2[AX][20];int n,k;int mm[AX];int a[AX];void rmq(){for( int j = 1 ; (1 << j) <= n ; j++ ){for( int i = 1 ; i + ( 1 << j ) -1 <= n ; i++ ){dp1[i][j] = min(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);dp2[i][j] = max(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);}}}int query(int l, int r){int k = mm[r - l + 1];//int  k = (int)log( r - l + 1) / log(2);return max(dp2[l][k] , dp2[r- ( 1 << k ) + 1 ][k]) - min(dp1[l][k] , dp1[r- ( 1 << k ) + 1 ][k]);}int main(){mm[0] = -1;for(int i=1; i<AX; ++i) mm[i]=(i&(i-1))?mm[i-1]:mm[i-1]+1; //预处理存储K的值scanf("%d%d",&n,&k);for(int i = 1 ; i <= n; i++){scanf("%d",&a[i]);dp1[i][0] = a[i];dp2[i][0] = a[i];}rmq();LL ans = 0;int l,r,res;for( int i = 1 ; i <= n ; i++ ){l = 1, r = i ,res = i;while( l <= r ){int mid = (l + r) >> 1;int mn = query( mid , i ) ;if( mn > k )  l = mid + 1;else r = mid - 1 , res = mid ;}ans += ( i - res + 1 );}printf("%lld\n",ans);return 0;}


原创粉丝点击