2.10模拟总结

文章目录

  • 前言
  • 题目解析
    • 随机减法(calculate)
    • 大图书馆(bibliotheca)
    • 子串选取 (substr)
  • 代码
    • T1
    • T2
    • T3
  • 总结

前言

200pts
40+100+60
rnk3
拿到牌勒嘿嘿嘿(脑补流口水黄豆)

T3两个log想在ybt的机子上过5e5确实是奢望了。
把串反过来改一改dp定义看出题解的那个性质就可以拿掉那个log,有些可惜。
但毕竟没有挂分,还是不错的=v=

题目解析

随机减法(calculate)

乍一看这个题就感觉在 OI-wiki 上见过。
但是就记得在OIwiki上有了,属于那个章节,怎么做统统不记得…
于是就只配打暴力了…
其实也看出了卷积,但那个东西需要再变成封闭形式化一下,必然还是脱离不了 O(k)O(k)O(k) 的复杂度。
而且看到 1e9+71e9+71e9+7 这种模数本能的觉得不是多项式…
而且为啥我的dp转移和题解又不一样,难看的很难化了…

题目的贡献其实也就是 ∏ai\prod a_iai变化量
即:
∏ai−∏ai′\prod a_i-\prod a_i'aiai
前面已知,考虑如何算后面的贡献。

设每个数的删除次数为 d1...nd_{1...n}d1...n,则有:
ans=∑∑di=kk!∏(ai−di)∏di!ans=\sum_{\sum d_i=k}\frac{k!\prod(a_i-d_i)}{\prod d_i!}ans=di=kdi!k!(aidi)
=k!∑∑di=k∏(ai−di)∏di!=k!\sum_{\sum d_i=k}\frac{\prod(a_i-d_i)}{\prod d_i!}=k!di=kdi!(aidi)
设后面这个东西的生成函数为 GGG,那么它其实就是 nnn 个形如 Fp=∑i=0∞(ap−i)xii!F_p=\sum_{i=0}^{\infty}\dfrac{(a_p-i)x^i}{i!}Fp=i=0i!(api)xi 的EGF卷起来。
然后把这个 FFF 化一下:
Fp=∑i=0∞(ap−i)xii!F_p=\sum_{i=0}^{\infty}\dfrac{(a_p-i)x^i}{i!}Fp=i=0i!(api)xi
=ap⋅∑i=0∞xii!−∑i=1∞xi(i−1)!=a_p\cdot\sum_{i=0}^{\infty}\dfrac{x^i}{i!}-\sum_{i=1}^{\infty}\dfrac{x^i}{(i-1)!}=api=0i!xii=1(i1)!xi
=ap⋅∑i=0∞xii!−∑i=0∞xi+1i!=a_p\cdot\sum_{i=0}^{\infty}\dfrac{x^i}{i!}-\sum_{i=0}^{\infty}\dfrac{x^{i+1}}{i!}=api=0i!xii=0i!xi+1
=(ap−x)⋅∑i=0∞xii!=(a_p-x)\cdot\sum_{i=0}^{\infty}\dfrac{x^i}{i!}=(apx)i=0i!xi
=(ap−x)⋅ex=(a_p-x)\cdot e^x=(apx)ex
那么就有:
G=∏p=1nFpG=\prod_{p=1}^nF_pG=p=1nFp
G=∏p=1n((ap−x)ex)G=\prod_{p=1}^n((a_p-x)e^x)G=p=1n((apx)ex)
G=(∏p=1n(ap−x))enxG=(\prod_{p=1}^n(a_p-x))e^{nx}G=(p=1n(apx))enx
前面的 ∏p=1n(ap−x)\prod_{p=1}^n(a_p-x)p=1n(apx) 可以暴力背包求解,设得到的函数为 fff
那么就有:
G=(∑i=0∞fixi)×(∑i=0∞(nx)ii!)G=(\sum_{i=0}^{\infty}f_ix^i)\times (\sum_{i=0}^{\infty}\frac{(nx)^i}{i!})G=(i=0fixi)×(i=0i!(nx)i)
那么最终得到的期望就是 GGG 的第 kkk 项乘上 k!k!k! 再除以 nkn^knk,即:
E=∑i=0fi⋅ki‾niE=\sum_{i=0}\frac{f_i\cdot k^{\underline i}}{n^i}E=i=0nifiki
答案就是:
∏ai−E\prod a_i-EaiE
总复杂度 O(n2)O(n^2)O(n2)

大图书馆(bibliotheca)

被A穿了的一道题…
15提交14AC一个96就离谱…
说实话我感觉这道题没有那么简单啊…
网络流显而易见,建图方法五花八门。
我的做法是转化为k重线段覆盖集问题然后直接做。
题解的做法把“不买书” 转化为一次买书和一次“卖书”,然后回溯连边,也是挺不错的。

子串选取 (substr)

挺可惜的一道题,差一点点。
感觉很经典的一道字符串题。
似乎必然是要SAM的,所以直接往那边想了。
然后又无脑的上了线段树合并 endpos 集合的套路。
然后找找性质二分搞吧搞吧就两个log了。
但是5e5两只log是过不去的…

先把串反过来,设计 dpidp_idpi 表示以 iii 结尾的最大答案。
然后就有一个非常优秀的性质:fi≤fi−1+1f_i\le f_{i-1}+1fifi1+1
较为显然,把 fif_ifi 的一种方案每个串删去结尾,就能得到答案为 fi−1f_{i}-1fi1 且以 i−1i-1i1 结尾的方案。
有了这个之后每次就不用二分 dp 值了,直接从上一个继承来然后不断暴力check,不合法就减减即可,有点类似于后缀数组求 heightheightheight
这样就把第二只 log 拿掉了,复杂度变为单 log,可以通过。

代码

T1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=5e3+100;
const int B=150;
const int inf=2e9;
const int mod=1e9+7;int n,m;int a[N];
ll f[2][N],c[5];
inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}signed main(){freopen("calculate.in","r",stdin);freopen("calculate.out","w",stdout);//printf("%d\n",sizeof(t)/1024/1024);n=read();m=read();ll ans=1;for(int i=1;i<=n;i++) a[i]=read(),ans=ans*a[i]%mod;int now=1,pre=0;f[now][0]=1;for(int k=1;k<=n;k++){c[0]=a[k];c[1]=mod-1;swap(pre,now);memset(f[now],0,sizeof(f[now]));for(int i=0;i<=(k-1);i++){for(int j=0;j<=1;j++){f[now][i+j]=(f[now][i+j]+f[pre][i]*c[j])%mod;}}}ll E(0),bas=1,mi=1,ni=ksm(n,mod-2);for(int i=0;i<=n;i++){if(i) bas=bas*(m-i+1)%mod,mi=mi*ni%mod;E=(E+f[now][i]*bas%mod*mi)%mod;}printf("%lld\n",(ans+mod-E)%mod);return 0;
}
/*
12
abcdbabcabba
*/

T2

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=4e3+100;
const int B=150;
const int inf=2e9;
const int mod=998244353;int n,m;
int ww=1e6+1;int s,t,tot;
struct node{int to,nxt,cap,w;
}p[N*N];
int fi[N],cur[N],cnt;
inline void addline(int x,int y,int c,int w){p[++cnt]=(node){y,fi[x],c,w};fi[x]=cnt;return;
}
inline void add(int x,int y,int c,int w){addline(x,y,c,w);addline(y,x,0,-w);//printf("  %d->%d cap=%d w=%d\n",x,y,c,w);return;
}
int dis[N];
bool vis[N];
queue<int>q;
bool spfa(){fill(dis,dis+1+tot,inf);dis[s]=0;q.push(s);vis[s]=1;while(!q.empty()){int now=q.front();q.pop();vis[now]=0;for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(!p[i].cap||dis[to]<=dis[now]+p[i].w) continue;dis[to]=dis[now]+p[i].w;if(!vis[to]){vis[to]=1;q.push(to);}}}return dis[t]<inf;
}
int flow,cost;
int dfs(int x,int lim){if(!lim||x==t){cost+=lim*dis[t];return lim;}if(vis[x]) return 0;vis[x]=1;int res(0);for(int &i=cur[x];~i;i=p[i].nxt){int to=p[i].to;if(dis[to]!=dis[x]+p[i].w) continue;int add=dfs(to,min(lim,p[i].cap));res+=add;lim-=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;}if(!res) dis[x]=-1;vis[x]=0;return res;
}
void dinic(){flow=cost=0;int tmp(0);while(spfa()){while((tmp=dfs(s,inf))) flow+=tmp;}return;
}struct line{int l,r,val;
}l[N];
int pre[N],lst[N];
int a[N],c[N],ans;signed main(){freopen("bibliotheca.in","r",stdin);freopen("bibliotheca.out","w",stdout);//printf("%d\n",sizeof(p)/1024/1024);memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++) c[i]=read();for(int i=1;i<=n;i++){pre[i]=lst[a[i]];ans+=c[a[i]];lst[a[i]]=i;}for(int i=1;i<=n;i++){int x=lst[i];while(pre[x]){l[++tot]=(line){pre[x],x,c[i]};x=pre[x];}}for(int i=1;i<=n;i++) l[++tot]=(line){i,i,ww};ans+=n*ww;int num=tot;tot<<=1;s=++tot;t=++tot;int o=++tot;add(s,o,m,0);for(int i=1;i<=num;i++){//printf("i=%d (%d %d)\n",i,l[i].l,l[i].r);add(o,i,1,0);add(i,i+num,1,-l[i].val);add(i+num,t,1,0);for(int j=1;j<=num;j++){if(i==j) continue;if(l[j].l>=l[i].r) add(i+num,j,1,0);}}dinic();printf("%d\n",ans+cost);return 0;
}
/*
9 2
2 1 2 1 2 3 1 2 3
1 2 3 0 0 0 0 0 0
*/

T3

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=1e6+100;
const int B=150;
const int inf=2e9;
const int mod=998244353;int n,m;struct tree{int ls,rs,sum,suf;
};
struct Segment_Tree{#define mid ((l+r)>>1)tree tr[N*30];int tot;inline int copy(int x){tr[++tot]=tr[x];return tot;}inline void pushup(int k){tr[k].sum=tr[tr[k].ls].sum+tr[tr[k].rs].sum;tr[k].suf=max(tr[tr[k].ls].suf,tr[tr[k].rs].suf);return;}void upd(int &k,int l,int r,int p,int w){if(!k) k=copy(0);if(l==r){tr[k].sum+=w;tr[k].suf=l;return;}if(p<=mid) upd(tr[k].ls,l,mid,p,w);else upd(tr[k].rs,mid+1,r,p,w);pushup(k);}int merge(int x,int y,int l,int r){if(!x||!y) return x|y;int now=copy(x);tr[now].ls=merge(tr[now].ls,tr[y].ls,l,mid);tr[now].rs=merge(tr[now].rs,tr[y].rs,mid+1,r);pushup(now);return now;}int findsuf(int k,int l,int r,int x,int y){if(x>y) return 0;if(!k) return 0;if(x<=l&&r<=y) return tr[k].suf;int res=0;if(y>mid) res=max(res,findsuf(tr[k].rs,mid+1,r,x,y));if(res) return res;if(x<=mid) res=max(res,findsuf(tr[k].ls,l,mid,x,y));return res;}#undef mid
}t;
int rt[N];int fa[N],len[N],tr[N][26],tot=1,lst=1,state[N];
inline void ins(int c,int pos){c-='a';int cur=++tot,p=lst;lst=tot;state[pos]=cur;t.upd(rt[cur],1,n,pos,1);len[cur]=len[p]+1;for(;p&&!tr[p][c];p=fa[p]) tr[p][c]=cur;if(!tr[p][c]) fa[cur]=1;else{int q=tr[p][c];if(len[q]==len[p]+1) fa[cur]=q;else{int nq=++tot;len[nq]=len[p]+1;fa[nq]=fa[q];for(int i=0;i<26;i++) tr[nq][i]=tr[q][i];fa[cur]=fa[q]=nq;for(;p&&tr[p][c]==q;p=fa[p]) tr[p][c]=nq;}}return;
}
vector<int>v[N];
int pl[N][20];
void dfs(int x){pl[x][0]=fa[x];//printf("i=%d k=0 pl=%d\n",i,pl[i][0]);for(int k=1;pl[x][k-1];k++){pl[x][k]=pl[pl[x][k-1]][k-1];//printf("i=%d k=%d mid=%d pl=%d\n",i,k,pl[i][k-1],pl[i][k]);}for(int to:v[x]){dfs(to);rt[x]=t.merge(rt[x],rt[to],1,n);}return;
}
void build(){for(int i=2;i<=tot;i++) v[fa[i]].push_back(i);dfs(1);return;
}
inline int jump(int x,int l){//printf("    jump: x=%d L=%d\n",x,l);for(int k=19;k>=0;k--){//if(pl[x][k]) printf("      k=%d pl=%d len=%d\n",k,pl[x][k],len[pl[x][k]]);if(len[pl[x][k]]>=l) x=pl[x][k];}return x;
}char s[N],ss[N];
int dp[N],mx,ans;
bool check(int x,int L){//printf("check: x=%d L=%d\n",x,L);int s=jump(state[x],L-1);int pl=t.findsuf(rt[s],1,n,1,x-L);//printf("  cutpre: s=%d (%d %d) pl=%d state=%d\n",s,1,x-L,pl,state[x]);if(dp[pl]>=L-1) return true;	if(x>1){s=jump(state[x-1],L-1);pl=t.findsuf(rt[s],1,n,1,x-L);//printf("  cutsuf: s=%d (%d %d) pl=%d state=%d\n",s,1,x-L,pl,state[x-1]);if(dp[pl]>=L-1) return true;		}return false;
}
void DP(){for(int i=1;i<=n;i++){dp[i]=dp[i-1]+1;while(dp[i]>1&&!check(i,dp[i])) --dp[i];ans=max(ans,dp[i]);//printf("i=%d dp=%d\n\n",i,dp[i]);}return;
}
signed main(){freopen("substr.in","r",stdin);freopen("substr.out","w",stdout);//printf("%d\n",sizeof(t)/1024/1024);n=read();scanf(" %s",ss+1);for(int i=1;i<=n;i++) s[i]=ss[n-i+1];//printf("%s\n",s+1);for(int i=1;i<=n;i++) ins(s[i],i);//for(int i=1;i<=tot;i++) printf("i=%d fa=%d len=%d\n",i,fa[i],len[i]);build();DP();printf("%d\n",ans);return 0;
}
/*
12
abcdbabcabba
*/

总结

感觉最近不再像一开始那样疯狂挂分了。
明天就要上学校了,加油!awa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABP VNext 微服务演示,项目状态和路线图

在ABP vNext上的第一个公告之后,我们对代码库进行了很多改进(GitHub存储库上的1100多次提交).我们已经创建了功能,示例,文档等等.在这篇文章中,我想告诉你一些新闻和项目的状态.ABP微服务演示解决方案ABP框架的主要目标之一是提供创建微服务解决方案的便利基础设施.我们一直在努…

加分二叉树

加分二叉树 题意&#xff1a; 给你一个数的中序表达式&#xff0c;然后一颗子树的分数左子树的分数*右子树的分数根的分数 给你所有点的分数&#xff0c;让你构造出分值最大的树&#xff0c;输出前序遍历 题解&#xff1a; 区间dp问题 设dp[i][j]表示中序遍历是w[i~j]的所有…

AtCoder ZONe Energy Programming Contest 题解

文章目录A - UFO InvasionB - Sign of FriendshipC - MAD TEAMD - Message from AliensE - SneakingF - Encounter and FarewellZONe Energy Programming ContestA - UFO Invasion 太简单了。 #include <cstdio> char ch[10] { Z, O, N, e }; char s[20];int main() {…

2.11模拟总结

前言 145&#xff08;175&#xff1f;&#xff09;pts 100450&#xff08;30&#xff1f;&#xff09; rnk11&#xff08;8&#xff1f;&#xff09; 之所以有括号是因为T3莫名其妙的TLE了&#xff1f; 考后我一模一样的码再交一遍30分就到手了… 应该不是我的问题吧&#xff…

[aspnetcore.apidoc]一款很不错的api文档生成工具

简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger最初我们也有在试用swagger&#xff0c;但总是有些感觉&#xff0c;感觉有点不满意&#xff0c;就但从api文档角度来说&#xff0c;从前后端文档沟通角度来讲apidoc的表现形式&#xff0c;要比swagger简单的多&…

【学习笔记】浅谈短小可爱的左偏树(可并堆)

文章目录左偏树左偏树的合并(merge)操作例题罗马游戏[Apio2012]dispatching[JLOI2015]城池攻占[Baltic2004]sequence左偏树 左偏树是一个堆&#xff0c;而且是一个可并堆&#xff0c;所以一定有权值的限制 以小根堆为例&#xff0c;那么必须满足节点权值小于左右儿子权值&…

2.12 模拟

文章目录前言题目解析染色计划&#xff08;color&#xff09;奇度边集&#xff08;edges&#xff09;猜拳游戏&#xff08;guess&#xff09;代码T1T2LCT整体二分总结前言 120pts 期望&#xff1a;4010020160 实际&#xff1a;406020120 rnk 9 我yue了。 怎么又是不可抗力性挂…

Acwing1069. 凸多边形的划分

Acwing1069. 凸多边形的划分 题意&#xff1a; 一个N个顶点的凸多边形&#xff0c;划分成N-2个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&#xff0c;试求所有三角形的顶点权值乘积之和至少为多少。 题解&#xff1…

徐磊(Devops):一名写了十几年代码但还没写够的程序员

徐磊&#xff08;Devops 社区领袖&#xff09;【个人介绍】徐磊&#xff0c;微软MVP&#xff08;微软最有价值专家&#xff0c;大中华区域社区技术总监&#xff0c;Devops 社区领袖&#xff09;&#xff0c;从事过网管、技术支持、网络、软件开发等工作&#xff0c;一名写了十几…

加强版[BZOJ#3483] SGU505 Prefixes and suffixes(询问在线版)

文章目录descriptionsolutioncode#3483. SGU505 Prefixes and suffixes&#xff08;询问在线版&#xff09;description 给定&#x1d45b;个字符串&#xff0c;有&#x1d45a;个询问。 每个询问给出两个字符串&#x1d460;1, &#x1d460;2&#xff0c;问&#x1d45b;个字…

AcWing 320. 能量项链

AcWing 320. 能量项链 题意&#xff1a; 题解&#xff1a; 和环形石头合并基本一样 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf("%s %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s0,w1;char c…

ERP不规范,同事两行泪

最近的很多次对外交流&#xff0c;都聊到了ERP建设的话题&#xff0c;并且无一例外的不那么让人省心&#xff0c;回想我这么多年走过的ERP坑坑路&#xff0c;在这里也写下经验和总结&#xff0c;希望能给正在或者即将走上ERP建设路的企业一些思考和帮助。导读1、几个瞎眼而普遍…

2.13模拟总结

文章目录前言题目解析最小划分&#xff08;divide&#xff09;进制路径&#xff08;base&#xff09;欧拉欧拉&#xff08;eular&#xff09;代码T1T2T3总结前言 day9 170pts 期望&#xff1a;10010020220 实际&#xff1a;701000170 rnk7 挂的分有点多qwq 分数要是得满就能拿…

Panasonic Programming Contest (AtCoder Beginner Contest 195) 题解

文章目录A - Health M DeathB - Many OrangesC - CommaD - Shipping CenterE - Lucky 7 BattleF - Coprime PresentPanasonic Programming Contest (AtCoder Beginner Contest 195)A - Health M Death 判断倍数。 #include <cstdio> int main() {int M, H;scanf( "…

长沙.NET社区之光

奈何万事开头难迎着改革开放四十年带来的春风&#xff0c;长沙的互联网生态环境以唐胡子俱乐部为首的一众互联网社群将长沙互联网的环境推上了一个新的台阶。年底&#xff0c;我与有幸一起共事的溪源兄&#xff0c;下班后一起闲聊&#xff0c;觉着长沙的.NET的生态环境亟待改善…

P3205 [HNOI2010]合唱队

P3205 [HNOI2010]合唱队 题意&#xff1a; 有n个数&#xff0c;然后插入队伍中&#xff0c;如果队列当前为空&#xff0c;则直接插入&#xff0c;然后每次插入和上一次插入的比较&#xff0c;如果大于&#xff0c;插入当前队列的最右侧&#xff0c;如果小于&#xff0c;插入当…

2.14模拟总结

前言 节日快乐&#xff01; (逃) day10 50pts 期望&#xff1a;10302060 实际&#xff1a;0302050 rnk11 彻彻底底的摆烂局了。 但是rnk竟然没有太掉&#xff0c;所以我应该并不孤独… 和KH并排坐在机房里&#xff0c;各自看着电脑&#xff0c;痴痴想着各自的心事&#xff0c;…

KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解

文章目录A - CenturyB - 200th ABC-200C - Ringos Favorite Numbers 2D - Happy Birthday! 2E - Patisserie ABC 2F - Minflip SummationKYOCERA Programming Contest 2021&#xff08;AtCoder Beginner Contest 200&#xff09; A - Century 简单的除以200200200向上取整 B…

高级进阶:Azure DevOps搞定.NET Core编译版本号自增

点击上方蓝字关注“汪宇杰博客”熟悉.NET Framework的人知道&#xff0c;我们可以通过指定AssemblyVersion为10.0.*来让编译器自增版本号。但是.NET Core和.NET Standard不行。即使有MSBump这样的开源项目&#xff0c;也有一定的缺陷。一般这样的需求会出现在CI/CD服务器上。我…

Little Boxes UVALive - 8209

Little Boxes UVALive - 8209 题意&#xff1a; 给你四个数&#xff0c;输出四个数之和&#xff0c;四个数小于等于262之内 题解&#xff1a; 这。。。这。。水题 unsigned int 0&#xff5e;4294967295 (10位数&#xff0c;4e9) int -2147483648&#xff5e;2147483647 (…