要点

  • 题意……题意往往是个大坎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. POJ 2409 Let it Bead:置换群 Polya定理

    题目链接:http://poj.org/problem?id=2409 题意: 有一串n个珠子穿起来的项链,你有k种颜色来给每一个珠子染色. 问你染色后有多少种不同的项链. 注:“不同”的概念是指无论 ...

  2. 分享知识-快乐自己:spring_Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson

    心路历程: 在Controller中return 对象的时候,对象中的属性值中文部分在浏览器中 显示为问号?? 然后结果是这样的:?? 尝试排查原因: 中文乱码常有以下三种: 1.request.re ...

  3. linux应用之yum命令

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  4. 改变Ecplise项目窗口字体样式

    Eclipse\plugins\org.eclipse.ui.themes_1.1.1.v20151026-1355\css e4-dark_win.css CTabFolder Tree, CTab ...

  5. listen and translation exercise 53

    It was hard work and there weren't any interesting things for him. You should be an expert with comp ...

  6. 「LuoguP1725」琪露诺(dp 单调队列

    题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河岸去追 ...

  7. 设置一个.exe文件开机启动

    运行"regedit",编辑注册表 HKEY_LOCAL_MACHINE -- SOFTWARE -- Microsoft -- Windows -- CurrentVersion ...

  8. python中re.sub的使用 --解读一段代码

    json='{ title: "条纹针织衫+蓬蓬裙套装", picSrc: "http://d05.res.meilishuo.net/pic/_o/15/f5/f2e2 ...

  9. 如何部署JavaWeb应用

    准备 公网主机一台(推荐云服务器) 数据库安装包 JDK安装包 Tomcat安装包 WAR包(web应用包) 部署 安装所需软件,并测试基本环境是否可用 将WAR包解压至Tomcat目录下的webap ...

  10. 使用gRPC搭建Server端与Client端

    gRPC简介 gRPC是一种RPC框架技术,采用Protocal Buffers(协议缓存) 作为其接口定义的语言(就是Proto来写接口)和基础的消息交换格式. 在gRPC中,客户端应用程序可以直接 ...