[Ynoi2014] 置身天上之森
其实做过由乃打扑克的话思路并不难。但写代码的时候把写由乃打扑克的 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] 置身天上之森的更多相关文章
- [Ynoi2014]不归之人与望眼欲穿的人们
题目大意: 给定一个序列,每次单点修改一个数,或给定$x$,询问最短的or起来大于等于$x$的区间的长度(不存在输出-1). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归 ...
- [Ynoi2015]即便看不到未来
题目大意: 给定一个序列,每次询问,给出一个区间$[l,r]$. 设将区间内的元素去重后重排的数组为$p$,求$p$中长度为$1\sim 10$的极长值域连续段个数. 长度为$L$的极长值域连续段的定 ...
- [Ynoi2015]纵使日薄西山
题目大意: 给定一个序列,每次单点修改,然后进行询问. 定义一次操作为,选择一个位置$x$,将这个位置的数和左边.右边两个位置的数(不存在则忽略)各减去1,然后和0取max. 对序列中最大的位置进行一 ...
- [Ynoi2015]盼君勿忘
题目大意: 给定一个序列,每次查询一个区间\([l,r]\)中所有子序列分别去重后的和\(\bmod p\)(每次询问模数不同). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后 ...
- [Ynoi2015]我回来了
题目大意: 给定一张无向无权图,每次给定若干个二元组\((x_i,y_i)\),定义点\(u\)满足条件,当且仅当存在\(i\),并满足\(dist(u,x_i)\leqslant y_i\)(\(d ...
- [Ynoi2015]此时此刻的光辉
题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ...
- 题解 P5072 【[Ynoi2015] 盼君勿忘】
在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...
- [华商韬略] 拉里·埃里森(Larry Elison) 的传奇人生
拉里·埃里森(Larry Elison) 的传奇人生 开战机.玩游艇.盖皇宫,挑战比尔·盖茨,干掉50多家硅谷豪强……全世界比拉里·埃里森更有钱的只有5个,像他这样的硅谷“坏孩子”却是唯一. 19 ...
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...
- 东大OJ-麦森数
1064: 麦森数 时间限制: 1 Sec 内存限制: 128 MB 提交: 52 解决: 9 [提交][状态][讨论版] 题目描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不 ...
随机推荐
- 《Python基础教程》第三版语录
对程序的结构(如需要哪些类和函数)有一定的想法后,建议你实现一个功能可能极其有限的简单版本. 当你有了可运行的程序后,将发现接下来的工作容易得多.你可添加新功能,修改不喜欢的方面,等等.这样你才能够真 ...
- 高格发票勾稽之BUG
select (INVNO) AS INVCODE, SDATE ,* FROM STKSALE1 WHERE LEN(INVSCODE) > 0 AND INVSCODE = '3100000 ...
- 记一个.NET AOT交叉编译时的坑
记一个.NET AOT交叉编译时的坑 背景: 使用.NET9开发的Avalonia项目需要部署到Linux-arm64 踩坑: 根据官方AOT交叉编译文档配置后执行打包 dotnet publish ...
- 麒麟V10部署ROCEv2网卡配置步骤
以下是为麒麟服务器版V10配置RoCEv2的步骤: 第一步:确认硬件和驱动支持 在开始配置之前,首先要确保你的服务器硬件满足要求.通常需要Mellanox ConnectX系列网卡(例如mlx5系列) ...
- PIKACHU之暴力破解
PIKACHU之暴力破解 基于表单的暴力破解 进入靶场后是一个简易的登录界面 随便输入用户名与密码观察回显 由于回显是模糊回显,并没有表示是用户名错误还是密码错误,直接进入BP采用暴力破解,但是在进行 ...
- windows切换nodejs版本
卸载之前的nodejs 第一步:下载nvm并安装 (推荐使用nvm-setup.zip) https://github.com/coreybutler/nvm-windows/releases 第二步 ...
- Streamlit快速入门指南
theme: orange Streamlit是一个Python库,允许您创建交互式的数据科学和机器学习Web应用程序. Streamlit介绍 Streamlit是一个Python库,允许您创建交互 ...
- VS2019 webApi(.net core2.2版本)上传到Gitee
一.本地创建项目 创建本地项目,依次点击下一步,在选择"目标框架"时选择2.2, 二.配置swagger 1.添加依赖项 2.修改Startup.cs public void Co ...
- 使用Linux筛选文本-日志分析
用于简单的文本筛选和日志分析还是很方便的. 我这里用的kali **目的:**筛选出test文件中 状态码为500的url 命令: cat test |grep '500' >test1 或 g ...
- Java线程控制: sleep、yield、join深度解析
结论先行 sleep:主动让出CPU但保持锁,适合控制执行节奏和优化CPU占用 yield:建议让出CPU但无强制力,适用场景有限且效果不稳定 join:通过等待机制实现线程顺序控制,底层基于wait ...