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. Elasticsearch (1) - 索引库 文档 分词

    创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档.它就相当于MySQL中的表,或相当于Mongodb中的集合. 关于索引这个语: 索引(名词):E ...

  2. Git之提交项目到远程github

    1.在分支dev下,默认本地工作区有项目project 2. git add project  [添加项目到暂存区] 3. git commit project -m "提交项目" ...

  3. re正则表达式2

    1.“字符*” 匹配*前面的字符0次或者多次. 注意:是匹配*前一个字符,只能是*前一个字符多次打印出来.*前面其他的字符相当于前缀会打印出来,但是不会再匹配. *前一个字符前面的其他字符里的首字符先 ...

  4. shutil模块详解2

    1.shutil.make_archive() 实际上是调用了两个模块来实现压缩打包的功能. zipfile和tarfile两个模块,shutil的两个封装的模块. zip是压缩文件,文件内存会变小, ...

  5. 搜索模板elasticsearch

    搜索: like 对中文分词效率与支持都不太友好elasticsearch 实时的(效率高).分布式(可扩展)的搜索和分析引擎,基于Lucene全文搜索引擎工具包,算法基于倒排索引算法(eg:一篇文章 ...

  6. Quartz使用一 通过getJobDataMap传递数据

    Quartz定时器使用比较广泛,介绍一点简单的使用 上代码:定义一个Job,执行具体的任务 package org.tonny.quartz; import java.text.SimpleDateF ...

  7. Types of Security Vulnerabilities

    1)内存空间安全.2)参量级别数据安全:3)通信级别数据安全:4)数据访问控制:5)通信对象身份确认. https://developer.apple.com/library/content/docu ...

  8. WPF知识点全攻略00- 目录

    知识点目录如下: 1.WPF相对WinFrom的优缺点 2.WPF体系结构 3.XAML 4.XAML页面布局 5.XAML内容控件 6.WPF中的“树” 7.Binding 8.依赖属性 9.附加属 ...

  9. Java中Synchronized和Lock的使用

    Lock的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的 synchronized在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线 ...

  10. 查看mysql二进制日志报错问题

    在排查网站被黑时想通过Mysql二进制日志找出修改字段时间,但是使用mysqlbinlog报错: [root@zfszsw1 bin]# ./mysqlbinlog /opt/mysql-bin.00 ...