https://www.lydsy.com/JudgeOnline/problem.php?id=4597

https://www.luogu.org/problemnew/show/P4340

妄图直接暴力维护一堆东西,以直接维护题目要求的值(具体见代码...)

最后花了2个小时维护完了,A掉了,然而好像常数比别人大一倍?

上网搜题解,发现大部分东西都可以抵消掉??回想维护过程中,好像有一堆抵消掉的东西?

看来即使可以暴力维护,也还是要多观察题目性质...

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
const ll md=1e9+;
ll n,q;
ll a[];
ll pw3[];
const ll N=;
#define lc (num<<1)
#define rc (num<<1|1)
ll d1[N],d2[N],d3[N],d4[N],d5[N];
//d1:区间乘积
//d2:区间和
//d3:除了全部是乘号外,所有选择方案靠左边全是乘号一段的积的和
//d4:除了全部是乘号外,...靠右边...(带符号)
//d5:答案
//维护过程中发现d4必定为0...
/*
举例:1,2,3
1+2+3,1+2-3,1+2*3,
1-2+3,1-2-3,1-2*3,
1*2+3,1*2-3,1*2*3
d3应当维护1*6+1*2*2=10
d4应当维护3*3-3*3+2*3-2*3=0
*/
void upd(ll l,ll r,ll num)
{
d1[num]=d1[lc]*d1[rc]%md;
d2[num]=(d2[lc]+d2[rc])%md;
ll mid=l+((r-l)>>);
d3[num]=(d3[lc]*pw3[r-mid]%md+d1[lc]**pw3[r-(mid+)]%md
+d1[lc]*d3[rc]%md)%md;
d4[num]=(d4[rc]*pw3[mid-l+]%md//+d1[rc]*2*pw3[mid-l]%md
+d1[rc]*d4[lc]%md)%md;
ll d4l=(d4[lc]+d1[lc])%md,d3r=(d3[rc]+d1[rc])%md;
/*
d5[num]=(2*(r-mid)*d5[lc]%md+(r-mid)*((d5[lc]-d4l+md)%md)%md
+(mid-l+1)*((d5[rc]-d3r+md)%md)%md
+d4l*d3r%md)%md;
*/
ll m=pw3[mid-l],n=pw3[r-(mid+)];
/*
d5[num]=(2*(r-mid)*d5[lc]%md+2*(mid-l+1)*d5[rc]%md
+pw3[mid-l]*(md-2)%md*d3r%md
+(r-mid)*((d5[lc]-d4l+md)%md)%md
+(mid-l+1)*((d5[rc]-d3r+md)%md)%md
+d4l*d3r%md)%md;
*/
d5[num]=(*n*d5[lc]%md+*m*d5[rc]%md
+m*(md-)%md*d3r%md
+n*((d5[lc]-d4l+md)%md)%md
+m*((d5[rc]-d3r+md)%md)%md
+d4l*d3r%md)%md; /*
d5[num]=(2*(r-mid)*d5[lc]%md+2*(mid-l+1)*d5[rc]%md
+pw3[mid-l]*(md-2)%md*d3r%md
+(r-mid)*((d5[lc]-d4l+md)%md)%md
+
printf("1t%lld %lld %lld %lld %lld %lld %lld\n",l,r,d1[num],d2[num],
d3[num],d4[num],d5[num]);
printf("2t%lld %lld %lld\n",(r-mid)*d5[lc]%md+(mid-l+1)*d5[rc]%md,
(r-mid)*d5[lc]%md+(mid-l+1)*d5[rc]%md+pw3[mid-l]*(md-2)%md*d3r%md,
(r-mid)*((d5[lc]-d4l+md)%md)%md
+(mid-l+1)*((d5[rc]-d3r+md)%md)%md
+d4l*d3r%md);
*/
}
void pre(ll l,ll num,ll x)
{
d1[num]=x;
d2[num]=x;
d3[num]=d4[num]=;
d5[num]=x;
}
void build(ll l,ll r,ll num)
{
if(l==r) {pre(l,num,a[l]);return;}
ll mid=l+((r-l)>>);
build(l,mid,lc);build(mid+,r,rc);
upd(l,r,num);
}
void setx(ll L,ll x,ll l,ll r,ll num)
{
if(l==r) {pre(l,num,x);return;}
ll mid=l+((r-l)>>);
if(L<=mid) setx(L,x,l,mid,lc);
else setx(L,x,mid+,r,rc);
upd(l,r,num);
}
int main()
{
ll i,x,y;
pw3[]=;
for(i=;i<=;i++)
pw3[i]=pw3[i-]*%md;
scanf("%lld%lld",&n,&q);
for(i=;i<=n;i++) scanf("%lld",&a[i]);
build(,n,);
//printf("%lld %lld %lld %lld %lld",d1[1],d2[1],d3[1],d4[1],d5[1]);
while(q--)
{
scanf("%lld%lld",&x,&y);
setx(x,y,,n,);
printf("%lld\n",d5[]);
}
return ;
}

bzoj 4597||洛谷P4340 [Shoi2016]随机序列的更多相关文章

  1. [洛谷P4340][SHOI2016]随机序列

    题目大意:有$n(n\leqslant10^5)$个数,每两个数之间可以加入$+-\times$三种符号,$q(q\leqslant10^5)$次询问,每次询问修改一个数后,所有表达式可能的值的和 题 ...

  2. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  3. P4340 [SHOI2016]随机序列

    题目 P4340 [SHOI2016]随机序列 思维好题 做法 是否觉得水在于你是否发现加减是会抵消的,所以我们只用考虑乘的部分 一块乘只能前面无号(也就是前缀形式)才统计,所以用线段树维护区间前缀乘 ...

  4. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  5. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  6. bzoj 3680(洛谷1337) 吊打XXX——模拟退火

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 ...

  7. bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...

  8. Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化

    https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...

  9. bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演

    题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005   洛谷 P1447 https://www.luogu.org/ ...

随机推荐

  1. 往android的内核添加驱动及 ueventd.rc 修改【转】

    本文转载自:http://blog.csdn.net/lkqboy2599/article/details/8350100 向android的内核添加驱动,其实就是向linux内核添加驱动.主要在两个 ...

  2. LightOJ - 1030 Discovering Gold —— 期望

    题目链接:https://vjudge.net/problem/LightOJ-1030 1030 - Discovering Gold    PDF (English) Statistics For ...

  3. Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集

    题目链接:http://codeforces.com/contest/699/problem/D D. Fix a Tree time limit per test 2 seconds memory ...

  4. Codeforces Round #374 (Div. 2) B. Passwords —— 基础题

    题目链接:http://codeforces.com/contest/721/problem/B B. Passwords time limit per test 2 seconds memory l ...

  5. 人生苦短之Python发邮件

    #coding=utf-8 import smtplib from email.mime.base import MIMEBase from email.mime.image import MIMEI ...

  6. linux应用之mysql数据库的安装及配置(centos)

    CentOS下Mysql数据库的安装与配置   如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲 ...

  7. linux系统CentOS6.5下tokudb数据库引擎的安装

    tokuDB是一个关于mysql数据引擎的开源项目,官网对其特点的描述主要有三点: 1.高压缩比,官方宣称可以达到1:12. 2.高insert性能,官方称至少比innodb高9倍. 3.可以在线添加 ...

  8. HihoCoder1576 子树中的最小权值( dfs序 +线段树 || 树剖)

    给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多少.为 ...

  9. bzoj2117

    动态电分治+二分 肯定要枚举所有点对,那么我们建出点分树降低树高,然后每个点存下点分树中所有子树到这个点的距离,然后二分+lower_bound就行了. #include<bits/stdc++ ...

  10. Struts文件上传下载

    Struts配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PU ...