zoukankan      html  css  js  c++  java
  • HDU4455

    HDU4455


    做法:照着学姐的ppt做的。(f[i])表示长度为i时的答案,考虑如何通过(f[i-1])递推出(f[i])
    eg:(f[3] ightarrow f[4])
    (1 1 2) 3 4 4 5
    1 1 2 ( ightarrow) 1 1 2 3 :+1
    1 2 3 ( ightarrow) 1 2 3 4 :+1
    2 3 4 ( ightarrow) 2 3 4 4 :+0
    3 4 4 ( ightarrow) 3 4 4 5 :+1
    4 4 5 ( ightarrow) 无 :-2

    得到方程:(f[i] = f[i-1] + dt[i] - dif[i-1])(dif[i-1]) 表示最后i-1个数中不同的个数;(dt[i]):表示每个元素的贡献,只有与上一个相同的元素之间距离大于等于i时,才会对答案有贡献。预处理这两个东西即可。本题需要用long long ,卡内存尽量复用数组。

    #include <bits/stdc++.h>
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    #define per(i,a,b) for(int i=a;i>=b;--i)
    typedef long long ll;
    const int N = 1e6+7;
    inline int read() {
        char c=getchar();int x=0,f=1;
        while(!isdigit(c)){if(f=='-')f=-1;c=getchar();}
        while(isdigit(c)){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    using namespace std;
    int n;
    int a[N],dif[N];
    ll f[N],dt[N];
    void init_dif() {
        int sz = 0;
        memset(f,0,sizeof(f));
        per(i,n,1) {
            if(!f[a[i]]) f[a[i]]=1,++sz;
            dif[n-i+1] = sz;
        }
    }
    void init_dt() {
        memset(dt,0,sizeof(dt));
        rep(i,1,n) {
            f[i] = dt[a[i]];
            dt[a[i]]=i;
        }
        memset(dt,0,sizeof(dt));
        rep(i,1,n) {
            dt[i-f[i]]++;
        }
        dt[n+1] = 0;
        per(i,n,1) dt[i]+=dt[i+1];
    }
    void init() {
        init_dif();
        init_dt();
        f[1] = n;
        rep(i,2,n) {
            f[i] = f[i-1] + dt[i] - dif[i-1];
        }
    }
    int main() {
        while(scanf("%d",&n),n) {
            rep(i,1,n) a[i]=read();
            init();
            int q = read();
            while(q--) {
                int w = read();
                printf("%lld
    ",f[w]);
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    Java连接数据库 #02# JDBC经典套路
    Eloquent JavaScript #03# functions
    Java笔记 #04# 类的初始化顺序补充
    Java笔记 #03# HtmlUnit爬虫
    Google's Machine Learning Crash Course #04# First Steps with TensorFlow
    IntelliJ IDEA. Debug模式
    python实用笔记,加快编程速度,lamdba,三元运算,open.
    开源项目管理平台*redmine*的架设
    MYSQL双主故障解决实例。
    LVS-DR工作原理
  • 原文地址:https://www.cnblogs.com/RRRR-wys/p/9471492.html
Copyright © 2011-2022 走看看