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. [ Luogu 3709 ] 大爷的字符串题

    \(\\\) Description 原题题面太过混乱出题人语文凉凉 给出一个长为 \(n\) 的数列 \(A\) ,多次询问: 对于一个区间 \([L_i,R_i]\),把区间内的所有数最少划分成多 ...

  2. [BZOJ1040][ZJOI2008]骑士 基环树DP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目给出了$n$个点和$n$条无向边,即一棵基环树或者基环树森林. 如果题目给的关系 ...

  3. mongodb的安装及配置安装服务

    1. 安装mongodb数据库 mongodb官方网址:https://www.mongodb.org 安装好之后的步奏: 第一步:规划你的安装目录和数据库文件的存储路径,我打算将Mongo的程序文件 ...

  4. 第3章 接口与API设计 52条笔记

    第3章 接口与API设计 52条笔记 第15条: 用前缀避免命名空间冲突 Objective-C 没有其他语言那种内置的命名空间机制 .鉴于此,我们在起名时要设法避免潜在的命名冲突,否则很容易就重名了 ...

  5. JS实现让其他浏览器自动转至微信浏览器打开链接

    //判断是否是pc function is_pc() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...

  6. Oracle的Central Inventory和Local inventory详解

    很多朋友对Oracle的inventory信息不太了解以至遇到相关的问题不知道如何处理,这篇文章我们将详细讲解Oracle的Central Inventory (oraInventory)和Local ...

  7. 谷歌 滚动条样式 scrollbar

    谷歌  滚动条样式 scrollbar main.less :: 是css3 最新的伪类 /*滚动条整体样式*/ ::-webkit-scrollbar { width: 10px; height: ...

  8. python基础一 day9 函数升阶(1)

    函数 可读性强 复用性强def 函数名(): 函数体 return 返回值所有的函数 只定义不调用就一定不执行 先定义后调用 函数名() #不接收返回值返回值 = 函数名() #接收返回值 返回值 没 ...

  9. 枚举 || CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution

    给出N*M矩阵,对于该矩阵有两种操作: 1.交换两列,对于整个矩阵只能操作一次 2.每行交换两个数. 交换后是否可以使每行都递增. *解法:N与M均为20,直接枚举所有可能的交换结果,进行判断 每次枚 ...

  10. JavaSE-25 AWT

    学习要点 关于AWT AWT容器 布局管理器 AWT组件 事件处理 关于AWT java.awt包与子包 AWT软件包 说明 import  java.awt.*; 基本组件使用工具 import  ...