题目背景

大芳有一个不太好的习惯:在车里养青蛙。青蛙在一个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. Python全栈 Web(边框、盒模型、背景)

    原文地址 https://yq.aliyun.com/articles/634926 ......................................................... ...

  2. 原生js常用方法

    原生JavaScript设置cookie值 function setCookie(name, value, Hours) { var d = new Date(); var offset = 8; v ...

  3. 372. Delete Node in a Linked List【LintCode java】

    Description Implement an algorithm to delete a node in the middle of a singly linked list, given onl ...

  4. 213. String Compression【LintCode java】

    Description Implement a method to perform basic string compression using the counts of repeated char ...

  5. 深入理解java虚拟机学习笔记(二)

    第三章 垃圾收集器与内存分配策略 概述 ​ 程序计数器.虚拟机栈.本地方法栈3个区随线程而生,随线程而灭.因此大体上可认为这几个区域的内存分配和回收都具备确定性.在方法/线程结束时,内存自然就跟着回收 ...

  6. 学霸系统ui部分软件发布说明

    一.版本新功能 1.搜索主页按钮 在学长的版本中,要想进入搜索主页,方法只有一个,就是在问答搜索结果页中点击链接进入搜索主页,这就使得用户很不方便.我们在学霸系统的主页增加了一个链接按钮,方便用户能够 ...

  7. 一个例子说明mouseover事件与mouseenter事件的区别

    <html> <head> <meta charset="UTF-8"> <title>haha</title> < ...

  8. ACM 第十三天

    训练赛题目 题目地址:https://odzkskevi.qnssl.com/415c275cb0a15fcb4ede21b8cb5297de?v=1533963116   A题代码: #includ ...

  9. iOS- iPad里有趣的UIPopoverController

    效果: 1.对UIPopoverController的简单概述 1.1 UIPopoverController是在iPad开发中常用的一个组件(在iPhone上不允许使用),使用非常简单   1.2 ...

  10. JS DOM视频相关的知识

    1.实现点击a标签改变图片时,如果a的href属性有一个目标网址,但是点击又必须跳转到另外一张图,往往会最后跳转到目标网址,可以在onclick事件函数中加入ruturn false,阻止跳转到页面. ...