[Ynoi2016]谁的梦
题目大意:
给定$n$个序列,要你从每个序列中选一个非空子串然后拼起来,拼成的序列的贡献为不同元素个数。
支持单点修改,在开始时和每次修改完后,输出所有不同选取方案的贡献和。
解题思路:
窝又来切Ynoi辣
STL题。
考虑每种元素的贡献,相当于求出有多少种方案包含这个数。补集转化成有多少种方案不包含这个数。
求有多少种方案不包含这个数,就相当于求每个序列有多少子区间不包含这个数,然后乘法原理。
而求有多少子区间不包含这个数,就相当于用这个数把序列分成若干区间,每个区间内部可以任意选取。
用一个数组存每种数有多少方案不包含,用map存每个序列里每种数有多少方案不包含,对每种数开个set存其位置。
插入的时候,相当于把一个大区间分裂成两个小区间,在set里查找前驱后继,更新map里的值即可。同时更新数组里的值和答案。删除的时候同理。
注意当一个序列只有一种数的时候,map里值为0,所以需要特殊处理一下,打个标记。
时间复杂度$O((n+m)\log n)$。
C++ Code:
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<iostream>
using namespace std;
typedef pair<int,int>pii;
const int md=19260817,N=2e5+5;
typedef long long LL;
int L[N],R[N],bel[N],len[N],a[N],n,m,inv[300005],LN[N],Ynoi=1,ept[N],P[N];
int ans=0;
set<int>s[N];
map<pii,int>gx;
vector<int>lr;
struct opts{
int x,y,z;
}q[N];
inline int C2(int len){return(len*(len-1LL)>>1)%md;}
inline int INV(int i){return(i<300000)?inv[i]:((LL)md-md/i)*INV(md%i)%md;}
void insert(int col,int pos){
int pre=*--s[col].lower_bound(pos),suf=*s[col].upper_bound(pos);
pre=max(pre,L[bel[pos]]-1),suf=min(suf,R[bel[pos]]+1);
const pii xb=make_pair(bel[pos],col);
if(!gx.count(xb))gx[xb]=C2(len[bel[pos]]+1);
int&v=gx[xb];
ans=(ans+((ept[col])?0:LN[col]))%md;
LN[col]=(LL)LN[col]*INV(v)%md;
v=(v-C2(suf-pre)+C2(pos-pre)+C2(suf-pos)+md)%md;
if(v)
LN[col]=(LL)LN[col]*v%md;else ++ept[col];
ans=(ans-((ept[col])?0:LN[col])+md)%md;
s[col].insert(pos);
}
void erase(int col,int pos){
int pre=*--s[col].lower_bound(pos),suf=*s[col].upper_bound(pos);
pre=max(pre,L[bel[pos]]-1),suf=min(suf,R[bel[pos]]+1);
const pii xb=make_pair(bel[pos],col);
if(!gx.count(xb))gx[xb]=C2(len[bel[pos]]+1);
int&v=gx[xb];
ans=(ans+((ept[col])?0:LN[col]))%md;
if(!v)--ept[col];else
LN[col]=(LL)LN[col]*INV(v)%md;
v=(v+C2(suf-pre)-C2(pos-pre)-C2(suf-pos)+md+md)%md;
LN[col]=(LL)LN[col]*v%md;
ans=(ans-((ept[col])?0:LN[col])+md)%md;
s[col].erase(pos);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
inv[1]=1;
for(register int i=2;i<300000;++i)inv[i]=((LL)md-md/i)*inv[md%i]%md;
for(int i=1;i<=n;++i)cin>>len[i],L[i]=R[i-1]+1,R[i]=R[i-1]+len[i],Ynoi=(LL)Ynoi*C2(len[i]+1)%md,P[i]=P[i-1]+len[i];
for(int i=1;i<=n;++i)
for(int j=L[i];j<=R[i];++j)bel[j]=i,cin>>a[j],lr.push_back(a[j]);
for(int i=1;i<=m;++i){
cin>>q[i].x>>q[i].y>>q[i].z;
lr.push_back(q[i].z);
}
sort(lr.begin(),lr.end());
lr.erase(unique(lr.begin(),lr.end()),lr.end());
for(int i=0;i<=lr.size();++i)s[i].insert(0),s[i].insert(R[n]+1),LN[i]=Ynoi;
for(int i=1;i<=R[n];++i){
a[i]=lower_bound(lr.begin(),lr.end(),a[i])-lr.begin();
insert(a[i],i);
}
cout<<ans<<'\n';
for(int i=1;i<=m;++i){
const int id=P[q[i].x-1]+q[i].y;
erase(a[id],id);
insert(a[id]=lower_bound(lr.begin(),lr.end(),q[i].z)-lr.begin(),id);
cout<<ans<<'\n';
}
return 0;
}
[Ynoi2016]谁的梦的更多相关文章
- 题解 P4692 【[Ynoi2016]谁的梦】
Ynoi 中少见的不卡常题呢....虽说有 50 个数据点... 果然还是道好题 noteskey 总之就是补集转化的思想,算出每种颜色选点的总方案减去不可行方案(就是不包含 该种颜色的点的区间选取方 ...
- P4692 [Ynoi2016]谁的梦
传送门 分别考虑每一种颜色对答案的贡献.每种颜色的贡献就是他出现的区间个数,那么可以用总区间减去不包含它的区间个数,把每一个序列里不包含它的区间个数加起来,然后不同序列用乘法原理计算即可 于是我辛辛苦 ...
- BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)
5395: [Ynoi2016]谁的梦 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 22 Solved: 7[Submit][Status][Di ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布
一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端
一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化
一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构
一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...
- 织梦cms常用标签
dedecms简介:织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内知名的PHP开源网站管理系统,也是使用用户较多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是 ...
- 织梦Dedecms使用Nginx的安全设置
首先需要说明的是,任何程序都是有漏洞的,我们需要做好一些必要的防范,来减少由于程序漏洞造成的损失.织梦的漏洞多,这个是很多人的想法.不过大家如果做好了织梦系统的文件夹权限什么的设置,很多漏洞也是用不上 ...
随机推荐
- TRIZ的成功案例
这篇採訪稿是几年前的,是TRIZ成功案例离我近期的,由于主人公是我的朋友,请点击查看: 培训后技术难题就攻克了 后记:学了TRIZ并不能让您100%解决您全部遇到的问题,但这样的思想和方法确实是最具操 ...
- QQ是怎样实现好友桌面快捷方式的?
QQ是怎样实现好友桌面快捷方式的? 不知道什么时候,QQ推出了好友桌面快捷方式.方便用户和最常保持联系的好友一键联系.核心功能一:若QQ启动了.则双击快捷方式直接打开好友聊天界面:核心功能二:若QQ未 ...
- 【Android】开发优化之——调优工具:TrackView,Method Profiling
Android SDK自带的tool TrackView 位于 sdk的tools文件夹下.使用方法为:进入到tools下,执行 traceview e:\loginActivityTracing.t ...
- 一些求数据库对象的SQL语句
use [mydb] go --存储过程 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE routine_type='PROCEDURE' AND SP ...
- c# winform 多条件查找 外加网络人才回答
浮生 Э 2012-11-22 c# winform 多条件查找 20 我现在有2个textbox 一个是用户名,另一个是电话 现在想对这两个进行条件查找datagridview里的数据 s ...
- hdu 2205(容斥原理)
Eddy's爱好 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdoj--1418--抱歉(水题)
抱歉 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 【CTSC 2007】 数据备份
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1150 [算法] 首先,有一个很显然的结论 : 如果要使距离和最小,必须选择相邻的办公 ...
- hihoCoder 1187
今天BC爆0了....但是日子还是要过的....要回学校毕业了~~大学就这么“荒废”了. 这个是hihoCoder的1187,比较基础的一道题. 题目链接: http://hihocoder.com/ ...
- SQLServer2008 关于数据转换
全进位 select cast(ceiling(2.1111) as dec(18,0)) 结果:3