关闭

时间之主 解题报告

标签: BITDP
529人阅读 评论(0) 收藏 举报
分类:

时间之主
Timer.c/cpp/pas
TimerAugust掌握着无尽时间里不同时间轴的平行世界.每一个瞬间都会有
新的世界被创造出来,其中一些世界被创造出来的根源就是已有生灵的信仰.无论
是尸魂界幻想乡数码世界…只要有足够的信仰,世界之心就会抓取这些信仰并用
来构建成新的世界.不同世界有不同编号和不同信仰值.
现在 TimerAugust想知道对世界 1..n,有信仰值 a
1
..a
n
,其中那些i < j < … < k,ai > aj > … > ak的世界序列的数量.很不幸,你被他选中了.现在你需要在2s内回答他的问题(对能掌控时间的 Timer 来说 2 秒钟已经很长很长了),否则就要被丢到时间裂缝里变成一个永远静止的艺术品了.
输入 Input
第一行两个数 n,k,n 表示世界数目,k 说明你要找 k 元组数目.
接下来 n 行每行一个数,表示每个世界的信仰值.(不超过 int范围)
输出 Output
输出那个数目.(出题人保证答案炸 INT64 的数据被丢掉了 www)
数据范围 Hint
对 100%的数据,1≤n≤100000,1≤k≤10.
对 30%的数据,1≤n≤20.(由于出题人非常随(lan)性(duo)难以保证暴力能拿到全部暴力分…)
Sample Input Sample Output
4 3 4
10 8 3 1

这显然是一道水题,不过出题人的标算非常神。原来树状数组还可以反着用,求后缀和!就是把修改的路线和求和的路线反一下,就相当于是把标记留在了上面,然后询问的时候再去捡标记。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Mod 1000000007
#include<algorithm>
void in(int &x){
    char c=getchar();
    bool flag=0;
    for(;c<'0'||c>'9';c=getchar())
        if(c=='-')
            flag=1;
    x=0;
    for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
    if(flag)x=-x;
}
int f[15][100005];
int hash[100005],a[100005],htot;
int query(int k,int x){
    int ans=0;
    for(;x;x-=x&-x)ans=(ans+f[k][x])%Mod;
    return ans;
}
int update(int k,int x,int A){
    for(;x<htot;x+=x&-x)f[k][x]=(f[k][x]+A)%Mod;
}
int main(){
    freopen("timer.in","r",stdin);
    freopen("timer.out","w",stdout);
    int n,k,i,j;
    in(n),in(k);
    if(k==1){
        puts("0");
        return 0;
    }
    for(i=1;i<=n;++i)in(a[i]),hash[i]=a[i];
    sort(hash+1,hash+n+1);
    htot=unique(hash+1,hash+n+1)-hash;
    for(i=n;i;--i)a[i]=lower_bound(hash+1,hash+htot,a[i])-hash;
    for(i=n;i;--i){
        update(1,a[i],1);
        for(j=2;j<=k;++j)update(j,a[i],a[i]>1?query(j-1,a[i]-1):0);
    }
    printf("%d\n",query(k,htot-1));
}
0
0
查看评论

poj解题报告——2313

开始假设b[i] = a[i](1 Mid(b[i - 1], a[i], b[i + 1]) (2 <= i <= n - 1), mid(x, y, z)表示x, y, z中数值居中间的数}这个画下数轴就知道了,则b[i]=mid(b[i - 1], a[i], b[i + 1...
  • Lingfu74
  • Lingfu74
  • 2015-07-28 13:36
  • 555

[bzoj2049][SDOI2008]Cave 洞穴勘测

2049: [Sdoi2008]Cave 洞穴勘测Time Limit: 10 Sec Memory Limit: 259 MB Submit: 4803 Solved: 2137 [Submit][Status][Discuss] Description辉辉热衷于洞穴勘测。某天,他按照地...
  • FZHvampire
  • FZHvampire
  • 2015-08-26 10:39
  • 1394

NOIP2016提高组解题报告

D1T1玩具谜题   模拟 D1T2天天爱跑步   LCA,树链剖分 D1T3换教室  DP,数学期望,最短路 D2T1组合数问题   数学 D2T2蚯蚓   单调队列,模拟 D2T3愤怒的小鸟...
  • qwerty1125
  • qwerty1125
  • 2017-09-10 20:42
  • 276

HDU 1254 推箱子 解题报告

HDU 1254的解题报告
  • lawk97
  • lawk97
  • 2016-09-05 10:17
  • 393

杭电ACM1800解题报告

Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1730...
  • Aqin556
  • Aqin556
  • 2016-07-27 11:12
  • 523

noi2016解题报告

D1T1: 首先转化成统计AA型字符串有几种。 st[i]表示从i位置开始的AA型字符串有几个,ed[i]表示到i结束的有几个。 ans=∑st[i]*ed[i-1] 然后枚举A的长度L(AA长度的一半),i=k*L,j=(k+1)*L 观察x=lcp(i,j)和y=lcs(i-1,j-1...
  • wzf_2000
  • wzf_2000
  • 2017-05-21 19:38
  • 528

C语言解题报告模板

问题及代码:/* Copyright (c) 2014, 烟台大学计算机学院 All rights reserved. 文件名称:test.cpp 作 者:贺利坚 完成日期:2016年 10 月 x 日 版 本 号:v1.0 题目描述  计算并输出它们串联电阻值 输入 ...
  • sxhelijian
  • sxhelijian
  • 2016-09-17 11:10
  • 785

NOIP2017普及组题解

1【分析】 直接输出a∗0.3+b∗0.2+c∗0.5a*0.3+b*0.2+c*0.5即可,代码不给了。2【分析】 有2种做法,第一种是求出10x10^x,然后把每个书的号码模上一下,判断和y是否相等;第二种是用字符串,copy出后x个字符和y比较。3【分析】
  • qq_31640513
  • qq_31640513
  • 2017-11-11 19:02
  • 1902

HDU1254 推箱子 BFS+优先队列

/* 箱子和人共同组成一个状态,用node来记录状态 使用优先队列,是因为只有箱子移动,记数才+1,并不是每次都+1, 从队列中选择记数最小的,进行下一步搜索 只使用优先队列不能保证结果是最小。 因为两个记数相同的状态,下一步的记数不一定相同 使用flag避免重复计算 */ #include #i...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2011-12-31 13:41
  • 1008

POJ 1276 解题报告

百题纪念下。 这道题是多重背包问题。又回顾了下崔添翼大神的背包九讲。当然最终还是参考了discuss上面一位同学的实现:http://poj.org/showmessage?message_id=340485。他的代码确实非常清楚。 1276 Accepted 524K 3...
  • thestoryofsnow
  • thestoryofsnow
  • 2014-12-15 08:46
  • 703
    个人资料
    • 访问:175257次
    • 积分:3640
    • 等级:
    • 排名:第10664名
    • 原创:187篇
    • 转载:1篇
    • 译文:0篇
    • 评论:25条
    最新评论