题目背景

大芳有一个不太好的习惯:在车里养青蛙。青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去。她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹。有一天他突发奇想,在杆子上每1厘米为一个单位,瞎涂上了墨水,并且使用mOgic,使青蛙跳过之处墨水浓度增加x。当然,他还会闲着无聊滴几滴墨水再涂♂抹均匀。

他现在无时无刻都想知道,第l厘米到第r厘米墨水的浓度是多少?

哦不!等等,他现在找到了一个计算器,可以输入几个数字与x,计算他们的x次幂和,所以。。。他想知道的是第l厘米到第r厘米墨水的浓度的x次幂和是多少?

题目描述

大芳有3种舰长技能骚操作

  1. 续:把青蛙放到第l厘米处,戳青蛙使其跳至r。效果:第l厘米至第r厘米墨水浓度增加x

  2. 抚♂摸:擦干杆子某一部分,重新滴加墨水并抹匀。效果:使第l厘米至第r厘米墨水浓度都变成x

最后一种是:

  1. 压线逆行,将车流看做⑨弹幕找安定点,掏出计算器,大喊板载后计算:

第l厘米至第r厘米墨水浓度的x次幂和是几何?记得答案要

模1000000007

输入输出格式

输入格式:

第一行n和m,表示杆子长n厘米,大芳要进行m次骚操作。

第二行n个数字,表示初始墨水浓度。第i个数字为第i厘米墨水浓度

接下来每行4个数字,依次为:操作编号(1、2或3),l,r,x

输出格式:

每次进行3操作,输出一行表示答案

记得模1000000007

输入输出样例

输入样例#1:

5 5
19844 14611 26475 4488 6967
2 1 3 15627
2 1 2 30113
2 3 5 14686
2 5 5 32623
3 1 2 8
输出样例#1:

466266421

说明

分析:比较好的一道线段树的题,在细节处理方面收获了很多.

暴力可以拿到30分,如果会一点线段树的基本操作应该是可以拿到60分的,想要拿满分关键在于k的处理.

我们保存每个区间的i次幂和,如果是区间覆盖就很好办,幂*区间长度;如果是区间加就有点麻烦,要用到二项式定理来展开.比较麻烦,手推一下就出来了.同时要打两个标记,一个是覆盖标记,一个是累加标记,覆盖标记要在累加标记之前判断,并且会使累加标记变成0.

如果在pushdown中写向子区间的更改操作代码就会比较繁琐,为了精简代码,我们可以另写一个函数来下传标记和更改子区间,这是一个非常实用的技巧.

本题的模数比较大,如果直接上int的话一般而言是不会有问题的,但是当两数相乘的时候可能会爆int,所以临时转换成long long然后取模.

我以前是喜欢把不同的量放在不同的数组里写,今天用了一下struct,感觉放在结构体里写会更加直观工整.犯了一个最脑残的错误:逻辑判断弄错了,每次在操作1的时候我都会输出一次,导致过了样例然而所有点全WA.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = , mod = ; int n, m,k = ,c[][],a[maxn]; struct node
{
int l, r,v,ad,st;
int p[];
}e[maxn << ]; void pushup(int o)
{
for (int i = ; i <= k; i++)
e[o].p[i] = (e[o * ].p[i] + e[o * + ].p[i]) % mod;
} void sett(int o, int v)
{
int res = ;
for (int i = ; i <= k; i++)
{
e[o].p[i] = 1LL*res*(e[o].r - e[o].l + ) % mod;
res = 1LL*res * v % mod;
}
e[o].ad = ;
e[o].st = v;
} void addd(int o, int v)
{
for (int i = k; i >= ; i--)
{
int res = , t = ;
for (int j = i; j >= ; j--)
{
t = (t + 1LL * e[o].p[j] *c[i][j] % mod * res) % mod;
res = 1LL * res * v % mod;
}
e[o].p[i] = t;
}
e[o].ad = (e[o].ad + v) % mod;
} void pushdown(int o)
{
if (e[o].st != -)
{
sett(o * , e[o].st);
sett(o * + , e[o].st);
e[o].st = -;
}
if (e[o].ad)
{
addd(o * , e[o].ad);
addd(o * + , e[o].ad);
e[o].ad = ;
}
} void build(int l, int r, int o)
{
e[o].l = l;
e[o].r = r;
e[o].st = -;
e[o].ad = ;
if (l == r)
{
e[o].p[] = ;
for (int i = ; i <= k; i++)
e[o].p[i] = 1LL * e[o].p[i - ] * a[l] % mod;
return;
}
int mid = (l + r) >> ;
build(l, mid, o * );
build(mid + , r, o * + );
pushup(o);
} void add(int l, int r, int o, int x, int y, int v)
{
if (x <= l && r <= y)
{
addd(o,v);
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
add(l, mid, o * , x, y, v);
if (y > mid)
add(mid + , r, o * + , x, y, v);
pushup(o);
} void update(int l, int r, int o, int x, int y, int v)
{
if (x <= l && r <= y)
{
sett(o, v);
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(l, mid, o * , x, y, v);
if (y > mid)
update(mid + , r, o * + , x, y, v);
pushup(o);
} int query(int l, int r, int o, int x, int y, int v)
{
if (x <= l && r <= y)
return e[o].p[v];
pushdown(o);
int mid = (l + r) >> , sum = ;
if (x <= mid)
sum = (sum + query(l, mid, o * , x, y, v)) % mod;
if (y > mid)
sum = (sum + query(mid + , r, o * + , x, y, v)) % mod;
return sum;
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
build(, n, );
c[][] = ;
for (int i = ; i <= k; i++)
{
c[i][] = ;
for (int j = ; j <= i; j++)
c[i][j] = (c[i - ][j] + c[i - ][j - ]) % mod;
}
for (int i = ; i <= m; i++)
{
int op, l, r, x;
scanf("%d%d%d%d", &op, &l, &r, &x);
if (op == )
add(, n, , l, r, x);
if (op == )
update(, n, , l, r, x);
if (op == )
printf("%d\n", query(, n, , l, r, x));
} return ;
}

noip模拟赛 大芳的逆行板载的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  6. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

  7. 【noip模拟赛5】细菌 状压dp

    [noip模拟赛5]细菌   描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...

  8. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  9. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

随机推荐

  1. 【view】 视图组件说明

    view 是视图容器,可用于包裹其它组件或文本内容. 原型: <view hover-class="[String]" hover-stop-propagation=&quo ...

  2. phantomjs抛出IOException

    使用phantomjs对网页进行截图遇到的问题 问题描述: 使用的phantomjs版本:phantomjs-2.1.1-windows 使用的截图js文件,\phantomjs-2.1.1-wind ...

  3. Python-列表练习

    1.使用列表生成式生成如下列表:[1,9,25,49,81] s = [i**2 for i in range(1,10)if i%2==1] print(s) 2.输入一个由英文单词组成的字符串(分 ...

  4. mysql 复杂查询

    1.同一个表下多次查询: sql语句: select b.* ,(select name from exh_common.medicine_type a where b.p_id = a.id) as ...

  5. 《软件工程实践》第五次作业-WordCount进阶需求 (结对第二次)

    在文章开头给出结对同学的博客链接.本作业博客的链接.你所Fork的同名仓库的Github项目地址 本作业博客链接 github pair c 031602136魏璐炜博客 031602139徐明盛博客 ...

  6. Java中Collection和Collections的区别(转载)

    转载来源:http://www.cnblogs.com/dashi/p/3597937.html 1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对 ...

  7. ajax 返回值问题

    错误示例:function returnFlag(){ $.ajax({ type:"post", dataType:"json", data:JSON.str ...

  8. TCP系列02—连接管理—1、三次握手与四次挥手

    一.TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理. 通常一次完整的TCP数据传输一般包 ...

  9. JAVA中快速构建BEAN的方法

    首先,创建一个JAVA类,testBean.java. package com.beans; public class testBean { } 然后,添加私有成员字段. package com.be ...

  10. my.conf 修改编码

    mysql汉字乱码的原因 mysql默认的编码是Latin1是I-8859-1的别名,但Latin1是不支持汉字的,所以要将其改为UTF-8或GBK 1.关闭mysql服务器,这个很重要. 2.通过m ...