Melancholy 题解

题目是保密的,所以我只写题解了,先%曹力升大爷一发。
ci,j 表示前 i 个数,取j个数乘起来的和。
比如 {a1,a2,a3} 这个集合, c3,2=a1a2+a1a3+a2a3 ,也就是说我们求出来的答案还要乘一个阶乘就是最终答案了。
考虑求区间 [l,r] k 个的答案getAns(l,r,k)
getAns(l,r,k)=cr,kcl1,ki=1k1(getAns(l,r,ki)×cl1,i)
前面两项应该很显然,先减掉因子都不在 [l,r] 里面的,然后那个和式处理的就是因子两边都有的情况,先枚举 l 左边的因子有多少个,然后l右边的就有 ki 个,脑补一下发现那两个东西是可以乘起来的。(乘法分配律。。。。(大雾 %zqf) )
还有一个蛋疼的东西,那就是处理最小值,还是一样的,先找出最小值的位置,线段,RMQ什么的都可以。
然后就是要减掉因子包含最小值的乘积啦,记这些乘积的和为 F ,最小值的位置为p
F=i=0k1(getAns(l,p1,i)×getAns(p+1,r,ki1)×min)
减掉 F <script type="math/tex" id="MathJax-Element-17">F</script>,乘个阶乘,完事。
今天月考雪崩。。。。。。(%zqf)
之前写了个线段树,超时了,改了RMQ还超时,后来发现数组开小了,取六个数数组开成了6也是醉了,开7好吧。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define X first
#define Y second
#define MP make_pair
#define pii pair<int,int>
#define LL unsigned int
#define pll pair<LL,LL>
#define DEBUG(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
const int MAXN=1e5+10,MAXNODE=4*MAXN;
void Read(LL& x)
{
    x=0;bool flag=0;char c;
    while(c=getchar())
    {
        if(c>='0'&&c<='9')x*=10,x+=c-'0',flag=1;
        else if(flag)break;
    }
}
template <typename T>
void write(T v) {
    static int st[30];
    int tp = 0;
    T t = v;
    if(t < 0) 
        putchar('-'), t = -t;
    while(t) 
        st[++tp] = t % 10, t /= 10;
    if(tp == 0)     
        putchar('0');
    while(tp) 
        putchar(st[tp--] + '0');
}
LL zqf,c[MAXN][7],n,q,l,r,k,fac[7]={0,1,2,6,24,120,720},f[32][MAXN],t[32][MAXN];
pll planet[MAXN];
void pre()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=min(n,(LL)6);j++)
        {
            if(j==(LL)1)
                c[i][j]=(c[i-1][j]+planet[i].Y);
            else
                c[i][j]=(c[i-1][j]+(planet[i].Y*c[i-1][j-1]));
        }
    }
    for(int i = 1; i <= n; i++)
        f[0][i] = planet[i].Y, t[0][i] = i;

    for(int i = 1; (1 << i) <= n; i++) {
        for(int j = 1; j + (1 << i) - 1 <= n; j++) {
            if(f[i - 1][j] <= f[i - 1][j + (1 << (i-1))]) {
                f[i][j] = f[i - 1][j]; t[i][j] = t[i - 1][j];
            }
            else {
                f[i][j] = f[i - 1][j + (1 << (i-1))]; t[i][j] = t[i - 1][j + (1 << (i-1))];  
            }
        }
    }
}
pair<LL, LL> RMQ(LL L, LL R) {
    LL k = 0;
    while(L + (1 << (k+1)) - 1 <= R)
        k++;
    if(f[k][L] <= f[k][R - (1 << k) + 1]) {
        return MP(f[k][L], t[k][L]);
    }
    return MP(f[k][R - (1 << k) + 1], t[k][R - (1 << k) + 1]);
}
LL getAns(int l,int r,int k)
{
    LL ans=c[r][k]-c[l-1][k];
    if(k<=0)return 1;
    if(k==1)
    {
        ans=c[r][k]-c[l-1][k];
        return ans;
    }
    for(int i=1;i<=k-1;i++)
    {
        ans-=c[l-1][i]*getAns(l,r,k-i);
    }
    return ans;
}
int main()
{
    freopen("melancholy.in","r",stdin);
    freopen("melancholy.out","w",stdout);
    Read(n);Read(q);
    for(int i=1;i<=n;i++)Read(planet[i].X);
    for(int i=1;i<=n;i++)Read(planet[i].Y);
    sort(planet+1,planet+1+n);
    pre();
    while(q--)
    {
        Read(l);
        Read(r);
        Read(k);
        l=lower_bound(planet+1,planet+1+n,MP(l,(LL)0))-planet;
        r=upper_bound(planet+1,planet+1+n,MP(r,(LL)1e9+8))-planet-1;
        if(r<l)
        {
            printf("0\n");
            continue;
        }   
        LL ans=getAns(l,r,k);
        pll _min((LL)1e9+8,(LL)1e9+8);
        _min=RMQ(l, r);
        for(int i=0;k!=1&&i<=k-1;i++)
        {
            ans-=((getAns(l,_min.Y-1,i)*getAns(_min.Y+1,r,k-i-1))*_min.X);
        }
        if(k==1)
            ans-=_min.X;
        cout<<(LL)fac[k]*ans<<endl;
    }
    int p=1;
}
以下是截至2021年10月的全球动漫评分排行榜前100名: 1.《Fullmetal Alchemist: Brotherhood》 2.《Steins;Gate》 3.《Your Lie in April》 4.《Hunter x Hunter (2011)》 5.《Gintama》 6.《Haikyuu!!》 7.《Attack on Titan》 8.《Code Geass: Lelouch of the Rebellion》 9.《Clannad: After Story》 10.《Death Note》 11.《One Punch Man》 12.《Jojo's Bizarre Adventure》 13.《Cowboy Bebop》 14.《Baccano!》 15.《Neon Genesis Evangelion》 16.《Spirited Away》 17.《Monogatari Series》 18.《Shigatsu wa Kimi no Uso》 19.《Toradora!》 20.《Tengen Toppa Gurren Lagann》 21.《K-On!》 22.《The Melancholy of Haruhi Suzumiya》 23.《Fate/Zero》 24.《One Piece》 25.《Rurouni Kenshin: Trust and Betrayal》 26.《Dragon Ball Z》 27.《Legend of the Galactic Heroes》 28.《Hajime no Ippo》 29.《Ghost in the Shell: Stand Alone Complex》 30.《Nana》 31.《Samurai Champloo》 32.《Great Teacher Onizuka》 33.《Anohana: The Flower We Saw That Day》 34.《Kimi no Na wa.》 35.《Kara no Kyoukai》 36.《Psycho-Pass》 37.《Bakemonogatari》 38.《No Game No Life》 39.《Nichijou》 40.《Usagi Drop》 41.《Kill la Kill》 42.《Akira》 43.《Durarara!!》 44.《Tatami Galaxy》 45.《Katanagatari》 46.《Berserk》 47.《Princess Mononoke》 48.《Higurashi no Naku Koro ni》 49.《Soul Eater》 50.《Black Lagoon》 51.《Naruto》 52.《Fairy Tail》 53.《Kimi ni Todoke》 54.《Serial Experiments Lain》 55.《Kuroko no Basket》 56.《Chihayafuru》 57.《Hyouka》 58.《Bleach》 59.《Sakamichi no Apollon》 60.《Golden Time》 61.《Love Live! School Idol Project》 62.《Cardcaptor Sakura》 63.《Gekkan Shoujo Nozaki-kun》 64.《Full Metal Panic!》 65.《Mobile Suit Gundam: Iron-Blooded Orphans》 66.《K-On! Movie》 67.《Kizumonogatari》 68.《Re:Zero kara Hajimeru Isekai Seikatsu》 69.《Shirobako》 70.《Yahari Ore no Seishun Love Comedy wa Machigatteiru.》 71.《Darker than Black》 72.《Honey and Clover》 73.《Zankyou no Terror》 74.《Usagi Drop Specials》 75.《Mahou Shoujo Madoka★Magica》 76.《Bungou Stray Dogs》 77.《Kara no Kyoukai 5: Mujun Rasen》 78.《K-On! 2》 79.《Toaru Kagaku no Railgun》 80.《Kimi ga Nozomu Eien》 81.《Grisaia no Kajitsu》 82.《Gochuumon wa Usagi Desu ka?》 83.《Shinsekai yori》 84.《Nodame Cantabile》 85.《Bungou Stray Dogs 2nd Season》 86.《Made in Abyss》 87.《Gin no Saji》 88.《Ranma ½》 89.《K-On!!》 90.《Sword Art Online》 91.《Hibike! Euphonium》 92.《Nisekoi》 93.《K-On!: Live House!》 94.《K-On!: Keikaku!》 95.《D-Frag!》 96.《K-On!: Ura-ON!》 97.《K-On!: College》 98.《K-On!: Fude Pen - Boru Pen》 99.《K-On!: Plan!》 100.《K-On!: Movie - Wonderful♪》
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值