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 ...
随机推荐
- 字符串、数组、json
一.字符串 string 1.字符串的定义: (1).var s="haha"; (2).var s=new string ("hello") 对象形式定义 2 ...
- qt read excel
void exceladapter::readfile(QString filename, QString sheetname, int colNo){ QSqlDatabase db = QSqlD ...
- 项目适配iOS9遇到的一些问题及解决办法 ,以及URL 白名单配置方法
1.网络请求报错.升级Xcode 7.0发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Secur ...
- Vue踩坑第一步,安装Vue最新版本
学习vue第一步肯定是安装vue-cli,那么肯定想去搜下如何安装vue-cli呢? 网上搜到的结果大都是: npm i vue-cli -g 输入vue -V发现: 输入node -v发现: 自己明 ...
- js 字符串截取 substring() 方法、 substr() 方法、slice() 方法、split() 、join();
三种 js 截取字符串的方法: substring() 方法: substr() 方法: slice() 方法: 1.:substring() 方法:string.substring(from, to ...
- 请简述HTML和XHTML最重要的4点不同?
请简述HTML和XHTML最重要的4点不同? 不同: XHTML要求正确嵌套 XHTML 所有元素必须关闭 XHTML 区分大小 ...
- atoi (String to Integer) leetcode
将字符串转化为数字,其注意事项有: Requirements for atoi: The function first discards as many whitespace characters a ...
- Open Cascade创建自己的MFC文档程序
项目初始设置在Visual studio中创建一个单文档MFC项目(本例以MFCTest为名称): 在项目属性的VC++页面设置包含目录.库目录,在链接器的输入中添加OCC库目录下的所有.lib文件名 ...
- Eclipse 下载 开源项目 maven依赖丢失和 Deployment Assembly 丢失
周末下载了最新的jeecg的源码来瞅瞅,但是下载后发现,pom文件中定义的依赖都丢失了. 如下图 上网搜索了一下啊,发现需要先给这个项目这个项目 disable maven nature 然后再添加上 ...
- LInux设备驱动分析—— kmalloc和kzalloc函数
今晚在研究EVM5728开发板上面Linux系统的IIC设备驱动程序,偶然之间看到驱动程序中有一处使用了kzalloc函数,本人之前都是使用Linux内核提供的kmalloc / kfree函数来给设 ...