codeforces 915E - Physical Education Lessons 动态开点线段树
题意:
最大$10^9$的区间,
$3*10^5$次区间修改,每次操作后求整个区间的和
题解:
裸的动态开点线段树,计算清楚数据范围是关键...
经过尝试
$2*10^7$会$MLE$
$10^7$会$RE$
用$vector$但是一开始没有$resize$到最大也会$MLE$
如果节点内部信息保存了节点的区间,无论怎么样都会$MLE$
最终$1.5*10^7$的$vector$/数组可以过
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
int casn,n,m,k;
const int maxn=1e7+5e6+7;
class dsegtree{public:
#define nd node[now]
#define ndl node[node[now].son[0]]
#define ndr node[node[now].son[1]]struct dsegnode {int son[2],tag,sum;dsegnode(){}dsegnode(int s,int t){sum=t-s+1,tag=son[0]=son[1]=0;}void update(int x,int len){sum=len*(x-1),tag=x;}};vector<dsegnode> node;int root,cnt,n,s,t;dsegtree(int nn,int size=maxn){n=nn;node.resize(maxn);node[1]=dsegnode(1,n);cnt=root=1;}void pushup(int now){nd.sum=ndl.sum+ndr.sum;}void pushdown(int now,int s,int t){if(nd.tag){ndl.update(nd.tag,(t+s)/2-s+1);ndr.update(nd.tag,t-((t+s)/2+1)+1);nd.tag=0;}}void update(int ss,int tt,int x){s=ss,t=tt,update(1,n,x,root);}void update(int l,int r,int x,int now){if(s>r||t<l)return ;if(s<=l&&t>=r) {nd.update(x,r-l+1);return ;}if(!nd.son[0]){node[++cnt]=dsegnode(l,(l+r)>>1);nd.son[0]=cnt;}if(!nd.son[1]){node[++cnt]=dsegnode(((l+r)>>1)+1,r);nd.son[1]=cnt;}pushdown(now,l,r);update(l,(l+r)>>1,x,nd.son[0]);update(((l+r)>>1)+1,r,x,nd.son[1]);pushup(now);}
};int main() {IO;ll n,m;cin>>n>>m;dsegtree tree(n);int a,b,c;while(m--){cin>>a>>b>>c;tree.update(a,b,c);cout<<tree.node[tree.root].sum<<endl;}return 0;
}
91
题解5
转载于:https://www.cnblogs.com/nervendnig/p/10233650.html
codeforces 915E - Physical Education Lessons 动态开点线段树相关推荐
- CF915E Physical Education Lessons(珂朵莉树)
中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊--码量小-- 虽然真要构造的话随便卡-- 1 //minamoto 2 #include< ...
- 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...
- 洛谷P3960 列队(动态开节点线段树)
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...
- 动态开点线段树(多棵线段树)的内存分配与回收
前言 线段树,是一个很好用的能支持O(logn)区间操作的数据结构,随着做一些稍微烦一点的题,有时候会发现有些情况要开一个数组的线段树,更有甚者要树套树,而在很多情况下线段树就不能把所有点都开满了(否 ...
- CF1045G AI robots(动态开点线段树)
题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...
- NOIP2017 列队——动态开点线段树
Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 ...
- HDU 6681 Rikka with Cake(扫描线、动态开点线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意 在矩形区域内有k条射线,问这些射线将矩形分成了多少区域 题解 容易发现答案为所有射线交点个数+1. ...
- 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)
题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...
- CodeForces - 960F[动态开点线段树优化dp]详解
题意:给一张有向图,每条边有边权与编号,求一条最长的路径,这条路径的边权与编号都是递增的.(编号指输入顺序) 首先我们回忆一下普通得LIS得做法:就是dp[i]以第i个结尾得最长上升子序列的长度,那么 ...
最新文章
- Linux编译mybatis,使用mybatis assembly插件打成tar包,在linux系统中运行服务-Go语言中文社区...
- C#调用ArcGIS REST服务
- pthread_mutex_lock用法
- adb logcat 命令行用法
- cookie版购物车
- Sublime Text3 配置设置攻略
- 永乐XIANDAI 08
- 【PAT甲级 前导0,排序】1069 The Black Hole of Numbers (20 分) C++ 全部AC
- Spring–添加SpringMVC –第1部分
- python爬取京东商品信息代码_Python利用Xpath选择器爬取京东网商品信息
- linux的定制和发布(二)
- WordPress SEO 完全指南
- Python爬上不得姐 并将段子写入数据库
- linux mysql数据库升级_Linux升级mysql到5.7
- perl语言书籍教程推荐
- 产品需求分析工具和方法
- Unity Asset Store——独立游戏开发者的素材插件商店
- 福昕软件发布福昕高级PDF编辑器 for Linux
- mysql分页查询与ES分页查询解析
- ps怎么打开php图片大小,如何使用ps修改图片尺寸