题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1。 有单点修改和区间查询。

思路:46min交了第一发树套树,T了。 稍加优化多交几次就过了。

不难想到,除了L这个点,其他的点都可以只统计这一段的段首。把位置看成x,颜色看成y,就成了二维平面就矩形内点的个数,这就是裸的树套树或者CDQ了。

树套树:34**ms。

/*
2019南昌网络赛I。
询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1。 有单点修改和区间查询。
也可以CDQ来做,常数小很多。
*/
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct in{
int l,r,sum;
}s[maxn*];
int a[maxn],rt[maxn],N,M,cnt;
void add(int &Now,int L,int R,int pos,int v)
{
if(!Now) Now=++cnt; s[Now].sum+=v;
if(L==R) return ;int Mid=(L+R)>>;
if(pos<=Mid) add(s[Now].l,L,Mid,pos,v);
else add(s[Now].r,Mid+,R,pos,v);
}
void Add(int x,int pos,int v)
{
while(x<=N){
add(rt[x],,N,pos,v);
x+=(-x)&x;
}
}
int query(int Now,int L,int R,int l,int r)
{
if(!Now||s[Now].sum==) return ;
if(l<=L&&r>=R) return s[Now].sum;
int Mid=(L+R)>>,res=;
if(l<=Mid) res+=query(s[Now].l,L,Mid,l,r);
if(r>Mid) res+=query(s[Now].r,Mid+,R,l,r);
return res;
}
int Query(int x,int L,int R)
{
if(L>R||x==) return ;
int res=; while(x){
res+=query(rt[x],,N,L,R);
x-=(-x)&x;
} return res;
}
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
int main()
{
scanf("%d%d",&N,&M);
rep(i,,N) {
read(a[i]);
if(a[i]!=a[i-]) Add(i,a[i],);
}
int opt,pos,L,R,x,y;
while(M--){
read(opt);
if(opt==){
read(L); read(R); read(x); read(y);
int ans=Query(R,x,y)-Query(L-,x,y);
if(a[L]==a[L-]&&a[L]<=y&&a[L]>=x) ans++;
printf("%d\n",ans);
}
else {
read(pos); read(x);
if(a[pos]==x) continue;
if(a[pos]!=a[pos-]) Add(pos,a[pos],-);
if(pos+!=N&&a[pos+]!=a[pos]) Add(pos+,a[pos+],-);
a[pos]=x;
if(a[pos]!=a[pos-]) Add(pos,a[pos],);
if(pos+!=N&&a[pos+]!=a[pos]) Add(pos+,a[pos+],);
}
}
return ;
}

CDQ:700ms。

/*
2019南昌网络赛I:
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct in{
int opt,x,y,z,id;
//opt=0是修改,否则是查询。
//opt=1表示时间为x,查询[1,x],[y,z]的矩形面积
//时间为第一维,x为第二维,y到z为第三维
}s[maxn<<],q[maxn<<];
int c[maxn],ans[maxn],tot,Q;
int sum[maxn],N,M;
void add(int x,int val)
{
for(int i=x;i<=N;i+=(-i)&i) sum[i]+=val;
}
int query(int x){
int res=;
for(int i=x;i;i-=(-i)&i) res+=sum[i];
return res;
}
void CDQ(int y,int z,int L,int R) //x在[y,z]区间,操作在[L,R]。 不停地对x进行分治,并把[L,R]进行相应的划分
{
if(L>=R) return ;
if(y>z) return ;
if(y==z){ //特殊的一行
rep(i,L,R) {
if(!s[i].opt) add(s[i].y,s[i].z);
if(s[i].opt!=) ans[s[i].id]+=s[i].opt*(query(s[i].z)-query(s[i].y-));
}
rep(i,L,R) if(!s[i].opt) add(s[i].y,-s[i].z);
return ;
}
int Mid=(y+z)>>,F=L,C=L;
rep(i,L,R) {
if(s[i].x<=Mid) C++;
if(!s[i].opt&&s[i].x<=Mid) add(s[i].y,s[i].z);
if(s[i].opt!=&&s[i].x>Mid) ans[s[i].id]+=s[i].opt*(query(s[i].z)-query(s[i].y-));
}
rep(i,L,R) if(!s[i].opt&&s[i].x<=Mid) add(s[i].y,-s[i].z);
rep(i,L,R) if(s[i].x<=Mid) q[F++]=s[i]; else q[C++]=s[i];
rep(i,L,R) s[i]=q[i];
CDQ(y,Mid,L,F-); CDQ(Mid+,z,F,R);
}
int main()
{
scanf("%d%d",&N,&M);
rep(i,,N) {
scanf("%d",&c[i]);
if(c[i]!=c[i-]) s[++tot]=in{,i,c[i],,};
}
int opt,L,R,x,y;
rep(i,,M){
scanf("%d",&opt);
if(opt&){
scanf("%d%d",&x,&y);
if(y==c[x]) continue;
if(c[x]!=c[x-]) s[++tot]=in{,x,c[x],-,};
if(x<N&&c[x]!=c[x+]) s[++tot]=in{,x+,c[x+],-,};
c[x]=y;
if(c[x]!=c[x-]) s[++tot]=in{,x,c[x],,};
if(x<N&&c[x]!=c[x+]) s[++tot]=in{,x+,c[x+],,};
}
else {
scanf("%d%d%d%d",&L,&R,&x,&y); Q++;
s[++tot]=in{,R,x,y,Q};
s[++tot]=in{-,L,x,y,Q};
if(c[L]>=x&&c[L]<=y) ans[Q]++;
}
}
CDQ(,N,,tot);
rep(i,,Q) printf("%d\n",ans[i]);
return ;
}

2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)的更多相关文章

  1. 2019 ICPC 南昌网络赛I:Yukino With Subinterval(CDQ分治)

    Yukino With Subinterval Yukino has an array a_1, a_2 \cdots a_na1,a2⋯*a**n*. As a tsundere girl, Yuk ...

  2. 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治

    TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...

  3. 2019icpc徐州现场赛 H Yuuki and a problem (树状数组套主席树)

    题意 2e5的数组,q个操作 1.将\(a[x]\)改为y 2.求下标l到r内所有的\(a[i]\)通过加法不能构成的最小的值 思路 通过二操作可以知道需要提取l到r内的值及其数量,而提取下标为l到r ...

  4. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  5. 13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 2224: Boring Counting Time Limit: 3 Sec   ...

  6. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  7. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  8. 2019南昌网络赛 hello 2019

    这道题和一道2017,2016的类似. A string t is called nice if a string “2017” occurs in t as a subsequence but a ...

  9. 2019南昌网络赛G. tsy's number

    题意:\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\frac{\phi(i)*\phi(j^2)*\phi(k^3)}{\phi(i)*\phi(j)*\phi(k)} ...

随机推荐

  1. Golang 基础语法介绍及对比(二)

    传值与传参 Golong func main() { a := fmt.Println("a = ", a) // 应该输出 "a= 3" a1 := add1 ...

  2. Scala字符串插值 - StringContext

    翻译自:STRING INTERPOLATION 简介 自2.10.0版本开始,Scala提供了一种新的机制来根据数据生成字符串:字符串插值.字符串插值允许使用者将变量引用直接插入处理过的字面字符中. ...

  3. C# API强制关机、重启以及注销计算机

    在Windows系统中有2种方式进行关机.重启以及注销计算机操作: 1.使用shutdown()命令:2.使用系统API: 以下是使用系统API进行操作的实例. 程序实例界面: 程序实例代码: 1 u ...

  4. HTML连载26-谷歌开发者工具其它作用&CSS继承性

    一.谷歌开发者工具其他特性(谷歌浏览器快捷键F12) (1)元素选择, 在里面我们可以看到某些行的具体代码 (2)查看源代码 (3)该元素的样式显示,我们可以看到我们选中的元素的具体样式属性,可以在里 ...

  5. linux centos安装教程

    linux centos安装教程1 CentOS-7-x86_64-DVD-1511.iso 这个是dvd版本 2 CentOS-7-x86_64-Minimal-1511.iso 这个迷你版 是没有 ...

  6. go-gin-api 路由中间件 - 日志记录

    概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可. ...

  7. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  8. Aladdin and the Flying Carpet LightOJ 1341 唯一分解定理

    题意:给出a,b,问有多少种长方形满足面积为a,最短边>=b? 首先简单讲一下唯一分解定理. 唯一分解定理:任何一个自然数N,都可以满足:,pi是质数. 且N的正因子个数为(1+a1)*(1+a ...

  9. D-Bus

    D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信.它是个3层架构的IPC 系统,包括: 1.函数库libdbus ,用于两个应用程序互相联系和交互消息. 2.一 ...

  10. EWS:邮箱的一个开放的接口服务

    https://3gstudent.github.io/3gstudent.github.io/Exchange-Web-Service(EWS)%E5%BC%80%E5%8F%91%E6%8C%87 ...