Ynoi 中少见的不卡常题呢....虽说有 50 个数据点...

果然还是道好题

noteskey

总之就是补集转化的思想,算出每种颜色选点的总方案减去不可行方案(就是不包含 该种颜色的点的区间选取方案)就是每种颜色的贡献

然后就是考虑每种颜色把一个区间分成若干份,那么我们只需要算出这若干份区间内的子区间个数就行了

具体操作也就是考虑每次加入一个点后会减去原来区间的贡献然后加上新的两个区间的贡献

那么删除点也是同理

复杂度 \((n+m)log(n+m)\) ,说白了就是 \(O(n ~log ~n)\)

watch out

要注意的就是这里需要离散化,当然修改操作中的值也是要加进离散化的数组中的,具体离散是开数组还是用 vector 就看喜好了...

code

代码还是比较短的,Ynoi 里这么短的代码都没有多少的...

//by Judge
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define Rg register
#define Pi pair<int,int>
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=19260817;
const int M=5e5+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int dec(int x,int y){return x<y?x-y+mod:x-y;}
inline int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline bool cmax(int& a,int b){return a<b?a=b,1:0;}
inline bool cmin(int& a,int b){return a>b?a=b,1:0;}
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,m,ans,Ynoi=1; arr L,R,pos,len,a,inv,LN,ept,P;
set<int> s[M]; vector<int> lr; map<Pi,int> gx;
struct opts{ int x,y,z; }q[M];
inline int C2(int x){return (1ll*x*(x-1)>>1)%mod;}
inline int INV(int x){return x<=5e5?inv[x]:mul(mod-mod/x,INV(mod%x));}
#define LL long long
#define pii Pi
#define md mod
inline void insert(int col,int x){
int pre=*--s[col].lower_bound(x),suf=*s[col].upper_bound(x);
cmax(pre,L[pos[x]]-1),cmin(suf,R[pos[x]]+1); Pi xb=Pi(pos[x],col);
if(!gx.count(xb)) gx[xb]=C2(len[pos[x]]+1); int &v=gx[xb];
ans=inc(ans,ept[col]?0:LN[col]),LN[col]=mul(LN[col],INV(v));
v=inc(dec(v,C2(suf-pre)),inc(C2(x-pre),C2(suf-x)));
if(v) LN[col]=mul(LN[col],v); else ++ept[col];
ans=dec(ans,ept[col]?0:LN[col]),s[col].insert(x);
}
inline void erase(int col,int x){
int pre=*--s[col].lower_bound(x),suf=*s[col].upper_bound(x);
cmax(pre,L[pos[x]]-1),cmin(suf,R[pos[x]]+1); Pi xb=Pi(pos[x],col);
if(!gx.count(xb)) gx[xb]=C2(len[pos[x]]+1); int& v=gx[xb];
ans=inc(ans,ept[col]?0:LN[col]);
if(!v) --ept[col]; else LN[col]=mul(LN[col],INV(v));
v=dec(inc(v,C2(suf-pre)),inc(C2(x-pre),C2(suf-x))),LN[col]=mul(LN[col],v);
ans=dec(ans,ept[col]?0:LN[col]),s[col].erase(x);
}
int main(){ n=read(),m=read(),inv[1]=1;
fp(i,2,5e5) inv[i]=mul(mod-mod/i,inv[mod%i]);
fp(i,1,n) len[i]=read(),L[i]=R[i-1]+1,R[i]=R[i-1]+len[i],
Ynoi=mul(Ynoi,C2(len[i]+1)),P[i]=P[i-1]+len[i];
fp(i,1,n) fp(j,L[i],R[i]) pos[j]=i,a[j]=read(),lr.push_back(a[j]);
fp(i,1,m) q[i].x=read(),q[i].y=read(),q[i].z=read(),lr.push_back(q[i].z);
sort(lr.begin(),lr.end()),lr.erase(unique(lr.begin(),lr.end()),lr.end());
fp(i,0,lr.size()) s[i].insert(0),s[i].insert(R[n]+1),LN[i]=Ynoi;
fp(i,1,R[n]) a[i]=lower_bound(lr.begin(),lr.end(),a[i])-lr.begin(),insert(a[i],i);
for(Rg int i=(print(ans),1);i<=m;++i,print(ans)){ int id=P[q[i].x-1]+q[i].y;
erase(a[id],id),insert(a[id]=lower_bound(lr.begin(),lr.end(),q[i].z)-lr.begin(),id);
} return Ot(),0;
}

题解 P4692 【[Ynoi2016]谁的梦】的更多相关文章

  1. P4692 [Ynoi2016]谁的梦

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

  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. 6.25考试整理:江城唱晚&&不老梦&&棠梨煎雪——题解

    按照旧例,先安利一下主要作者:一扶苏一 以及扶苏一直挂念的——银临姐姐:银临_百度百科 (滑稽) 好哒,现在步入正题: 先看第一题: 题解: 在NOIP范围内,看到“求方案数”,就说明这个题是一个计数 ...

  5. UVA540 Team Queue——题解 by hyl天梦

    UVA540 Team Queue 题解 题目描述:题目原题 https://vjudge.net/problem/UVA-540 Queues and Priority Queues are dat ...

  6. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

    题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...

  7. 洛谷P1554 梦中的统计 题解

    题目传送门 这道题暴力又让我过了...数据真的很水(luogu) 暴力枚举n~m的每个数,再统计一次,交付评测...AC #include<bits/stdc++.h> using nam ...

  8. 51nod 算法马拉松17 解题报告 以后不能赛中写题解(查逐梦者抄袭本人代码...

    B题(数学题: 问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式  如果可以 输出 m%1e9+7 否则 输出no n<=1e18 刚看题没思路 暴力一下 ...

  9. [Ynoi2016]掉进兔子洞 题解

    题面传送门:https://www.luogu.org/problemnew/show/P4688 (温馨提示,请直接翻至题目描述部分) 1e5的数据范围,以及对区间每个权值出现次数取min此类主席树 ...

随机推荐

  1. VirtualBox修改UUID实现虚拟硬盘的重复利用

    其实,记录这个是为了留给自己看.每次用每次查,已经老到什么东西都记不住了.本次查询是从这里(VirtualBox 修改UUID实现虚拟硬盘复制)获得帮助的,感谢. 在VirtualBox把一个已经使用 ...

  2. Lepus搭建企业级数据库全方位监控系统

    前言 Lepus(天兔)数据库企业监控系统是一套由专业DBA针对互联网企业开发的一款专业.强大的企业数据库监控管理系统,企业通过Lepus可以对数据库的实时健康和各种性能指标进行全方位的监控.目前已经 ...

  3. Windows 支持 OpenSSH 了!

    从 Win10 1809 和 Windows Server 2019 开始 Windows 开始支持 OpenSSH Server.本文介绍一下其基本的概念和配置方法,本文演示用的环境为 Win10 ...

  4. JShell脚本工具

    JShell脚本工具是JDK9的新特性 什么时候会用到 JShell 工具呢,当我们编写的代码非常少的时候,而又不愿意编写类,main方法,也不愿意去编译和运行,这个时候可以使用JShell工具.启动 ...

  5. 剖析height百分比和min-height百分比

    height的百分比 当我们给块元素设置百分比高度时,往往没能看到效果.因为百分比的大小是相对其最近的父级元素的高的大小,也就是说,其最近的父级元素应该有一个明确的高度值才能使其百分比高度生效. &l ...

  6. python dlib opencv 人脸68点特征检测

    不得不感慨,现在现成的东西太多了,直接拿来用就行了 dlib安装(指定版本安装,避免踩坑) pip dlib中训练好的文件http://dlib.net/files/shape_predictor_6 ...

  7. ABP mysql

    SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator ...

  8. AngularJS 1.x系列:AngularJS控制器(3)

    1. 控制器(Controller)定义 控制器(Controller)在AngularJS中作用是增强视图(View),AngularJS控制器是一个构造方法,用来向视图(View)中添加额外功能. ...

  9. Elasticsearch6.x和Kibana6.x的安装

    Elasticsearch6.x的安装(centos6.x下) Elasticsearch6.x目前需要至少jdk8的支持,关于如何安装jdk不在讲述.Oracle的推荐安装文档可以在Oracle的网 ...

  10. Java【第四篇】基本语法之--循环

    循环语句功能 在循环条件满足的情况下,反复执行特定代码 循环语句的四个组成部分 初始化部分(init_statement)循环条件部分(test_exp) 循环体部分(body_statement) ...