【模拟8.10】Weed(线段树)
考试只好随便骗骗分过去啦啦啦.....
正解是玄学线段树:
以每个操作为叶子节点,我们定义几个变量ce表示层数,h表示高度,add表示所减的层数
那么问题转化为单点修改的问题输出直接是根节点答案
但是我们发现合并区间很毒瘤
我们分两种情况:
设L为左儿子,R为右儿子。
1.T[L].ce<T[R].add 显然我们只需O(1)修改。
2.T[L].ce>T[R].add 我们需要将左子树后面的add个减去,我们自然想到了类似平衡树的
查找后缀的操作,于是肝.....
开始时我的query计算有多少减去,但是WA20
因为少考虑一种情况:
你的左子树中假设左子树根结点为K,左儿子Lson,右儿子Rson
右儿子中也可能有剩余的add,
那么我们直接发现右面不够查左面是不行的.........
听了toot大神的建议,我改为了查询还有多少留下
if(t[k*2+1].ce<ceng)
{
qq_sum+=t[k*2+1].h;
query_sum(k*2,l,mid,ceng-t[k*2+1].ce+t[k*2+1].add);
}
当发现右端点少时,向左端点转移还需要减去靠右的add个
然后就没啥了,注意细节就好
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<set>
6 #include<map>
7 #define int long long
8 #define MAXN 1000010
9 using namespace std;
10 int read()
11 {
12 int x=0;char c=getchar();
13 while(c<'0'||c>'9')c=getchar();
14 while(c>='0'&&c<='9')
15 {
16 x=(x<<1)+(x<<3)+(c^48);
17 c=getchar();
18 }
19 return x;
20 }
21 struct node{int ce,h,add,l,r;}t[MAXN*2];
22 int qq_sum;int m,q;
23 int orz[MAXN],mm[MAXN];
24 void query_sum(int k,int l,int r,int ceng)
25 {
26 if(l==r)
27 {
28 if(ceng!=0)qq_sum+=t[k].h;
29 return ;
30 }
31 int mid=(l+r)>>1;
32 //printf("k=%lld l=%lld r=%lld\n",k,l,r);
33 if(t[k*2+1].ce<ceng)
34 {
35 qq_sum+=t[k*2+1].h;
36 query_sum(k*2,l,mid,ceng-t[k*2+1].ce+t[k*2+1].add);
37 }
38 else
39 {
40 query_sum(k*2+1,mid+1,r,ceng);
41 }
42 return ;
43 }
44 void updata(int k)//左儿子是否保存
45 {
46 int r=k*2+1;
47 int l=k*2;
48 //printf("--------\nupdata k=%lld %lld %lld\n",k,l,r);
49 // t[k].ce=t[l].ce+t[r].ce;
50 // t[k].h=t[l].h+t[r].h;
51 // t[k].add=t[l].add+t[r].add;
52 if(t[l].ce>t[r].add)
53 {
54 t[k].ce=t[l].ce+t[r].ce-t[r].add;
55 qq_sum=0;
56 query_sum(l,t[l].l,t[l].r,t[r].add);
57 t[k].h=t[l].h+t[r].h-qq_sum;
58 t[k].add=t[l].add;
59 //printf("--t[k].ce=%lld t[k].h=%lld add=%lld\n",t[k].ce,t[k].h,t[k].add);
60 }
61 else
62 {
63 t[k].h=t[r].h;
64 t[k].ce=t[r].ce;
65 t[k].add=t[r].add+t[l].add-t[l].ce;
66 //printf("t[k].ce=%lld t[k].h=%lld add=%lld\n",t[k].ce,t[k].h,t[k].add);
67 }
68 //printf("-----------\n");
69 return ;
70 }
71 void build(int k,int l,int r)
72 {
73 t[k].l=l;t[k].r=r;
74 if(l==r)
75 {
76 orz[l]=read();mm[l]=read();
77 if(orz[l]==0)
78 {
79 t[k].ce=1;t[k].h=mm[l];
80 //printf("t[%lld].ce=%lld t[%lld].h=%lld\n",k,t[k].ce,k,t[k].h);
81 }
82 else
83 {
84 t[k].add=mm[l];
85 //printf("t[%lld].add=%lld\n",k,t[k].add);
86 }
87 return ;
88 }
89 int mid=(l+r)>>1;
90 build(k*2,l,mid);
91 build(k*2+1,mid+1,r);
92 updata(k);
93 }
94 void F_add(int k,int l,int orzz,int x)
95 {
96 if(t[k].l==t[k].r)
97 {
98 t[k].add=0;t[k].ce=0;t[k].h=0;
99 if(orzz==0)
100 {
101 t[k].ce=1;
102 t[k].h=x;
103 //printf("t[%lld].ce=%lld t[%lld].h=%lld\n",k,t[k].ce,k,t[k].h);
104 }
105 else
106 {
107 t[k].add=x;
108 //printf("t[%lld].add=%lld\n",k,t[k].add);
109 }
110 return ;
111 }
112 int mid=(t[k].l+t[k].r)>>1;
113 if(l<=mid)F_add(k*2,l,orzz,x);
114 else F_add(k*2+1,l,orzz,x);
115 updata(k);
116 }
117 signed main()
118 {
119 //freopen("text.in","r",stdin);
120 // freopen("kkk.out","w",stdout);
121 m=read();q=read();
122 //printf("build\n");
123 build(1ll,1ll,m);
124 //printf("t[1].h=%lld\n",t[1ll].h);
125 for(int i=1;i<=q;++i)
126 {
127 int x,y,z;
128 x=read();y=read();z=read();
129 F_add(1,x,y,z);
130 printf("%lld\n",t[1].h);
131 }
132 }
附上对拍
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5 int c=0;
6 while(true)
7 {
8 system("./pai");//puts("ran work out");
9 system("./b");//puts("ac work out");
10 system("./kkk");//puts("kx work out");
11 if(system("diff -b -B b.out kkk.out"))
12 {
13 puts("WA");
14 return 0;
15 }
16 cout<<++c<<" ";
17 puts("AC");
18 }
19 return 0;
20 }
21 /*
22 g++ pai.cpp -o pai
23 ./pai
24 g++ b.cpp -o b
25 ./b
26 g++ kkk.cpp -o kkk
27 ./kkk
28 g++ ran.cpp -o ran
29 ./ran
30 */
随机数据生成
1 #include<bits/stdc++.h>
2 using namespace std;
3 int random(int m)
4 {
5 return (long long)rand()*rand()%m;
6 }
7 int judge()
8 {
9 int x=rand();
10 if(x%2)return 1;
11 else return 0;
12 }
13 pair<int,int>e[100000];
14 map<pair<int,int>,bool>h;
15 int main()
16 {
17 freopen("text.in","w",stdout);
18 srand((unsigned)time(0));
19 int n=random(7)+1;
20 int m=10;
21 int q=10;
22 printf("%d %d\n",m,q);
23 for(int i=1;i<=m;++i)
24 {
25 printf("%d %d\n",judge(),random(10)+1);
26 }
27 for(int i=1;i<=q;++i)
28 {
29 printf("%d %d %d\n",random(m)+1,judge(),random(10)+1);
30 }
31 return 0;
32 }
【模拟8.10】Weed(线段树)的更多相关文章
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...
- 2018.10.26 NOIP模拟 图(最小生成树+线段树合并)
传送门 首先最开始说的那个一条路径的权值就是想告诉你两个点之间的贡献就是瓶颈边的权值. 那么肯定要用最小生成树算法. 于是我考场上想了30min+30min+30min+的树形dpdpdp 发现转移是 ...
- 2018.10.02 NOIP模拟 序列维护(线段树+广义欧拉定理)
传送门 一道比较好的线段树. 考试时线性筛打错了于是弃疗. 60分暴力中有20分的快速幂乘爆了于是最后40分滚粗. 正解并不难想. 每次区间加打懒标记就行了. 区间查询要用到广义欧拉定理. 我们会发现 ...
- Codeforces 280D k-Maximum Subsequence Sum [模拟费用流,线段树]
洛谷 Codeforces bzoj1,bzoj2 这可真是一道n倍经验题呢-- 思路 我首先想到了DP,然后矩阵,然后线段树,然后T飞-- 搜了题解之后发现是模拟费用流. 直接维护选k个子段时的最优 ...
- 【Foreign】Weed [线段树]
Weed Time Limit: 20 Sec Memory Limit: 512 MB Description 从前有个栈,一开始是空的. 你写下了 m 个操作,每个操作形如 k v : 若 k ...
- BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...
- BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...
- BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com ...
随机推荐
- window系统搭建医药后台系统
软件准备: mysql版本: 5.7 jdk版本:1.8 tomcat版本: 9.0 mysql:5.7 第一步:新建Mysql连接 新建Mysql连接 第二步:新建数据库 新建数据库 第三步 ...
- OJ最大值最小化问题(分发书本)
该类问题通用描述: 有n个物体,每个物体都有一个权值V[i],现在将n个物体连续分成m个部分,m个部分有一个部分会拿到最多的权值v.求所有分配方式中最小的v. 典型题目: 分发书本,宠物屋涂色等. 问 ...
- NtQuerySystemInformation获取进程/线程状态
__kernel_entry NTSTATUS NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass, P ...
- Map 实现类之一:HashMap
Map 实现类之一:HashMapHashMap是 Map 接口 使用频率最高的实现类.允许使用null键和null值,与HashSet一样,不保证映射的顺序.所有的key构成的集合是Set:无 ...
- Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用?
前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整.那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署
之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...
- 常用加密算法学习总结之散列函数(hash function)
散列函数(Hash function)又称散列算法.哈希函数,散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来.该函数将数据打乱混合,重新创建一个叫做散列值(hash values ...
- linux进阶之yum管理
一.部署私有repo源 1.官网下载需要的仓库: rsync -avrt --delete rsync://mirrors.ustc.edu.cn/centos/7/cloud/x86_64/open ...
- linux进阶之远程免密登录,动态添加磁盘及个别基础命令
一. 免密登录(远程连接ssh) ssh IP #连接登录到其它机 ssh 192.168.10.102 ssh IP "CMD" #在其它机器上执行命令 yum -y i ...
- 10.20 host:域名查询工具
host命令 是用于查询DNS的工具,它可以将指定主机名称转换为IP地址. host命令的参数选项及说明 -a 显示详细的DNS信息-t 指定查询的域名信息类型,可以是"A".&q ...