题传

其实做过由乃打扑克的话思路并不难。但写代码的时候把写由乃打扑克的 bug 全部复现了属实难蚌

注意到线段树不同区间长度是 \(O(\log n)\) 的,因此我们对于每种长度建一个序列,对于 1 操作,同一长度的区间,中间一段被全部包含,加上的值都是 \(len\times a\),旁边两个小区间需要特判。

那么就是区间加区间求 \(\le x\) 的数的个数,套用由乃打扑克那题的做法,散块修改后暴力归并,整块打 tag,查询二分剪枝(询问值不在块的值域范围内跳过)即可。

块长我直接取根号序列长度,直接过了。

Code

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cctype>
#include <vector>
#include <queue>
#include <bitset>
#include <cmath>
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define st first
#define nd second
using namespace std;
typedef long long ll;
typedef pair <int, int> Pii;
const int INF=0x3f3f3f3f;
const int cp=1e9+7;
inline int plust(int x, int y){x+=y;if(x>=cp) x-=cp;if(x<0) x+=cp;return x;}
inline int minut(int x, int y){x-=y;if(x>=cp) x-=cp;if(x<0) x+=cp;return x;}
inline int read(){
char ch=getchar();int x=0, f=1;
while(!isdigit(ch)){if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0) putchar('-'), x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline int ksm(int a, int b=cp-2){
int ret=1;
for(; b; b>>=1, a=1ll*a*a%cp)
if(b&1) ret=1ll*ret*a%cp;
return ret;
}
const int N=1e5+5;
int n, m, vis[N], tot, LEN[50];
int b[N], c[N], bt, ct;
struct BLOCK{
int trid, len, block;
vector <ll> val, tag;
vi ranl, ranr, id, bid, L, R;
Pii find(int l, int r){
int x=lower_bound(ranl.begin(), ranl.end(), l)-ranl.begin();
int y=upper_bound(ranr.begin(), ranr.end(), r)-ranr.begin()-1;
return mp(x, y);
}
void build(int pid){
trid=pid;
len=(ranl.size()+ranr.size())>>1;block=sqrt(len);
id.resize(len), bid.resize(len), val.resize(len);
for(int i=0, j, c=0; i<len; i+=block){
for(j=0; j<block&&i+j<len; ++j)
bid[i+j]=c, id[i+j]=i+j;
tag.pb(0);++c;
L.pb(i), R.pb(min(i+block-1, len-1));
}
}
void rebuild(int idx, int l, int r, ll v){
for(int i=l; i<=r; ++i) val[i]+=v;bt=ct=0;
for(int i=L[idx]; i<=R[idx]; ++i)
if(l<=id[i]&&id[i]<=r) b[++bt]=id[i];
else c[++ct]=id[i];
int bs=1, cs=1;
for(int i=L[idx]; i<=R[idx]; ++i)
if(bs<=bt&&cs<=ct)
id[i]=((val[b[bs]]<val[c[cs]])?b[bs++]:c[cs++]);
else if(bs<=bt) id[i]=b[bs++];
else if(cs<=ct) id[i]=c[cs++];
return ;
}
void Modify(int l, int r, ll v){
if(bid[l]==bid[r]) return rebuild(bid[l+r>>1], l, r, v);
rebuild(bid[l], l, R[bid[l]], v);
rebuild(bid[r], L[bid[r]], r, v);
for(int i=bid[l]+1; i<=bid[r]-1; ++i) tag[i]+=v;
}
void check(int id, int l, int r, ll v){
if(id<0||id>=len) return ;if(ranl[id]<=l&&r<=ranr[id]) return rebuild(bid[id], id, id, v*(r-l+1));
if(ranr[id]>=l&&ranl[id]<l) return rebuild(bid[id], id, id, v*(ranr[id]-l+1));
if(ranl[id]<=r&&ranr[id]>r) return rebuild(bid[id], id, id, v*(r-ranl[id]+1));
}
int Fcnt(int idx, int l, int r, ll v){
int res=0;
for(int i=l; i<=r; ++i) res+=((val[i]+tag[idx])<=v);
return res;
}
int Ef(int idx, ll v){
if(val[id[L[idx]]]>v) return 0;
if(val[id[R[idx]]]<=v) return R[idx]-L[idx]+1;
int l=L[idx], r=R[idx], ans=L[idx]-1;
while(l<=r){
int mid=l+r>>1;
if(val[id[mid]]<=v) ans=mid, l=mid+1;
else r=mid-1;
}
return ans-L[idx]+1;
}
int Query(int l, int r, ll v){
if(bid[l]==bid[r]) return Fcnt(bid[l+r>>1], l, r, v);
int res=Fcnt(bid[l], l, R[bid[l]], v)+Fcnt(bid[r], L[bid[r]], r, v);
for(int i=bid[l]+1; i<=bid[r]-1; ++i) res+=Ef(i, v-tag[i]);
return res;
}
}tr[50];
#define mid (l+r>>1)
void build(int l, int r){
if(!vis[r-l+1]) vis[r-l+1]=tot++, LEN[tot-1]=r-l+1;
tr[vis[r-l+1]].ranl.pb(l);
tr[vis[r-l+1]].ranr.pb(r);
if(l==r) return ;
build(l, mid), build(mid+1, r);
}
#undef mid
signed main(){
n=read(), m=read();
build(1, n);
for(int i=0; i<tot; ++i) tr[i].build(i);
for(int i=1; i<=m; ++i){
int op=read(), l=read(), r=read(), a=read();
if(op&1){
for(int j=0; j<tot; ++j){
Pii t=tr[j].find(l, r);
if(t.st<=t.nd) tr[j].Modify(t.st, t.nd, 1ll*a*LEN[j]);
tr[j].check(t.st-1, l, r, a);
if(t.st-1!=t.nd+1) tr[j].check(t.nd+1, l, r, a);
}
}
else{
int ans=0;
for(int j=0; j<tot; ++j){
Pii t=tr[j].find(l, r);
if(t.st<=t.nd) ans+=tr[j].Query(t.st, t.nd, a);
}
printf("%d\n", ans);
}
}
return 0;
}

[Ynoi2014] 置身天上之森的更多相关文章

  1. [Ynoi2014]不归之人与望眼欲穿的人们

    题目大意: 给定一个序列,每次单点修改一个数,或给定$x$,询问最短的or起来大于等于$x$的区间的长度(不存在输出-1). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归 ...

  2. [Ynoi2015]即便看不到未来

    题目大意: 给定一个序列,每次询问,给出一个区间$[l,r]$. 设将区间内的元素去重后重排的数组为$p$,求$p$中长度为$1\sim 10$的极长值域连续段个数. 长度为$L$的极长值域连续段的定 ...

  3. [Ynoi2015]纵使日薄西山

    题目大意: 给定一个序列,每次单点修改,然后进行询问. 定义一次操作为,选择一个位置$x$,将这个位置的数和左边.右边两个位置的数(不存在则忽略)各减去1,然后和0取max. 对序列中最大的位置进行一 ...

  4. [Ynoi2015]盼君勿忘

    题目大意: 给定一个序列,每次查询一个区间\([l,r]\)中所有子序列分别去重后的和\(\bmod p\)(每次询问模数不同). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后 ...

  5. [Ynoi2015]我回来了

    题目大意: 给定一张无向无权图,每次给定若干个二元组\((x_i,y_i)\),定义点\(u\)满足条件,当且仅当存在\(i\),并满足\(dist(u,x_i)\leqslant y_i\)(\(d ...

  6. [Ynoi2015]此时此刻的光辉

    题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ...

  7. 题解 P5072 【[Ynoi2015] 盼君勿忘】

    在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...

  8. [华商韬略] 拉里·埃里森(Larry Elison) 的传奇人生

    拉里·埃里森(Larry Elison) 的传奇人生   开战机.玩游艇.盖皇宫,挑战比尔·盖茨,干掉50多家硅谷豪强……全世界比拉里·埃里森更有钱的只有5个,像他这样的硅谷“坏孩子”却是唯一. 19 ...

  9. 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司

    一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...

  10. 东大OJ-麦森数

    1064: 麦森数 时间限制: 1 Sec  内存限制: 128 MB 提交: 52  解决: 9 [提交][状态][讨论版] 题目描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不 ...

随机推荐

  1. Git 覆盖刚刚 commit 的 message

    场景重现 通常噼里啪啦键盘一段猛搓后(写代码啊),然后会 git add . git commit -m "modify semo" # 注意上面 semo 应该是 some,发现 ...

  2. SpringAI vs JBoltAI:Java企业级AI开发的框架之争与实战选型

    「SpringAI vs JBoltAI:Java企业级AI开发的框架之争与实战选型」 一.Java生态的AI困局:工具碎片化与工程化缺失 1. 技术断层:从API调用到全生命周期管理多数企业仍停留在 ...

  3. JAVA stream集合List<Map>转二维集合Map<String,Map<String,Object>>

    简介 将一个 List<Map> 转换为一个二维的 Map 结构通常意味着我们需要创建一个 Map<K, Map<K, V>>.这里,外部的 Map 使用某个键(比 ...

  4. Robot Framework绝对路径转相对路径

    如上图,添加商品需要上传商品图片,如此,设计脚本时候会填入图片的路径,使自动化能够自动到目的路径内获取图片上传 C:\\Users\\Beckham\\Desktop\\test2\\autoTest ...

  5. MaxKB 开启模型联网搜索

    前言 模型联网搜索是当前大语言模型(LLM)领域的重要技术方向,其核心在于通过结合互联网实时数据与模型推理能力,突破预训练数据的时间限制,提供更精准.动态的回答. 核心应用场景 实时信息补充 例如查询 ...

  6. MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?

    MySQL 中 DELETE.DROP 和 TRUNCATE 的区别 在 MySQL 中,DELETE.DROP 和 TRUNCATE 都是常用于删除数据的操作,但它们在功能.性能.用途和实现方式上有 ...

  7. Go工程选择开源分库分表中间件可用性测试

    近期在寻找Go工程可以用的开源分库分表中间件,找了3个:ShardingSphere-Proxy,Kingshard,Gaea,下面给出测试过程和对比结果 ShardingSphere-Proxy h ...

  8. Git提交修正的核心技巧:git commit --amend 的专业实践与深度解析

    结论先行 git commit --amend 是用于 修正最近一次提交 的高效工具,可修改提交信息.追加遗漏文件或调整代码内容,避免冗余提交记录,保持提交历史的简洁性.适用于本地未推送的提交修复场景 ...

  9. 个人对Debian桌面系统的简单使用分享

    前言 自从安装Debian12作为双系统已经过了大半个月,平常主用Debian,偶尔切回Windows找找文档,总体来说体验还是很不错的.先贴个桌面照 为什么要使用Linux作为个人桌面 当初刚从Wi ...

  10. vue3 基础-补充 ref & provide-inject

    本篇主要对一些被以前内容(渲染, 传值) 等忽略的几个常用小技巧进行补充说明啦. v-once 即对某个dom节点生效, 其会限定只会渲染一次, 不论数据是如何的变化, 演示如下: <!DOCT ...