传送门

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

于是我辛辛苦苦打了两个小时交上去只剩两分……后来看了题解之后才发现我忘了考虑某个序列全都是一个数的情况……那种情况下这个数贡献为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. 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题或禁止第一次加载

    ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数: 当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...

  2. Python源代码--整数对象(PyIntObject)的内存池

    [背景] 原文链接:http://blog.csdn.net/ordeder/article/details/25343633 Python整数对象是不可变对象,什么意思呢?比如运行例如以下pytho ...

  3. Razor视图引擎布局 Razor视图引擎的基本概念与法语 SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射 binary 和 varbinary datetime 和 smalldatetime float 和 real

    Razor视图引擎布局   不需要像过去aspx一样,使用.Master文件,而是统一使用.cshtml 或 .vbhtml文件.但文件名一般以 _开头,这样做文件不会当做View显示出来 使用@Re ...

  4. iOS 把数据库文件打包到mainbundle中,查找不到路径的解决的方法;以及在删除bundle中文件的可行性

    在开发中有时我们须要把数据库文件打包到我们的项目中.一般我们都是在外部用工具生成数据库文件,然后拉入项目中.可是我们在程序中查找改文件时.返回的路径总是nil 解决的方法: 原因我们拉入其它资源文件( ...

  5. Codefoces 432 C. Prime Swaps(水)

    思路:从前往后想将1调整好,在调整2....这样平均每次有五次机会调整,并且有相当一部分可能都用不到五次,能够一试.ac 代码: #include<iostream> #include&l ...

  6. android经常使用正则工具类

    此类提供日常开发中经常使用的正则验证函数.比方:邮箱.手机号.电话号码.身份证号码.日期.数字.小数.URL.IP地址等.使用Pattern对象的matches方法进行整个字符匹配,调用该方法相当于: ...

  7. AOP是怎么实现的,有几种方式

    1.静态AOP:在编译期,切面直接以字节 码的形式编译到目标字节 码文件中. AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器. 优点 ...

  8. IE6span 高度问题

    IE6盒子的最小高度为20px,所以设置低于20px大小时,加上_overflow:hidden;

  9. YTU 2417: C语言习题 字符串长度

    2417: C语言习题 字符串长度 时间限制: 1 Sec  内存限制: 128 MB 提交: 758  解决: 548 题目描述 写一函数,求一个字符串的长度.在main函数中输入字符串,并输出其长 ...

  10. CocoaPods 安装相关问题

    (1)pod install还是pod update都卡在Analyzing dependencies不动. 解决方法: 其实原因在于以上两个命令执行时会升级CocoaPods的spec仓库,加一个参 ...