首页 > 其他分享 > 9月杂题题解

9月杂题题解

时间:2023-09-08 16:25:23浏览次数:40  
标签:limits RR leq int 题解 sum cdot 杂题

arc124_e

一种方案的权值为 \(\prod\limits_{1\leq i\leq n} b_i\),考虑其组合意义,就是每个人在自己最终的球中选一个。

可以发现要么拿自己原来的球,要么拿上一个人传来的球。

定义状态:

\(f(i,0)\) 为第 \(i\) 个人拿自己的球,考虑前 \(i-1\) 个人的答案。

\(f(i,1)\) 为第 \(i\) 个人拿上个人的球,考虑前 \(i\) 个人的答案。

注意 \(f(i,0)\) 要受 \(i\) 传球的影响,故还不能考虑第 \(i\) 个人的答案。

转移:

定义 \(s_1(n)=\sum\limits_{1\leq i\leq n} i\),\(s_2(n)=\sum\limits_{1\leq i\leq n} i^2\)。

\(f(i+1,0)=f(i,0) \cdot s1(a_i)+f(i,1) \cdot (a_i+1)\)。

\(s1(a_i)\) 是考虑第 \(i\) 个人

保留了多少球,后面那一坨 \((a_i+1)\) 是考虑传球的方案数。

\(f(i+1,1)=f(i,0)\sum\limits_{1\leq x\leq a_i}(x\cdot (a_i-x))+f(i,1)\cdot s1(a_i)\)。

转化一下:

\(f(i+1,1)=f(i,0)\cdot (a_i\cdot s_1(a_i)-s_2(a_i))+f(i,1)\cdot s1(a_i)\)。

两坨都是枚举传了多少球给第 \(i+1\) 个人选,只是前面要乘上第 \(i\) 个人的贡献。

dp 部分基本结束,但还有两个问题。

  • 处理重复答案。

如果每个人往后传相同个数的球,就相当于没传,即只要每个人都往后面传了球,就一定会产生重复答案。

所以考虑将答案减去每个人都往后传球产生的答案。

在 \(f(i+1,0)=f(i,0) \cdot s1(a_i)+f(i,1) \cdot (a_i+1)\) 转移时将 \(a_i-1\),即可钦定每个人必须往后传球。

  • 断环为链

只需要初值 \(f_{1,0}=1\) 和 \(f_{1,1,}=1\) 分别求一次即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e6+5,p=1e9+7,inv6=166666668;
int n,a[N],f[N][2];
int s1(int n) {return n*(n+1)/2%p;}
int s2(int n) {return n*(n+1)%p*(2*n+1)%p*inv6%p;}

int calc(int op1,int op2)
{
    memset(f,0,sizeof(f));
    f[1][0]=op1,f[1][1]=!op1;
    for(int i=1;i<=n;i++)
    {
        int j=i%n+1;
        f[j][0]=(f[i][0]*s1(a[i]-op2)%p+f[i][1]*(a[i]+1-op2)%p)%p;
        f[j][1]=(f[i][0]*((a[i]*s1(a[i])-s2(a[i]))%p+p)%p+f[i][1]*s1(a[i])%p)%p;
    }
    return f[1][!op1]-1;// -1 因为初值 f[1][0] or f[1][1] 赋为了 1,但这是不存在的方案,需要减去。
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    cout<<((calc(0,0)+calc(1,0)-calc(0,1)-calc(1,1))%p+p)%p;
}

P4528 [CTSC2008]图腾

参考了第一篇题解。写这篇主要是想自己重新推一遍。

规定 abcd 为 \(1\leq A < B < C < D \leq n\) 且 \(y_A,y_B,y_C,y_D\) 的排名为 \(a,b,c,d\) 的方案数。如果 abcd 中某个值为 x,则排名任意。

那么题目就是求 1324-1243-1432

思考一下发现直接统计是不可能的,考虑有哪几种情况容易统计。

  • 1234
  • 只限制了一个值的,比如 1xxx

然后其他好像稍微难一点,但发现限制了两个值的好像也能统计。

考虑把答案拆开:

1324-1243-1432
=(1x2x-1423)-(12xx-1234)-(14xx-1423)
=1x2x-12xx-14xx+1234
=1x2x-1xxx+13xx+1234

设 \(L_i\) 为 \(i\) 左侧小于 \(y_i\) 的个数,\(R_i\) 为右侧小于 \(y_i\) 的个数,\(RR_i\) 为右侧大于 \(y_i\) 的个数。

不难发现 \(R_i=y_i-1-L_i,RR_i=n-i-R_i\)。

\(L_i\) 用树状数组维护即可。

讨论四种情况:

1x2x

枚举 2 的位置 \(i\),右边显然有 \(RR_i\) 种选择。

设左边俩位置为 \(j,k\),则 \(j < k < i,y_j < y_i < y_k\)。

若只考虑 \(y_j < y_i,j<i,k<i\),则有 \(L_i \cdot (i-1)\) 种,需要减去 \(j \geq k\) 和 \(j<k,y_k < y_i\) 的情况。

\(j<k,y_k<y_i\) 的方案就是 \(C_{L_i}^{2}\)。

每个 \(j\) 对应 \(k\) 选在 \([1,j]\) 位置的时候不合法,总方案 \(\sum\limits_{1 \leq j <i,y_j < y_i} j\)。

1xxx

枚举 1 的位置 \(i\),右边随便选 3 个比当前位置大的,\(\sum\limits C_{RR_i}^{3}\)

13xx

枚举 3 的位置 \(i\),选 4 的方案为 \(RR_i\)。

设 1,2 位置分别为 \(j,k\),则 \(j < i < k,y_j < y_k < y_i\)。

还是只考虑 \(y_j < y_i\),则有 \(L_i \cdot (y_i-1)\),需要减去 \(k \leq i,y_k<y_i\) 和 \(y_k \leq y_j\)。

\(k \leq i,y_k<y_i\) 方案还是 \(C_{L_i}^{2}\)。

每个 \(j\) 对应 k 选在 \(y \leq y_j\) 的位置时不合法,总方案 \(\sum\limits_{1 \leq j <i,y_j < y_i} y_j\)。

1234

枚举 3 的位置 \(i\),选 4 的方案为 \(RR_i\)。

设 2 的位置为 \(j\),则选 1 的方案为 \(L_j\),选 1,2 的方案求个和就可以了。

由于是对 \(2^{24}\) 取模,可以考虑开无符号整型,最后再保留后 23 位。

于是就冲到了最优解

#include<bits/stdc++.h>
#define int unsigned
using namespace std;

const int N=2e5+5;
int n,ans,a[N],c[N],L[N],R[N],RR[N];
void upd(int x,int v) {for(;x<=n;x+=x&-x) c[x]+=v;}
int sum(int x) {int r=0;for(;x;x^=x&-x) r+=c[x];return r;}
int C2(int n) {return 1ll*n*(n-1)/2;}

char buf[1<<15],*p1=buf,*p2=buf;
#define nc() (p1==p2&&(p2=buf+fread(p1=buf,1,1<<15,stdin),p1==p2)?-1:*p1++)
inline int rd()
{
    int x=0,f=1;char c=nc();
    for(;!isdigit(c);c=nc()) if(c=='-') f=-1;
    for(; isdigit(c);c=nc()) x=(x<<3)+(x<<1)+(c^48);
    return x*f;
}

signed main()
{
    n=rd();
    for(int i=1;i<=n;i++) a[i]=rd();
    for(int i=1;i<=n;i++) L[i]=sum(a[i]),R[i]=a[i]-L[i]-1,RR[i]=n-R[i]-i,upd(a[i],1);
    memset(c,0,sizeof(c));upd(a[2],L[2]);
    for(int i=3;i<=n;i++) ans+=sum(a[i])*RR[i],upd(a[i],L[i]); //1234
    for(int i=1;i<=n;i++) ans-=1ll*RR[i]*(RR[i]-1)*(RR[i]-2)/6; // 1xxx
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++) ans+=((L[i]*(i-1)-C2(L[i])-sum(a[i]))*RR[i]),upd(a[i],i); // 1x2x
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++) ans+=(L[i]*(a[i]-1)-C2(L[i])-sum(a[i]))*RR[i],upd(a[i],a[i]); // 13xx
    cout<<(ans&16777215);
}

标签:limits,RR,leq,int,题解,sum,cdot,杂题
From: https://www.cnblogs.com/spider-oyster/p/17687866.html

相关文章

  • nvm有下载版本,切换版本成功,node -v还是切换前的版本问题解决
    是因为在下载nvm之前,电脑中的node版本已经存在了,所以需要将之前的node版本全部清楚干净!卸载node之前请node-v查看一下现在的版本,记住这个版本,切记切记!!!!!控制面板中卸载node.;卸载已安装过的NVM;没装过NVM的就仅仅卸载node去环境变量里面看一下有没有跟nvm和node相关的东西了,有的话全......
  • 【题解】CF1854A2 Dual (Hard Version)
    你考虑我们A1只需要通过自加凑一个最大的数,然后将所有的数都变成正数,最后做一次前缀和即可。(不懂可以看看落谷题解)好,我们现在去看HardVersion的\(31\)次操作怎么分配:前缀和(全为正)/后缀和(全为负)——\(19\)次还剩下\(12\)次,不知道该怎么做。我们的目标便变......
  • 题解 CF1787G【Colorful Tree Again】
    problem贼眉鼠眼有一棵\(N\)个节点的树,这棵树很特殊,每条边都有边权和颜色。果宝特攻会不定时来进攻贼眉鼠眼。具体地,在前\(Q\)个时刻,在每个时刻,会发生以下两个事件之一:果宝特攻摧毁了树上的一个节点\(u\)。贼眉鼠眼修复了树上的一个节点\(u\)。定义一条简单路径......
  • 国标GB28181视频监控EasyGBS接入大量通道时,创建角色接口未响应的问题解决方法
    EasyGBS是一款基于国标GB28181协议的视频云服务平台。它支持多路设备同时接入,并能将视频流以RTSP、RTMP、FLV、HLS、WebRTC等格式分发到多个平台和终端。该平台提供了视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级联等功能。在视频能力方面,GB28181视频监......
  • CF868E Policeman and a Tree 题解
    Description.树上警察抓小偷。一名警察速度为\(1\),多名小偷速度为\(+\infty\),问多长时间抓到。树点数\(\le50\)Solution.首先不可能抓不到。其次步数不可能超过\(2500\)(每抓完一个小偷走一遍全图)。这启发我们可以直接暴搜每一步,并记忆化。如果状态设为当前在\(x\),那......
  • 【题解】《PTA-Python程序设计》题目集分享
    第1章-1从键盘输入两个数,求它们的和并输出(30分)本题目要求读入2个整数A和B,然后输出它们的和。输入格式:在一行中给出一个被加数在另一行中给出一个加数输出格式:在一行中输出和值。输入样例:在这里给出一组输入。例如:18-48输出样例:在这里给出相应的输出。例如:......
  • 题解 P8165 [eJOI2021] AddK
    不知道为什么这道题还没有题解。Solution对于操作\(1\),由于\(K\le10\),直接暴力单点修改即可。而操作\(2\)的询问,不难发现,最后结果的呈现形式是\[1\timesA_l+2\timesA_{l+1}+3\timesA_{l+2}+...+3\timesA_{r-2}+2\timesA_{r-1}+1\timesA_r\]其中中间可能有一段系数......
  • SP8177 题解
    2023-09-0111:29:13solution题意:每次询问\([l,r]\)内有多少个数满足可以被所有非\(0\)数位整除。思路看到这个数据范围和题目描述,显然是数位dp。因为\(1\sim9\)的最小公倍数是\(2520\),并且\(2520\)是其他所有\(1\sim9\)子集的最小公倍数的倍数,所以我们只需要......
  • CF402D 题解
    2023-09-0418:42:46solution不难想到我们要先记录一下每一位的前缀\(\gcd\),我们发现我们选择一位的前缀\(\gcd\)除掉以后,前缀\(\gcd\)会变为\(1\)并且会导致这位之后的\(\gcd\)全部为\(1\)。所以每一位只能选择一次,并且我们从后往前扫肯定比从前往后扫要更优。我们......
  • wzOI 2023.8.31 题解
    2023-09-0115:59:41$$前言$$太菜了,第一题都打成那样了没发现是MST,第三题数据范围没有很仔细看,以为是乱搞(组合之类的)题就直接跳了。不得不说这次比赛题目的一些思路还是挺妙的,一些想法确实我这种成分想不太到。$$A$$$$题意$$给出了\(m\)个可以查询的区间\([L_i,R_i]\)......