5395: [Ynoi2016]谁的梦

Time Limit: 80 Sec  Memory Limit: 128 MB
Submit: 22  Solved: 7
[Submit][Status][Discuss]

Description

6.373
世界是独立于我的意志的。
6.374
就算我们所期望的全部的事情都发生了
这果然也只能说是命运的恩惠吧。
要问为什么,那是因为意志和世界之间
能够保证这件事的逻辑性的关联并不存在
Ludwig Josef Johann Wittgenstein [逻辑哲学论]
自从双胞胎的哥哥过世起,已经过了多久了呢…
从那时起,我一直保存着能够布偶。
在那以后的我只是个影子…而这个布偶才是我…
这样也并没有什么不好。
我觉得只要现在的我消失掉就行了…
那两个人却救了这样的我。
一个是由岐姐…
她又来到了我的身边…
带着皆守哥…回到了我们的身边…
水上由岐姐姐…温柔的姐姐
曾经非常喜欢皆守哥的人……
 
回去的路上…
平时不会经过的坡道…
在登上那个坡道的途中…
我看到了夜晚的太阳。
明明就在附近,却一直不知道的巨大的向日葵。
夜露使它的绒毛泛出了白光。
碧蓝的月光和黄色的向日葵…
就好像太阳和月亮的立场反过来一样…
原本是那么耀眼的太阳在地上,只能在其背后下发光的月亮在天上…
黄色的向日葵被染成了碧蓝色。
那副样子虽然很美丽…
努力绽放的向日葵,看起来反而是柔弱的存在。
在夜里向天空伸展的向日葵…
我在车内一直追寻着它的身影…
被夜晚的月光映照着的太阳。
被染成碧蓝色的太阳…
它的身影…我一直追寻着……
 
被月光照亮的天台上…
一个人影…
明明只是一个人影…却好像…在和什么东西对峙着一样…
皆守哥…
月下的立像,一个人影。
胸口在风中闪烁。
放在胸前的手里的是…那时的小刀。
和七年前同样的姿势。
唯一不同的是,那里的人影只有一个。
那把小刀,好像是被他自己刺入体内。
 
是诅咒…
这是理所当然的事…
那并不是什么精神病…
那是诅咒…
下在幸存的我们身上的…诅咒…
说不定,不仅仅是卓司哥…连由岐姐也在诅咒我们…
所以变成这种结果…
哥哥刺向了自己的胸口…
破坏了我的半身…
然后…还要把很多人送回到天空…
回归天空的日子。
交还灵魂的日子。
那一天,卓司哥对我做的事情。
杀了由岐姐的…那个行为…
他想要再一次实行…
这次…和很多人一起…
 
不是…
那是…我啊…
是那个…坡道的事情啊…
两个人一起看到向日葵的…那个坡道…
…我说要爬上那个坡道…要去寻找爸爸的灵魂…
我想,如果到了那个坡道的前方,就能取回爸爸的灵魂…爸爸就会复生的…
如果越过向日葵之路…向着向日葵所朝向的天空延伸的…那个大大的坡道的话…大概,就会有爸爸的灵魂…
爸爸的故乡的…大大的坡道…
 
哥哥的身体浮在空中…
我无言地跳了出去。
啊啊…是这样啊…
由岐姐也是这种心情啊…
并没有什么道理可言…
只是因为喜欢的人向着天空跳下去了…
我想要抓住那个身体…
我--
您正在打galgame,突然断电了,于是您跑去物管处问,结果发现是由于一个光头踢了变压器一脚导致的,
可能还要修很久,于是您决定想一个之前见过的数据结构题:
定义一个序列的权值为不同数字的个数,例如 [1,2,3,3] 权值为 3
现在有n个序列,我们在每个序列里面选一个连续非空子串,拼接起来,求所有选法得到的序列的权值之和
如果一个序列能通过多种方法被选择出来,那么计算多次
本题带修改操作,格式请参考输入格式
由于结果可能过大,请输出答案 mod 19260817 的结果

Input

第一行两个数 n,m,表示有n个序列,m次修改
然后n个数,第i个数是leni,表示第i个序列的长度
之后n行,每行leni个数,表示第i个序列
之后m行,每行三个数x,y,z表示将第x个序列的第y个元素改为z
1 <= n,m <= 100000,序列中的元素均为 32 位整型数,leni的和 <= 100000
共53组数据

Output

输出m + 1行,依次表示初始局面以及每次修改后的答案。

Sample Input

2 5
6 6
1 3 1 1 3 2
2 3 3 2 1 1
1 1 1
1 1 2
1 1 2
1 1 1
1 1 1

Sample Output

1158
1158
1168
1168
1158
1158
 

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=5395

Solution

  少女的等待故事。

  爱慕哥哥的少女,她坚信着哥哥的承诺,在向日葵的坡道下等待着他的回归。

  居然在ynoi上抢到rk1.。。感觉很神奇。。。果然是因为我是素学家吗QAQ

  

  然后是题解。。。

  首先发现每种颜色对答案的贡献都是独立的。。。

  对于某一种颜色,直接算在多少个序列中出现比较困难。。

  所以考虑用总数减去没有出现的次数。。

  然后对每一行统计答案,然后乘法原理。。。遍历的时候要用set。。。

  单点修改只会影响某两种颜色的贡献,暴力修改即可。。

代码

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#define LL long long
using namespace std;
inline int read(){
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void Out(LL a){
if(a>9) Out(a/10);
putchar(a%10+'0');
}
const LL N=200050;
const LL mod=19260817;
LL n,m,tot,num,LEN,NY;
LL a[N],hang[N],lie[N],len[N],hed[N];
LL sum[N],nsum[N],ans[N],zer[N];
set<LL> S[N];
map<LL,LL>lsh;
map<LL,LL> mp[N],c[N];
LL res=0,ss;
LL pow(LL x,LL y){
LL re=1;
while(y){
if(y&1) re=re*x%mod;
x=x*x%mod;y>>=1;
}
return re;
}
LL get(LL u,LL v){
LL l=1,r=tot;
while(l!=r){
LL mid=l+r>>1;
if(hang[mid]<u||(hang[mid]==u&&lie[mid]<v)) l=mid+1;
else r=mid;
}
return l;
}
int main(){
NY=pow((LL)2,mod-2);
n=read();m=read();ss=1;
for(LL i=1;i<=n;++i){
len[i]=read();
ss=ss*(LL)len[i]%mod*(LL)(len[i]+1)%mod*NY%mod;
LEN+=len[i];
}
//cout<<ss<<endl;
sum[0]=nsum[0]=1;
for(LL i=1;i<=n;++i){
sum[i]=(LL)(len[i]+1)*(LL)len[i]/(LL)2%mod;
sum[i]=sum[i]*sum[i-1]%mod;
nsum[i]=pow(sum[i],mod-2);
for(LL j=1;j<=len[i];++j){
a[++tot]=read();
if(!lsh[a[tot]]) {
lsh[a[tot]]=++num;
}
a[tot]=lsh[a[tot]];
S[a[tot]].insert(tot);
hang[tot]=i;lie[tot]=j;
}
}
LL u,v,w,x;
for(LL i=1;i<=num;++i){
u=0;v=0;ans[i]=1;
for(set<LL>::iterator it=S[i].begin();it!=S[i].end();++it){
//cout<<u<<" "<<v<<endl;
x=*it;
if(u==0){
ans[i]=ans[i]*sum[hang[x]-1]%mod;
mp[i][hang[x]]+=(LL)(lie[x]-1)*(LL)lie[x]/(LL)2;
}
else if(u!=hang[x]){
mp[i][u]+=(LL)(len[u]-v)*(LL)(len[u]-v+1)/(LL)2;
if(mp[i][u]>0) ans[i]=ans[i]*mp[i][u]%mod;
else zer[i]++;
ans[i]=ans[i]*sum[hang[x]-1]%mod*nsum[u]%mod;
mp[i][hang[x]]+=(LL)(lie[x]-1)*(LL)lie[x]/(LL)2;
}
else mp[i][hang[x]]+=(LL)(lie[x]-v-1)*(LL)(lie[x]-v)/2;
u=hang[x];v=lie[x];
}
mp[i][u]+=(LL)(len[u]-v)*(LL)(len[u]-v+1)/(LL)2;
if(mp[i][u]>0) ans[i]=ans[i]*mp[i][u]%mod;
else zer[i]++;
ans[i]=ans[i]*sum[n]%mod*nsum[u]%mod;
if(zer[i]>0) res+=ss;
else res+=ss-ans[i];
//cout<<ss<<" "<<ans[i]<<endl;
}
res=(res%mod+mod)%mod;
Out(res);puts("");
set<LL>::iterator l,r;
LL L,R,lx,rx;
while(m--){
u=read();v=read();w=read();
x=get(u,v);
l=S[a[x]].lower_bound(x);
r=l;
if(l==S[a[x]].begin()) L=0;
else {
--l;L=*l;
if(hang[L]!=u) L=0;
else L=lie[L];
}
++r;
if(r==S[a[x]].end()) R=len[u];
else{
R=(*r);
if(hang[R]!=u) R=len[u];
else R=lie[R]-1;
}
if(zer[a[x]]>0) res-=ss;
else res-=ss-ans[a[x]];
if(mp[a[x]][u]>0)ans[a[x]]=ans[a[x]]*pow(mp[a[x]][u],mod-2)%mod;
else --zer[a[x]];
mp[a[x]][u]-=(LL)(R-v)*(R-v+1)/2+(LL)(v-1-L)*(v-L)/2;
mp[a[x]][u]+=(LL)(R-L)*(R-L+1)/2;
if(mp[a[x]][u]>0) ans[a[x]]=ans[a[x]]*mp[a[x]][u]%mod;
else ++zer[a[x]];
if(zer[a[x]]>0) res+=ss;
else res+=ss-ans[a[x]];
S[a[x]].erase(x);
if(!lsh[w]){
lsh[w]=++num;
ans[num]=sum[n];
}
w=lsh[w];
a[x]=w;
S[w].insert(x);
l=S[a[x]].lower_bound(x);
r=l;
if(l==S[a[x]].begin()) L=0;
else {
--l;L=*l;
if(hang[L]!=u) L=0;
else L=lie[L];
}
++r;
if(r==S[a[x]].end()) R=len[u];
else{
R=(*r);
if(hang[R]!=u) R=len[u];
else R=lie[R]-1;
}
if(R==len[u]&&L==0) mp[w][u]=(LL)(len[u]+1)*(LL)len[u]/2;
if(zer[a[x]]>0) res-=ss;
else res-=ss-ans[a[x]];
if(mp[a[x]][u]>0)ans[a[x]]=ans[a[x]]*pow(mp[a[x]][u],mod-2)%mod;
else --zer[a[x]];
mp[a[x]][u]-=(LL)(R-L)*(R-L+1)/2;
mp[a[x]][u]+=(LL)(R-v)*(R-v+1)/2+(LL)(v-1-L)*(v-L)/2;
if(mp[a[x]][u]>0) ans[a[x]]=ans[a[x]]*mp[a[x]][u]%mod;
else ++zer[a[x]];
if(zer[a[x]]>0) res+=ss;
else res+=ss-ans[a[x]];
res=(res%mod+mod)%mod;
Out(res);puts("");
}
return 0;
}

  

  

This passage is made by Iscream-2001.

BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)的更多相关文章

  1. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  2. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  3. BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)

    [Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...

  4. bzoj 4036: [HAOI2015]按位或【min-max容斥+FWT】

    其实也不是FWT--我也不知道刷FWT专题问什么会刷出来这个东西 这是min-max容斥讲解:https://www.zybuluo.com/ysner/note/1248287 总之就是设min(s ...

  5. BZOJ 2440 [中山市选2011]完全平方数 二分+容斥

    直接筛$\mu$?+爆算?再不行筛素数再筛个数?但不就是$\mu^2$的前缀和吗? 放...怕不是数论白学了$qwq$ 思路:二分+容斥 提交:两次(康了题解) 题解: 首先答案满足二分性质(递增), ...

  6. BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)

    题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...

  7. BZOJ.4361.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

  8. ural 1932 The Secret of Identifier 容斥

    主题链接:点击打开链接 stl+容斥 #include <cstdio> #include <cstring> #include <algorithm> #incl ...

  9. hdu 4336 Card Collector —— Min-Max 容斥

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336 bzoj 4036 的简单版,Min-Max 容斥即可. 代码如下: #include<cst ...

随机推荐

  1. Spring框架的AOP的底层实现

    1. Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种 1. 基于JDK的动态代理 * 必须是面向接口的,只有实现了具体接口的类才能生成代理对象 2. 基于CGLIB动态代理 ...

  2. [z]kafka相关资料

    http://my.oschina.net/ielts0909/blog/93190 http://www.iteye.com/magazines/107 http://blog.csdn.net/h ...

  3. jstl标签详解 (转载)

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...

  4. Laravel 根据任务的性质和要求决定处理的方式(Cron or Job)

    1 前言 一般地,我们在应用的开发中,会碰到各种各样的任务解决需求.我的原则是,选择合适的方法做正确的事. 2 任务分类 在开发中, 一般会有以下几种性质的任务. 2.1 实时任务 一般是指,任务间的 ...

  5. sqoop 安装使用

    安装配置: 1.将sqoop-1.4.4.tar.gz 上传到/usr/local/ 2.解压 tar -zxvf sqoop-1.4.4.tar.gz 3.配置 vim /etc/profile 在 ...

  6. td里的英文字母不会自动换行的问题

    今天发现一个问题,限制了TD的宽度之后,汉字会自动换行,但是英文却不会,在网上搜索一下,发现在TD里面加上style='word-break:break-all'这个样式之后,换行成功 <tab ...

  7. Tomcat中的Web.xml和servlet.xml的学习

    Web.xml文件使用总结 作用: 存储项目相关的配置信息,保护servlet.解耦一些数据对程序的依赖 使用位置: 每个web项目中 Tomcat服务器中(在服务器目录conf目录中) 区别: We ...

  8. 2018.10.14 bzoj1915: 奶牛的跳格子游戏(单调队列优化dp)

    传送门 NOIP练习题. f[i]f[i]f[i]表示去的时候选了iii且回来的时候第一步走的是i−1i-1i−1的最优值. 显然f[i]=maxf[i]=maxf[i]=max{f[j]−sum[j ...

  9. 2018.09.19 atcoder AtCoDeer and Election Report(贪心)

    传送门 很有意思的一道贪心. 就是每次翻最小的倍数来满足条件. 代码: #include<bits/stdc++.h> #define ll long long using namespa ...

  10. Radius 中 与Response Authernticator 与 Message-Authenticator的计算

    /* String RequestStr3 = @"01 00 00 9E EB B2 E8 D9 1E 52 10 03 FB E1 52 39 27 58 93 F0 01 0E 33 ...