要点

  • 题意……题意往往是个大坎Orz:输入操作 p 则在区间\([x_1,x_2]\)插入一个三次函数, t 则先查询区间\([x_1,x_2]\)的函数值的和,然后按题目要求得到新的\(x_1\)、\(x_2\)并插入一个三次函数。都是整形。
  • 解决方法:三次函数只有四个部分,栽4棵代表不同次幂函数的线段树即可,这样每次只维护某一特定次幂的函数是很容易做到的。
  • 感觉这题很简单了对吧,然而每个月都要来那么一次红红的一板WA ……我调了很久才过的(菜鸡才会掉的)坑:
  • 预处理的sum不应在询问答案时再使用,因为题目意思是没有函数的点函数值算0。所以要在线段树的sum的维护的过程中就使用这个数组。
  • 一些手(智)生(障)的错误:把标准同步关了却还用printf、减法取模不加mod直接%mod、线段树更新写错了(这可还行……)。
  • 休息并出门(调出bug的神奇做法)之后回来一眼看出\(x[i]\)是int范围的,要 x[i] = (x[i] % mod + mod) % mod;,原来写的 x[i] = (x[i] + mod) % mod

压着时限过的

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
const int X = 1e6 + 5, mod = 1e9 + 7;
const ll INF = 1e18; int Test, N, l, r;
ll x[4];
ll sum[4][X];
char s[2]; struct SegmentTree {
#define ls(p) p << 1
#define rs(p) p << 1 | 1
struct Node {
int l, r;
int sum, tag;
}t[X << 2]; void Deal(int s, int p, int id) {
t[s].sum = ((ll)t[s].sum + (ll)t[p].tag * (sum[id][t[s].r] - sum[id][t[s].l - 1] + mod) % mod) % mod;
t[s].tag = ((ll)t[s].tag + (ll)t[p].tag) % mod;
} void Push_down(int p, int id) {
if (t[p].tag) {
Deal(ls(p), p, id), Deal(rs(p), p, id);
t[p].tag = 0;
}
} void Build(int l, int r, int p) {
t[p].l = l, t[p].r = r, t[p].tag = t[p].sum = 0;
if (l == r) return;
int mid = (l + r) >> 1;
Build(l, mid, ls(p));
Build(mid + 1, r, rs(p));
} void Update(int l, int r, int p, ll k, int id) {
if (l <= t[p].l && t[p].r <= r) {
t[p].sum = ((ll)t[p].sum + k * (sum[id][t[p].r] - sum[id][t[p].l - 1] + mod) % mod) % mod;
t[p].tag = ((ll)t[p].tag + k) % mod;
return;
}
Push_down(p, id);
int mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) Update(l, r, ls(p), k, id);
if (mid < r) Update(l, r, rs(p), k, id);
t[p].sum = ((ll)t[ls(p)].sum + t[rs(p)].sum) % mod;
} ll Query(int l, int r, int p, int id) {
if (l <= t[p].l && t[p].r <= r) return t[p].sum;
Push_down(p, id);
int mid = (t[p].l + t[p].r) >> 1;
if (l > mid) return Query(l, r, rs(p), id);
if (r <= mid) return Query(l, r, ls(p), id);
return ((ll)Query(l, r, ls(p), id) + Query(l, r, rs(p), id)) % mod;
}
}T[4]; void Pre(int k) {
for (int i = 0; i <= X - 5; i++) {
ll t = 1LL;
for (int j = 1; j <= k; j++)
t = t * i % mod;
sum[k][i + 1] = (t + sum[k][i]) % mod;
}
} int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); for (int i = 0; i < 4; i++)
Pre(i);
cin >> Test;
for (int kase = 1; kase <= Test; kase++) {
cout << "Case #" << kase << ":\n"; for (int i = 0; i < 4; i++)
T[i].Build(1, X - 4, 1);
for (cin >> N; N; N--) {
cin >> s >> l >> r;
l++, r++;
for (int i = 3; ~i; --i)
cin >> x[i], x[i] = (x[i] % mod + mod) % mod; if (s[0] == 'p') {
for (int i = 3; ~i; --i)
T[i].Update(l, r, 1, x[i], i);
} else {
ll ans = 0LL;
for (int i = 3; ~i; --i) {
ans = (ans + T[i].Query(l, r, 1, i)) % mod;
}
cout << ans << '\n'; l--, r--;
l = ans * l % 1000000;
r = ans * r % 1000000;
if (l > r) swap(l, r);
l++, r++;
for (int i = 3; ~i; --i)
T[i].Update(l, r, 1, x[i], i);
}
}
}
return 0;
}

UVaLive6443(线段树)的更多相关文章

  1. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  5. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  6. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  7. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. 鸟哥的linux私房菜 - 第三章 主机规划与磁盘分区

    各硬件装置在linux中的文件名 在linux系统中,每个装置都被当成一个档案来对待. 常见的装置与其在linux中的档名: 磁盘分区 磁盘链接的方式与装置文件名的关系 个人计算机常见的磁盘接口有两种 ...

  2. matlab之scatter3()函数

    Display point cloud in scatter plot(在散点图中显示点云): scatter3(X,Y,Z) 在向量 X.Y 和 Z 指定的位置显示圆圈. scatter3(X,Y, ...

  3. Java 吃货联盟

    import java.util.Scanner; public class Shao {  private static final int[] dishNames = null;  private ...

  4. Unix环境编程之文件IO

    1.文件IO 2.文件与目录 3.进程 4.多线程编程 5.信号 6.进程间通信 学习linux编程,首先要学会使用shell,这里一些基础命令就不介绍了.这里唯一要提的一个shell命令就是man. ...

  5. win10系统下安装64位Oracle11g+LSQL Developer

    LSQL Developer作为强大的Oracle编辑工具,却只支持32bit,本文提供在安装用LSQL Developer打开64bitOracle的操作方法 工具/原料  oracle11g安装包 ...

  6. OGG 11g Checkpoint 详解

    OGG Checkpoint 详解   定位中断的位置,下次启动从中断的位置开始恢复.     1.target  端配置: 2.一条记录对应一个replicat   一. Extract Check ...

  7. hdu3501Calculation 2——欧拉函数模板

    题目: Problem Description Given a positive integer N, your task is to calculate the sum of the positiv ...

  8. bzoj1055玩具取名——区间DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DP,注意初始化!! 因为没记忆化,TLE了一晚上,区间DP尤其要注意不重复递归! ...

  9. poj2392磊石头——排序后背包

    题目: 首先按限制高度从小到大排序,不会影响可行解,而不排序可能卡掉正确的情况: 用%2滚动数组时一定注意每次复制上一种情况,因为这个WA了好几次. 代码如下: #include<iostrea ...

  10. 解决CentOS 7安装zabbix 3.0 无法启动zabbix-server的问题[segfault at 18 ip 00007f78842b4bd0 sp 00007fff1995a818 error 4 in libpthread-2.17.so[7f78842ab000+16000]]

    解决CentOS 7安装zabbix 3.0 无法启动zabbix-server的问题 [root@localhost sbin]# service zabbix-server start Redir ...