zoukankan      html  css  js  c++  java
  • HDU 5289

    发现枚举+二分更好!

    我做得复杂了,竟然两个都是从左边开始枚举。找最大最小用ST算法吧。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #define LL long long
    using namespace std;
    
    const int MAX=100050;
    
    int f_min[MAX][20];
    int f_max[MAX][20];
    int num[MAX],n,dif;
    
    void pre_init(){
    	int k=(int)(log((double)n)/log(2.0));
    	for(int i=0;i<n;i++) f_min[i][0]=num[i],f_max[i][0]=num[i];
    	for(int j=1;j<=k;j++){
    		for(int i=0;i + (1 << j) - 1<n;i++){
    			f_min[i][j]=min(f_min[i][j-1],f_min[i+(1<<(j-1))][j-1]);
    			f_max[i][j]=max(f_max[i][j-1],f_max[i+(1<<(j-1))][j-1]);
    		}
    	}
    }
    
    int find_min(int i,int j){
    	int k = (int)(log(double(j-i+1)) / log(2.0));
    	return min(f_min[i][k], f_min[j - (1<<k) + 1][k]);
    }
    
    int find_max(int i,int j){
    	int k = (int)(log(double(j-i+1)) / log(2.0));
    	return max(f_max[i][k], f_max[j - (1<<k) + 1][k]);
    }
    
    int main(){
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d%d",&n,&dif);
    		for(int i=0;i<n;i++)
    			scanf("%d",&num[i]);
    		pre_init();
    		LL ans=0;
    		int l=0,r=0;
    		int dmin=num[0],umax=num[0]; bool flag=true;
    		while(l<n&&r<n){
    			if(flag){
    				while(r<n){
    					r++;
    					if(r==n){
    						r--;
    						break;
    					}
    					dmin=find_min(l,r);
    					umax=find_max(l,r);
    					if(umax-dmin>=dif){
    						r--;
    						break;
    					}
    				}
    			//	cout<<"true:"<<l<<" "<<r<<endl;
    				flag=false;
    				ans+=r-l+1;
    			}
    			else{
    				while(l<=r){
    					l++;
    					if(l>r){
    						break;
    					}
    					if(dmin!=find_min(l,r)||umax!=find_max(l,r)){
    						break;
    					}
    					else{
    						ans+=r-l+1;
    					}
    				}
    			//	cout<<"false:"<<l<<" "<<r<<endl;
    				flag=true;
    			}
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    <数据挖掘导论>读书笔记8FP树
    <数据挖掘导论>读书笔记7 Apriori算法
    c#:Json字符串转成xml对象
    微信公众平台开发
    一维随机变量及其概率分布
    概率的基本概念
    C#调用OCR组件识别图片文字
    增加系统右键菜单
    visual studio内置“iis”组件提取及二次开发
    《JavaScript权威指南》读书笔记——JavaScript核心
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4796346.html
Copyright © 2011-2022 走看看