n个数字中,每个数有数字A和属性B,每次操作将某个点x的属性B改变为0或1,求满足这样要求的子序列的个数:

下标a<b<c<d<e,而Aa<=Ab=Ac=Ad>=Ae且Bb=Bc=Bd=1。

区间操作,首推线段树!(然后就不会了,跑去看别人的代码)

是这样的,重点在于中间那三个点,因为我们的修改操作只会影响修改的点的值的答案。

直接维护一个这样的子序列不太容易,所以多维护Aa<=Ab和Aa<=Ab=Ac和Ac=Ad>=Ae和Ad>=Ae的序列,然后线段树up的时候才可以左右合并答案。

大体思路就这样,由于线段树是要按照值来建的,也就是给每个值一棵线段树,为方便调值先离散化。

Aa<=Ab和Ad>=Ae即每个点左边<=它和右边<=它的数,可以用树状数组预处理,详见代码。

线段树中的信息用到“当前这棵子线段树的数的个数”size,以及上面提到的四个序列长度A,AB,BC,C,还有答案ABC。

在线段树叶子节点只算A,C和size,其他数组慢慢合并,详见代码中up。

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstdlib>
#include<cstring>
//#include<iostream>
using namespace std; int n;
#define maxn 200011
struct BIT
{
int a[maxn];
void clear() {memset(a,,sizeof(a));}
int lowbit(int x) {return x&-x;}
void add(int x,int v)
{
for (;x<=n;x+=lowbit(x)) a[x]+=v;
}
int query(int x)
{
int ans=;
for (;x;x-=lowbit(x)) ans+=a[x];
return ans;
}
}bit;
const int mod=;
int Left[maxn],Right[maxn];
#define maxs 2000011
struct segmenttree
{
struct Node
{
int size,A,C,AB,BC,ABC;
int son[];
}a[maxs];
int size;
segmenttree() {size=;}
void up(int x)
{
const int &p=a[x].son[],&q=a[x].son[];
a[x].size=a[p].size+a[q].size;
a[x].A=(a[p].A+a[q].A)%mod;
a[x].C=(a[p].C+a[q].C)%mod;
a[x].AB=(a[p].AB+a[q].AB+a[p].A*1ll*a[q].size)%mod;
a[x].BC=(a[p].BC+a[q].BC+a[p].size*1ll*a[q].C)%mod;
a[x].ABC=(a[p].ABC+a[q].ABC+1ll*a[p].A*a[q].BC+1ll*a[p].AB*a[q].C)%mod;
}
void modify(int &x,int L,int R,int id,int v)
{
if (!x) x=++size;
if (L==R)
{
a[x].size=v*;
a[x].A=v*Left[id];
a[x].C=v*Right[id];
a[x].AB=a[x].BC=a[x].ABC=;
a[x].son[]=a[x].son[]=;
}
else
{
const int mid=(L+R)>>;
if (id<=mid) modify(a[x].son[],L,mid,id,v);
else modify(a[x].son[],mid+,R,id,v);
up(x);
}
}
}seg;
struct Point
{
int v,id;
bool operator < (const Point &b) const {return v<b.v;}
}b[maxn];
int a[maxn],cnt=;
int root[maxn];
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&b[b[i].id=i].v);
sort(b+,b++n);
a[b[].id]=cnt=;
for (int i=;i<=n;i++)
{
if (b[i].v!=b[i-].v) cnt++;
a[b[i].id]=cnt;
}
memset(Left,,sizeof(Left));
memset(Right,,sizeof(Right));
bit.clear();
for (int i=;i<=n;i++)
{
Left[i]=bit.query(a[i]);
bit.add(a[i],);
}
bit.clear();
for (int i=n;i>=;i--)
{
Right[i]=bit.query(a[i]);
bit.add(a[i],);
}
int ans=;
memset(root,,sizeof(root));
for (int i=;i<=n;i++)
{
ans=(ans-seg.a[root[a[i]]].ABC+mod)%mod;
seg.modify(root[a[i]],,n,i,);
ans=(ans+seg.a[root[a[i]]].ABC)%mod;
}
int m,x,y;
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
ans=(ans-seg.a[root[a[y]]].ABC+mod)%mod;
seg.modify(root[a[y]],,n,y,x-);
ans=(ans+seg.a[root[a[y]]].ABC)%mod;
printf("%d\n",ans);
}
return ;
}

CF788E:New task的更多相关文章

  1. 服务器卡死,重启报错: INFO: task blocked for more than 120 seconds

    问题:服务器负载很高,但是CPU利用率不高.服务器经常夯住,网站打不开,SSH连接非常不稳定,输入命令夯住. 重启服务器报错: INFO: task blocked for more than 120 ...

  2. 并行模式库PPL应用实战(一):使用task类创建并行任务

    自 VS2010 起,微软就在 CRT 中集成了并发运行时(Concurrency Runtime),并行模式库(PPL,Parallel Patterns Library)是其中的一个重要组成部分. ...

  3. 运行gulp项目报错:AssertionError: Task function must be specified。

    一.问题描述: gulp项目在本地windows 10机器上跑没有任何问题,但是放在centos 7虚拟机上跑报错:AssertionError: Task function must be spec ...

  4. [No0000181]改善C#程序的建议9:使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  5. 改善C#程序的建议9:使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  6. 编写高质量代码改善C#程序的157个建议——建议80:用Task代替ThreadPool

    建议80:用Task代替ThreadPool ThreadPool相对于Thread来说具有很多优势,但是ThreadPool在使用上却存在一定的不方便.比如: ThreadPool不支持线程的取消. ...

  7. Mac启动时:boot task failed:fsck-safe处理办法

    mac系统启动到一半,然后突然关机,查看启动信息发现:boot task failed:fsck-safe 处理方法,clover启动的时候按空格,然后选择sigle mode. 进入使用命令:fsc ...

  8. .NET 4中的多线程编程之一:使用Task(转载)

    原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...

  9. The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemE:Easy Task

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2969 全场第一水题.我不知道怎么解释,看代码就好了... #include ...

随机推荐

  1. AJPFX总结面向对象中成员变量和成员方法的定义

    //面向对象中成员变量和成员方法的定义格式:=========================================          成员变量定义在类中方法外,可以被该类中所有方法使用. ...

  2. Spring源码:Spring IoC容器加载过程(1)

    Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...

  3. Masonry自动布局与UIScrolView适配

    Masonry介绍 Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Max OS X.可以通过cocoa ...

  4. sql server 2012 从删库到跑路

    问题: 向sql server 2012单个数据库中导入1500万+条数据的时候,报错: 错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS_E_OLEDBERROR.出现 O ...

  5. RecyclerView 缓存机制学习笔记1

    盗用别人图片 获取VIew的方法的流程 最先调用 其次调用 这个方法调用会先去缓存 这个是是否有动画,有动画就去里面取. 如果取不到就接着调用 如果在没有继续调用 都取不到就去实例化 调用的次数取决于 ...

  6. 第一次向nodeclub提交修改

    今天第一次向nodeclub提交了两个修改,两个修改都是涉及部分浏览器的兼容性的. Manager很快合并了我的修改,好开森.晚上又重新回炉了一下git的日常操作,将git部分操作整理了一下写于此博. ...

  7. centos启用socks5服务

    直接在终端用 root 安装 *** 官方客户端 apt-get install python-pip -ypip install shadowsocks 然后编辑 /etc/shadowsocks. ...

  8. Zabbix使用外部命令fping处理ICMP ping的请求

    Zabbix使用外部命令fping处理ICMP ping的请求,fping不包含在zabbix的发行版本中,需要额外去下载安装fping程序, 安装完毕之后需要在zabinx_server.conf中 ...

  9. laravel扩展包服务提供者的注册的两种方式

    一. 包自动发现 在 Laravel 应用的配置文件 config/app.php 中,providers 配置项定义了一个会被 Laravel 加载的服务提供者列表.当安装完新的扩展包后,在老版本中 ...

  10. 1.1 NLP基础技能,字符串的处理

    #!/usr/bin/env python # coding: utf-8 # # 字符串操作 # ### 去空格和特殊字符 # In[8]: s = " hello world! &quo ...