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 ...
随机推荐
- Spring框架的核心功能之AOP概述
1. 什么是AOP的技术? * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构 ...
- 【SQL模板】三.插入/更新 数据模板TSQL
---Name: 插入/更新 数据模板.sql ---Purpose: 用于更新 数据库中 历史数据 或 插入 新数据 的脚本模板 ---Author: xx ---Time: 2015-12-18 ...
- C#中发送邮件,包含Html代码 CDO.Message
C#代码: /// <summary> /// 发送邮件 /// </summary> /// <param name="context">&l ...
- 在探http请求
参考:https://itbilu.com/other/relate/Ny2IWC3N-.html Cookie和Session都是为了解决HTTP协议的无状态问题,存储HTTP通讯中客户端与服务器之 ...
- RPM包制作方法
一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...
- Python 的stat 模块
#!/usr/bin/env python#-*- encoding:UTF-8 -*- import os,time,stat fileStats = os.stat ( 'test.txt' ) ...
- 2018.08.09 bzoj4719: [Noip2016]天天爱跑步(树链剖分)
传送门 话说开始上文化课之后写题时间好少啊. 这道题将一个人的跑步路线拆成s->lca,lca->t,然后对于第一段上坡路径要经过的点,当前这个人能对它产生贡献当且仅当dep[s]-dep ...
- tp5自动生成目录
1.// 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thi ...
- hdu-1166(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 思路:线段树模板 #include<iostream> #include<cs ...
- csdn的一次回答问题
#coding:utf8 import tushare as ts import pandas as pd import numpy as np import pymysql,datetime imp ...