BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)
5395: [Ynoi2016]谁的梦
Time Limit: 80 Sec Memory Limit: 128 MB
Submit: 22 Solved: 7
[Submit][Status][Discuss]
Description
.png)
.png)
.png)
.png)
.png)
Input
Output
Sample Input
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
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&容斥)的更多相关文章
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)
[Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...
- bzoj 4036: [HAOI2015]按位或【min-max容斥+FWT】
其实也不是FWT--我也不知道刷FWT专题问什么会刷出来这个东西 这是min-max容斥讲解:https://www.zybuluo.com/ysner/note/1248287 总之就是设min(s ...
- BZOJ 2440 [中山市选2011]完全平方数 二分+容斥
直接筛$\mu$?+爆算?再不行筛素数再筛个数?但不就是$\mu^2$的前缀和吗? 放...怕不是数论白学了$qwq$ 思路:二分+容斥 提交:两次(康了题解) 题解: 首先答案满足二分性质(递增), ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- ural 1932 The Secret of Identifier 容斥
主题链接:点击打开链接 stl+容斥 #include <cstdio> #include <cstring> #include <algorithm> #incl ...
- hdu 4336 Card Collector —— Min-Max 容斥
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336 bzoj 4036 的简单版,Min-Max 容斥即可. 代码如下: #include<cst ...
随机推荐
- php代码执行顺序
从上往下,调用类里面的方法,类放上面,调用在下面
- c++中如何定义编译期间常量,即这个常量可以用于定义数组下标
在c++中,类里面的成员变量不仅仅可以被const修饰,还可以被static const修饰,此时一个内建类型(如int ,char ,long等)的static const 可以看做是一个编译期间的 ...
- 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
- spring+hibernate 整合异常 Class 'org.apache.commons.dbcp.BasicDataSource' not found
解决方法 添加 commons-dbcp.jar和commons-pool.jar包
- linux下mysql命令大全
1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令: mys ...
- IntelliJ IDEA 2017版 加载springloaded-1.2.4.RELEASE.jar实现热部署
1.配置pom.xml文档(详见:http://www.cnblogs.com/liuyangfirst/p/8318664.html) <?xml version="1.0" ...
- PS各个工具的字母快捷键和英文全名
选框-Marquee(M) 移动-move(V) 套索-Lasso(L) 魔棒-Wand(W) 喷枪-injection lance (J) 画笔-Brush (B) 铅笔-pencil(N) 橡皮图 ...
- 8b10b
目的:保持直流平衡DC Balance). running disparity() 8bit原始数据会分成两部分,其低5位会进行5B/6B编码,高3位则进行3B/4B编码,这两种映射关系在当时已经成为 ...
- Window 下好用的同步备份工具(来自微软)SyncToy
SyncToy 简单好用,满足备份的基本需求.
- (最短路 spfa)Wormholes -- poj -- 3259
http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...