题目链接

题目大意:  给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列。 另一种是将位置x的数变为y。 强制在线。

可以用hash来做, 用线段树保存一个区间里的最小值, 和, 以及平方的和。 然后每次询问, 假设这个区间构成等差数列,那么首项为这个区间的最小值, 然后按公式算出以minn为首项, k为公差的数列的和, 为a1*len+len*(len-1)/2*d, 然后算出平方的和, 相当于sigma(i : 0 to len-1) (a1+i*d)^2, 然后把它拆开, 就变成a1*a1*len+a1*d*len*(len-1)+d*d*len*(len-1)*(2*len-1)/6, 记得时刻取模防止爆longlong, /6那里用乘法逆元算。 然后看是否相等就可以了。

正解当然不是这样的..

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const ll mod = 1e9+;
const ll inf = 1e18;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
const int maxn = 3e5+;
ll sum1[maxn<<], sum2[maxn<<], minn[maxn<<], ans1, ans2, ans3;
void pushUp(int rt) {
sum1[rt] = sum1[rt<<]+sum1[rt<<|];
sum2[rt] = (sum2[rt<<] + sum2[rt<<|])%mod;
minn[rt] = min(minn[rt<<], minn[rt<<|]);
}
void build(int l, int r, int rt) {
if(l == r) {
scanf("%I64d", &sum1[rt]);
minn[rt] = sum1[rt];
sum2[rt] = sum1[rt]*sum1[rt]%mod;
return ;
}
int m = l+r>>;
build(lson);
build(rson);
pushUp(rt);
}
void update(int p, ll val, int l, int r, int rt) {
if(l == r) {
sum1[rt] = minn[rt] = val;
sum2[rt] = val*val%mod;
return ;
}
int m = l+r>>;
if(p<=m)
update(p, val, lson);
else
update(p, val, rson);
pushUp(rt);
}
void query(int L, int R, int l, int r, int rt) {
if(L<=l&&R>=r) {
ans1 += sum1[rt];
ans2 = (ans2+sum2[rt])%mod;
ans3 = min(ans3, minn[rt]);
return ;
}
int m = l+r>>;
if(L<=m)
query(L, R, lson);
if(R>m)
query(L, R, rson);
}
ll pow(ll a, ll b) {
ll ret = ;
while(b) {
if(b&) {
ret = ret*a%mod;
}
a = a*a%mod;
b>>=;
}
return ret;
}
ll get1(ll a1, ll l, ll d) {
ll ret = a1*l+l*(l-)/*d;
return ret;
}
ll get2(ll a1, ll l, ll d) {
ll ret = a1*a1%mod*l%mod;
ll rev = pow(6LL, mod-)%mod;
ret = (ret + d*d%mod*l%mod*(l-)%mod*(*l-)%mod*rev%mod)%mod;
ret = (ret + a1*d%mod*l%mod*(l-)%mod)%mod;
return ret%mod;
}
int main()
{
int n, m, cnt = , sign, x, y, z;
cin>>n>>m;
build(, n, );
while(m--) {
scanf("%d%d%d", &sign, &x, &y);
x ^= cnt, y ^= cnt;
if(sign == ) {
update(x, 1LL*y, , n, );
} else {
scanf("%d", &z);
z ^= cnt;
ans3 = inf, ans1 = ans2 = ;
query(x, y, , n, );
ll tmp1 = get1(ans3, y-x+, z);
ll tmp2 = get2(ans3, y-x+, z);
if(tmp1 == ans1 && tmp2 == ans2) {
cnt++;
puts("Yes");
} else {
puts("No");
}
}
}
return ;
}

bzoj 4373: 算术天才⑨与等差数列 hash的更多相关文章

  1. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  2. BZOJ 4373: 算术天才⑨与等差数列 线段树

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  3. bzoj 4373 算术天才⑨与等差数列——线段树+set

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373 能形成公差为k的等差数列的条件:mx-mn=k*(r-l) && 差分 ...

  4. BZOJ 4373 算术天才⑨与等差数列 线段树+set(恶心死我了)

    mdzz,这道题重构了4遍,花了一个晚上... 满足等差数列的条件: 1. 假设min是区间最小值,max是区间最大值,那么 max-min+k(r−l) 2. 区间相邻两个数之差的绝对值的gcd=k ...

  5. BZOJ 4373算术天才⑨与等差数列(线段树)

    题意:给你一个长度为n的序列,有m个操作,写一个程序支持以下两个操作: 1. 修改一个值 2. 给出三个数l,r,k, 询问:如果把区间[l,r]的数从小到大排序,能否形成公差为k的等差数列. n,m ...

  6. BZOJ4373 算术天才⑨与等差数列 【线段树】*

    BZOJ4373 算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k ...

  7. 【BZOJ4373】算术天才⑨与等差数列 [线段树]

    算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 算术天才⑨非常喜欢和等 ...

  8. 【BZOJ4373】算术天才⑨与等差数列 线段树+set

    [BZOJ4373]算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次他会给出询问l,r,k, ...

  9. JSOI2009 等差数列 和 算术天才⑨与等差数列 和 CH4302 Interval GCD

    等差数列 为了检验学生的掌握情况,jyy布置了一道习题:给定一个长度为N(1≤N≤100,000)的数列,初始时第i个数为vi(vi是整数,−100,000≤vi≤100,000),学生们要按照jyy ...

随机推荐

  1. 发现一个名为“Douyu”的国人项目

    刚刚在javaeye看到一个名为Douyu的国人项目,认为搞下去未来可能非常有意思,放到blog上做个标记. ——————下面是转载的作者原文——————— 原文地址例如以下:http://zhh20 ...

  2. 解决Metadata file does not match checksum错误

    1.清空缓存执行: # yum clean all 先把就的缓存数据都去掉. 2.下载metadata和校验数据先进入yum对应的目录,再下载: # cd /var/cache/yum/rpmforg ...

  3. ##DAY15——UICollectionView

    DAY15——UICollectionView 创建UICollectionView //创建一个布局对象,采用系统布局类UICollectionViewFlowLayout UICollection ...

  4. Spring——AOP(面向切面编程)@AspectJ注解方式

    一.什么是AOP? AOP: (Aspect Oriented Programming)即面向切面编程. 试想这样的场景:项目中需要在业务方法执行完打印日志记录.最笨的办法就是在每个方法核心业务执行完 ...

  5. DSP的cache一般在何时会生效,防止在cache使用造成数据不一致

    在使用DSP的cache使能所有的ddr操作时,发现如果只是写操作,根据cache的机制,如果没有在了L1级hit,则直接使用write buffer来完成写操作. 假如hit的话,那之前一定发生过读 ...

  6. 一次U盘安装Ubuntu双系统实录

    准备:Win7系统(原来就在我电脑的系统) UltraISO(把系统写进U盘的工具) EasyBCD(双系统引导修复工具) 笔记本电脑(我的是联想Y470N) U盘一个 步骤: U盘准备工作: 插入U ...

  7. KNN算法[分类算法]

    kNN(k-近邻)分类算法的实现 (1) 简介: (2)算法描述: (3) <?php /* *KNN K-近邻方法(分类算法的实现) */ /* *把.txt中的内容读到数组中保存,$file ...

  8. MVC中Filter拦截问题记录之重定向陷阱

    出错环境:被拦截的页面中使用了未实例化的对象,比如只有登录后才有的UserInfor对象. 理想中:浏览器请求页面时,会被Filter拦截,然后重定向到指定页面: 实际现象:将断点打入Filter中, ...

  9. Ridge Regression and Ridge Regression Kernel

    Ridge Regression and Ridge Regression Kernel Reference: 1. scikit-learn linear_model ridge regressio ...

  10. scanf(),gets(),gechar()函数小结

    1. 使用scanf()函数从终端输入字符串时,刚开始输入的所有空格不计入当前字符串,以 space,enter,tab键结束当前字符串的输入:最后的space,enter,tab字符会留在输入缓冲区 ...