传送门

分别考虑每一种颜色对答案的贡献。每种颜色的贡献就是他出现的区间个数,那么可以用总区间减去不包含它的区间个数,把每一个序列里不包含它的区间个数加起来,然后不同序列用乘法原理计算即可

于是我辛辛苦苦打了两个小时交上去只剩两分……后来看了题解之后才发现我忘了考虑某个序列全都是一个数的情况……那种情况下这个数贡献为0,然而后面删除它的时候没办法消除贡献因为0没有逆元……

于是解决方法就是记录一下这个数字是否在某个序列里全都是,如果是的话不包含它的区间为0,否则的话正常计算就可以了

然后代码里是一些丧心病狂的卡常……抄了iscream巨巨的题解还不小心抢了他的rank1心里有点莫名其妙的羞愧→_→

//minamoto
#include<bits/stdc++.h>
#define R register
#define IT set<int>::iterator
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=2e5+5,P=19260817;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int calc(R int l){return 1ll*l*(l+1)/2%P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=1ll*x*x%P)if(y&1)res=1ll*res*x%P;
return res;
}
set<int>s[N];map<int,int>mp[N];
int len[N],sum[N],isum[N],inv[N],sl[N],zero[N];
int a[N],b[N],x[N],y[N],d[N],hang[N],lie[N],nxt[N],head[N],ans[N];
int n,m,tot,lim,all,loli;
inline int Inv(R int x){return x<=2e5?inv[x]:ksm(x,P-2);}
void solve(int x,int y,int d){
int id=sl[x-1]+y,l=0,r=len[x]+1,col=a[id];
IT itl,itr;itl=s[col].lower_bound(id),itr=itl;
if(itl!=s[col].begin()){
--itl;if(hang[*itl]==x)l=lie[*itl];
}
++itr;if(itr!=s[col].end()&&hang[*itr]==x)r=lie[*itr];
loli=dec(loli,zero[col]?all:dec(all,ans[col]));
if(mp[col][x]>0)ans[col]=1ll*ans[col]*Inv(mp[col][x])%P;
else --zero[col];
mp[col][x]=dec(mp[col][x],add(calc(r-y-1),calc(y-l-1)));
mp[col][x]=add(mp[col][x],calc(r-l-1));
if(mp[col][x]>0)ans[col]=1ll*ans[col]*mp[col][x]%P;
else ++zero[col];
loli=add(loli,zero[col]?all:dec(all,ans[col]));
s[col].erase(id); l=0,r=len[x]+1,a[id]=d,col=d,s[col].insert(id);
itl=s[col].lower_bound(id),itr=itl;
if(itl!=s[col].begin()){
--itl;if(hang[*itl]==x)l=lie[*itl];
}
++itr;if(itr!=s[col].end()&&hang[*itr]==x)r=lie[*itr];
if(r==len[x]+1&&l==0)mp[col][x]=calc(len[x]);
loli=dec(loli,zero[col]?all:dec(all,ans[col]));
if(mp[col][x]>0)ans[col]=1ll*ans[col]*Inv(mp[col][x])%P;
else --zero[col];
mp[col][x]=dec(mp[col][x],calc(r-l-1));
mp[col][x]=add(mp[col][x],add(calc(r-y-1),calc(y-l-1)));
if(mp[col][x]>0)ans[col]=1ll*ans[col]*mp[col][x]%P;
else ++zero[col];
loli=add(loli,zero[col]?all:dec(all,ans[col]));
print(loli);
}
int main(){
// freopen("testdata.in","r",stdin);
inv[0]=inv[1]=1;for(int i=2;i<=2e5;++i)inv[i]=((-(1ll*P/i)*inv[P%i])%P+P)%P;
n=read(),m=read(),sum[0]=isum[0]=1,tot=0;
fp(i,1,n){
len[i]=read(),sl[i]=sl[i-1]+len[i];
sum[i]=1ll*calc(len[i])*sum[i-1]%P,isum[i]=Inv(sum[i]);
}all=sum[n];
fp(i,1,n)fp(j,1,len[i])b[++lim]=a[++tot]=read(),hang[tot]=i,lie[tot]=j;
fp(i,1,m)x[i]=read(),y[i]=read(),b[++lim]=d[i]=read();
sort(b+1,b+1+lim),lim=unique(b+1,b+1+lim)-b-1;
tot=0;fp(i,1,n)fp(j,1,len[i]){
++tot,a[tot]=lower_bound(b+1,b+1+lim,a[tot])-b;
s[a[tot]].insert(tot);
}fd(i,tot,1)nxt[i]=head[a[i]],head[a[i]]=i;
fp(i,1,m)d[i]=lower_bound(b+1,b+1+lim,d[i])-b;
fp(i,1,lim)if(head[i]){
ans[i]=sum[hang[head[i]]-1];
for(R int j=head[i];j;j=nxt[j]){
int bl=hang[j],res=0,las=sl[bl-1];
while(hang[nxt[j]]==bl)res=add(res,calc(j-las-1)),las=j,j=nxt[j];
res=add(res,calc(j-las-1)),res=add(res,calc(sl[bl]-j));
if(res)ans[i]=1ll*ans[i]*res%P,mp[i][bl]=res;
else ++zero[i];
if(!nxt[j])ans[i]=1ll*ans[i]*sum[n]%P*isum[bl]%P;
else ans[i]=1ll*ans[i]*sum[hang[nxt[j]]-1]%P*isum[bl]%P;
}loli=add(loli,zero[i]?all:dec(all,ans[i]));
}else ans[i]=sum[n];
print(loli);fp(i,1,m)solve(x[i],y[i],d[i]);return Ot(),0;
}

P4692 [Ynoi2016]谁的梦的更多相关文章

  1. 题解 P4692 【[Ynoi2016]谁的梦】

    Ynoi 中少见的不卡常题呢....虽说有 50 个数据点... 果然还是道好题 noteskey 总之就是补集转化的思想,算出每种颜色选点的总方案减去不可行方案(就是不包含 该种颜色的点的区间选取方 ...

  2. [Ynoi2016]谁的梦

    题目大意: 给定$n$个序列,要你从每个序列中选一个非空子串然后拼起来,拼成的序列的贡献为不同元素个数. 支持单点修改,在开始时和每次修改完后,输出所有不同选取方案的贡献和. 解题思路: 窝又来切Yn ...

  3. BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)

    5395: [Ynoi2016]谁的梦 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 22  Solved: 7[Submit][Status][Di ...

  4. 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布

    一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...

  5. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端

    一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...

  6. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化

    一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...

  7. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构

    一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...

  8. 织梦cms常用标签

    dedecms简介:织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内知名的PHP开源网站管理系统,也是使用用户较多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是 ...

  9. 织梦Dedecms使用Nginx的安全设置

    首先需要说明的是,任何程序都是有漏洞的,我们需要做好一些必要的防范,来减少由于程序漏洞造成的损失.织梦的漏洞多,这个是很多人的想法.不过大家如果做好了织梦系统的文件夹权限什么的设置,很多漏洞也是用不上 ...

随机推荐

  1. Android中View绘制流程以及invalidate()等相关方法分析(转)

    转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...

  2. android 自己定义控件

    Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...

  3. sublime 高速打开跳转至关联文件

    在下一枚web前端,近期在用sublime text2编辑器写前端.因为页面较多,项目较大,所以难免出现非常多引用文件和一些js的teample模板. 问题:在Sublime Text编写代码过程中要 ...

  4. 【第四篇章-android平台MediaCodec】解决Observer died. Quickly, do something, ... anything...

    当出现!!!Observer died. Quickly, do something, ... anything...说明你的程序已经出现严重异常了,那会是什么情况呢?这个问题困扰了我许久,后来原来是 ...

  5. Hibernate quick start

    Preface Working with both Object-Oriented software and Relational Databases can be cumbersome and ti ...

  6. CString转换成char *字符串问题

    buf = (LPSTR)(LPCTSTR)str;      ==>     buf 显示的是第一个字符 strcpy(pNumber,strNumber);      ==>    e ...

  7. MapReduce算法形式三:cleanup

    案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...

  8. oracle的索引有几种?各有何用途?

    1. b-tree索引Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名.CREATE INDEX语句时,默认就是在创建b-tree索引.没有特别规定 ...

  9. 小程序 单页应用的 tab切换 实现

    小程序 单页应用的  tab切换 实现

  10. 概率dp集合

    bzoj1076 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后 ...