【SRM-06 D】五色战队&&【codeforces 788E】 New task
原题链接:788E - New task
Description
游行寺家里人们的发色多种多样,有基佬紫、原谅绿、少女粉、高级黑、相簿白等。
日向彼方:吾令人观其气,气成五彩,此天子气也。
琉璃:我们是不是可以组个五人战队了?
游行寺家的n个人排成一排。第i个人的发色是Ai。
能组成战队的条件是:
那五人假设是第a,b,c,d,e人(),需要满足
中间的三人称为有头者,最旁边俩人称为学姐。
根据字面意思,有头者一定要有头,学姐可以无头。
反正就是b,c,d这三人一定要有头。
有着恶趣味的琉璃每次操作会把一个人 变成有头或者无头,
每次操作后琉璃想知道游行寺家可能产生多少种不同的战队。只要有成员不同,俩战队就是不同的。
Input
第一行一个整数n,第二行n个整数表示人们的发色。
第三行一个整数m,表示操作数。
接下来有m行,每行第一个数表示操作类型,第二个数表示被操作那人的编号。
类型为1就是把他变无头,类型2就是变有头。
Output
每次操作后输出答案,答案对10^9+7取模
Sample Input
8
3 4 4 2 4 5 4 1
3
1 5
2 5
1 2
Sample Output
1
6
2
HINT
对于100%的数据:
扔在最前面的碎碎念:
一开始真的不知道怎么写……于是盯着别人的代码研究了好久。在这道题上卡了一个上午……最后发现数组开小了(那一刻有种想打死自己的冲动。通过后又发现时间和空间都跟标程差很多……想了想建树的方式好像可以优化?于是改了一波。最后的代码跑得跟标程差不多快>_<敲开心。
子序列要求:且
。
大体思路就是:离散化→树状数组预处理出L、R数组→对每个值建一棵子线段树→在子线段树上进行操作。
在离散化时可以处理的信息:1.num[i]:第i个点离散化后的数值,2.s[i]:值为i的点数,3.p[i]:第i个点在1~s[num[i]]中的位置。
利用树状数组预处理的信息:1.L[i]:在第i个点左边且数值不大于点i的数值的点数,2.R[i]:在第i个点右边且数值不大于点i的数值的点数。
子线段树上的结点需要维护这几个信息:1.l&r:左右儿子,2.sz:区间内点数(即可以作为有头者的点数),3.s[1]:区间内a,b的方案数,4.s[2]:区间内a,b,c的方案数,5.s[3]:区间内a,b,c,d,e的方案数,6.s[4]:区间内c,d,e的方案数,7.s[5]:区间内d,e的方案数。s数组可由左右儿子的信息合并得到。
其余的详见代码=v=(其实只是因为我懒)
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=1e5+;
const int mod=1e9+;
int n,m,cnt,sum,x,y,last;
int num[N],t[N],L[N],R[N],root[N],s[N],p[N],ans;
struct node{int w,pos;}a[N];
struct tree{int l,r,sz,s[];}tr[N*];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(x=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
bool cmp(node a,node b){return a.w==b.w?a.pos<b.pos:a.w<b.w;}
int lowbit(int x){return x&(-x);}
void insert(int x)
{
while(x<=n)
{
t[x]++;
x+=lowbit(x);
}
}
int query(int x)
{
int ans=;
while(x){ans+=t[x];x-=lowbit(x);}
return ans;
}
void up(int x)
{
int l=tr[x].l,r=tr[x].r;
tr[x].sz=(tr[l].sz+tr[r].sz)%mod;
tr[x].s[]=(tr[l].s[]+tr[r].s[])%mod;
tr[x].s[]=(tr[l].s[]+tr[r].s[])%mod;
tr[x].s[]=(tr[l].s[]+tr[r].s[]+(LL)tr[l].s[]*tr[r].sz)%mod;
tr[x].s[]=(tr[l].s[]+tr[r].s[]+(LL)tr[l].sz*tr[r].s[])%mod;
tr[x].s[]=(tr[l].s[]+tr[r].s[]+(LL)tr[l].s[]*tr[r].s[]+(LL)tr[l].s[]*tr[r].s[])%mod;
//LL!!!
}
void change(int &x,int l,int r,int pos,int v)
{
if(x==)x=++sum;
if(l==r)
{
tr[x].sz=v*;
tr[x].s[]=v*L[pos];
tr[x].s[]=v*R[pos];
tr[x].s[]=tr[x].s[]=tr[x].s[]=;
tr[x].l=tr[x].r=;
return;
}
else
{
int mid=(l+r)>>;
if(p[pos]<=mid)change(tr[x].l,l,mid,pos,v);
else change(tr[x].r,mid+,r,pos,v);
up(x);
}
}
int main()
{
n=read();
for(int i=;i<=n;i++)
a[i].w=read(),a[i].pos=i;
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)
{
if(a[i].w!=a[i-].w)
{
if(cnt)s[cnt]=i--last;
last=i-;
cnt++;
}
num[a[i].pos]=cnt;
p[a[i].pos]=i-last;
}
s[cnt]=n-last;
for(int i=;i<=n;i++)
L[i]=query(num[i]),insert(num[i]);
memset(t,,sizeof(t));
for(int i=n;i>=;i--)
R[i]=query(num[i]),insert(num[i]);
for(int i=;i<=n;i++)
{
ans=(ans-tr[root[num[i]]].s[]+mod)%mod;
change(root[num[i]],,s[num[i]],i,);
ans=(ans+tr[root[num[i]]].s[])%mod;
}
m=read();
for(int i=;i<=m;i++)
{
x=read();y=read();
ans=(ans-tr[root[num[y]]].s[]+mod)%mod;
change(root[num[y]],,s[num[y]],y,x-);
ans=(ans+tr[root[num[y]]].s[])%mod;
printf("%d\n",ans);
}
return ;
}
【SRM-06 D】五色战队&&【codeforces 788E】 New task的更多相关文章
- Codeforces 788E - New task(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1E,而且被!我!自!己!搞!出!来!了! 虽然我承认它难度及摆放的位置异常异常虚高,并且就算我到了现场也不可 ...
- {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队
D 五色战队 SRM 06 背景&&描述 游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等. 日向彼方:吾令人观其气,气成五彩, ...
- 汕头市队赛 SRM 06 C 秀恩爱
C 秀恩爱 SRM 06 背景&&描述 KPM坐在直升机上俯瞰小渔村景象. 渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,s ...
- 汕头市队赛 SRM 06 A 撕书
A 撕书 SRM 06 背景&&描述 游行寺汀正在杀书. 书总共有n页,每页都可以看作是一个小写英文字母,所以我们可以把书看成长度为n的字符串s. 琉璃 ...
- 汕头市队赛 SRM 06 B 起伏的排名
B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. 在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名. ...
- New task CodeForces - 788E (线段树优化dp)
比较套路的一个题, 对每个数维护一颗线段树来转移就好了. #include <iostream> #include <algorithm> #include <cstdi ...
- ContestHunter暑假欢乐赛 SRM 06
T1二分check...为什么这么显然的我没看出来TAT,还在想倒着加入并查集check什么的,题写太多思维定势啦QAQ T2是NOIP题的弱化版...当时没看出来,写了个DP.可以看出这一位比上一位 ...
- 【CodeForces】788E New task
[题意]n个数,每个数有附加属性0或1,初始全为1.m个操作,每个操作可以改变一个数字的属性为0或1.对于每次操作后的序列求有多少子序列满足要求:5个数字,中间3个数相等且属性为1,左右两个数小于等于 ...
- Codeforces 653F Paper task SA
Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...
随机推荐
- luogu P4299 首都
题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...
- LOJ6089 小Y的背包计数问题(根号优化背包)
Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...
- 2019 校内赛 RPG的天赋分支(贪心)
Problem Description 很多游戏都有天赋树的概念,天赋树的不同分支具有不同的属性加成,那么合理选择分支就非常重要了.Luke最近沉迷一款RPG游戏,它的天赋树机制如下:角色具有n个可选 ...
- ArcGIS for qml - 地址地标转换为经纬度(地理编码)
实现输入地址地标转换为其经纬度 本文链接:地理编码 作者: 狐狸家的鱼 Github: 八至 一.地理编码 1.地理编码含义 地址编码(或地理编码)是使用地址中包含的信息来插入地图上的相应位置的过程. ...
- OI生涯回忆录 2018.11.12~2019.4.15
上一篇:OI生涯回忆录 2017.9.10~2018.11.11 一次逆风而行的成功,是什么都无法代替的 ………… 历经艰难 我还在走着 一 NOIP之后,全机房开始了省选知识的自学. 动态DP,LC ...
- 软件补丁问题(SPFA+位运算)
洛谷P2761 1.考虑到所有的错误只有“修复,未修复”两种情况,所以可以用0,1标记压缩状态,采用位运算减少时空浪费. 又考虑到有修复时间的关系,将时间抽象成边,将状态抽象为点(设修复为0,未修复为 ...
- SourceInsight快捷键
下载安装与设置 https://blog.csdn.net/k346k346/article/details/77412413 常用设置总结的还是比较全面的 问题: SourceInsight4.0中 ...
- 牛客网暑期ACM多校训练营 第九场
HPrefix Sum study from : https://blog.csdn.net/mitsuha_/article/details/81774727 k较小.分离x和k. 另外的可能:求a ...
- POJ 2528 Mayor's posters (线段树+离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions:75394 Accepted: 21747 ...
- tuple数组、文件操作
halcon自带案例的学习. Tuple1 := [,,,,] //数组 Number := |Tuple1| //元素个数 SingleElement := Tuple1[] Part := Tup ...