CF788E:New task
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的更多相关文章
- 服务器卡死,重启报错: INFO: task blocked for more than 120 seconds
问题:服务器负载很高,但是CPU利用率不高.服务器经常夯住,网站打不开,SSH连接非常不稳定,输入命令夯住. 重启服务器报错: INFO: task blocked for more than 120 ...
- 并行模式库PPL应用实战(一):使用task类创建并行任务
自 VS2010 起,微软就在 CRT 中集成了并发运行时(Concurrency Runtime),并行模式库(PPL,Parallel Patterns Library)是其中的一个重要组成部分. ...
- 运行gulp项目报错:AssertionError: Task function must be specified。
一.问题描述: gulp项目在本地windows 10机器上跑没有任何问题,但是放在centos 7虚拟机上跑报错:AssertionError: Task function must be spec ...
- [No0000181]改善C#程序的建议9:使用Task代替ThreadPool和Thread
一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread
一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...
- 编写高质量代码改善C#程序的157个建议——建议80:用Task代替ThreadPool
建议80:用Task代替ThreadPool ThreadPool相对于Thread来说具有很多优势,但是ThreadPool在使用上却存在一定的不方便.比如: ThreadPool不支持线程的取消. ...
- Mac启动时:boot task failed:fsck-safe处理办法
mac系统启动到一半,然后突然关机,查看启动信息发现:boot task failed:fsck-safe 处理方法,clover启动的时候按空格,然后选择sigle mode. 进入使用命令:fsc ...
- .NET 4中的多线程编程之一:使用Task(转载)
原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...
- The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemE:Easy Task
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2969 全场第一水题.我不知道怎么解释,看代码就好了... #include ...
随机推荐
- AJPFX总结方法重载与方法重写的区别
方法重载在同一个类中,可以出现同名方法,但是这些同名方法的参数列表必须不同,这样定义方法叫做方法重载.方法重载的特点重载的注意事项重载与返回值无关重载与具体的变量标识符无关重载只与方法名与参数相关重载 ...
- 初识node,原理与浏览器何其相似
话不多说,直接上图. 今日入手开始学习Nodejs,加油吧,小小前端的大V梦ヾ(◍°∇°◍)ノ゙
- JVM内存区域参数配置
转自:https://www.jianshu.com/p/5946c0a414b5 需要提前了解的知识点: JVM内存模型 JVM垃圾回收算法 下图是JVM内存区域划分的逻辑图 JVM内存区域逻辑 ...
- Knockout-了解Observable与computed
KO是什么? KO不是万能的,它的出现主要是为了方便的解决下面的问题: UI元素较多,用户交互比较频繁,需要编写大量的手工代码维护UI元素的状态.样式等属性? UI元素之间关系比较紧密,比如操作一个元 ...
- NSValue的个人想法
通过下面的代码,又可以将NSValue转换成CGRect,CGPoint等类型的数值. CGRect imageRect = [[self.lockImageRectArray objectAtInd ...
- Visual studio每次build自动增加版本号
关键词:visual studio,rc file,VS_VERSION_INFO,FILEVERSION,PRODUCTVERSION 目标:希望每次在vs中编译项目时,生成的可执行程序版本号自动+ ...
- js函数中获得当前被点击元素
问题描述:在html页面中点击<a>或者’按钮‘,进入js中的函数,在js函数中获得被点击那个<a>或‘按钮’元素 解决方法:方法一: html中: <a>标签:& ...
- asp.net mvc 5 微信接入VB版 - 获取AccessToken
获取AccessToken是微信接入的又一个基础操作.很多微信接口需要这个2小时一刷新的AccessToken作为参数. 转载请说明作者Nukepayload2 首先根据开发文档把获取AccessTo ...
- 云梯互联:所有主机已全面支持免费SSL!附小白配置教程。
HTTPS和HTTP的区别:1.HTTPS是加密传输协议,HTTP是名文传输协议;2.HTTPS需要用到SSL证书,而HTTP不用;3.HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO4. ...
- oracle的系统表
-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图-- DBA_TABLES意为DBA拥有的或可以访问的所有的关系表.-- ALL_TABLES意为某一 ...