线段树

额 计蒜客竟然把这个出成noip模拟题。。。

这个东西很像1018,只不过维护的东西不太一样

具体有这五种情况,合并请看代码,自己写了一个结果wa了,然后就copy了一下。。。

然后build的时候不用把叶子结点的值赋成inf,感觉奥妙重重

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n, m;
int tree[N << ][], a[N], b[N], c[N], ans[];
void up(int &a, const int &b) { a = min(a, b); } /*
void maintain(int a[5], int l[5], int r[5], int mn, int sm)
{
memset(a, 0x3f3f3f3f, sizeof(tree[0]));
up(a[0], l[0] + r[0] + mn);
up(a[0], l[0] + r[3] + sm);
up(a[0], l[3] + r[0] + sm);
up(a[0], l[1] + r[0] + sm);
up(a[0], l[0] + r[2] + sm);
up(a[1], l[0] + r[1] + mn);
up(a[1], l[3] + r[1] + sm);
up(a[1], l[0] + r[4] + sm);
up(a[1], l[0] + r[3] + mn);
up(a[1], l[0] + r[4] + mn);
up(a[1], l[0] + r[2] + mn);
up(a[2], l[2] + r[0] + mn);
up(a[2], l[4] + r[0] + sm);
up(a[2], l[3] + a[0] + mn);
up(a[2], l[1] + r[0] + mn);
up(a[2], l[2] + r[3] + sm);
up(a[2], l[2] + r[2] + sm);
up(a[3], l[3] + r[3] + sm);
up(a[4], l[2] + r[1] + mn);
up(a[4], l[2] + r[3] + mn);
up(a[4], l[2] + r[4] + sm);
up(a[4], l[3] + r[1] + mn);
up(a[4], l[3] + r[4] + sm);
up(a[4], l[2] + r[1] + mn);
up(a[4], l[4] + r[3] + sm);
up(a[4], l[4] + r[1] + sm);
up(a[4], l[3] + r[3] + mn);
} */
void maintain(int a[] , int l[] , int r[] , int mn , int sm)
{
memset(a , 0x3f3f , sizeof(tree[])); up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + sm); up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm); up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + sm); up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + mn);
up(a[] , l[] + r[] + sm); up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm);
up(a[] , l[] + r[] + sm);
} void build(int l, int r, int o)
{
if(l == r)
{
tree[o][] = c[l];
// tree[o][1] = tree[o][2] = 0x3f3f3f3f;
return;
}
int mid = (l + r) >> ;
build(l, mid, o << );
build(mid + , r, o << | );
int mn = min(a[mid], b[mid]), sm = a[mid] + b[mid];
maintain(tree[o], tree[o << ], tree[o << | ], mn, sm);
// printf("l = %d r = %d\n", l, r);
// for(int i = 0; i < 5; ++i) printf("tree[%d][%d] = %d\n", o, i, tree[o][i]);
}
void update(int l, int r, int o, int pos)
{
if(l == r)
{
tree[o][] = c[l];
return;
}
int mid = (l + r) >> ;
if(pos <= mid) update(l, mid, o << , pos);
else update(mid + , r, o << | , pos);
int mn = min(a[mid], b[mid]), sm = a[mid] + b[mid];
maintain(tree[o], tree[o << ], tree[o << | ], mn, sm);
}
bool query(int l, int r, int o, int la, int lb, int tmp[])
{
if(l > lb || r < la) return false;
if(l >= la && r <= lb)
{
for(int i = ; i < ; ++i) tmp[i] = tree[o][i];
return true;
}
int mid = (l + r) >> , tmp1[], tmp2[];
bool flag1 = query(l, mid, o << , la, lb, tmp1);
bool flag2 = query(mid + , r, o << | , la, lb, tmp2);
if(flag1 && flag2)
{
int mn = min(a[mid], b[mid]), sm = a[mid] + b[mid];
maintain(tmp, tmp1, tmp2, mn, sm);
return true;
}
if(flag1)
{
for(int i = ; i < ; ++i) tmp[i] = tmp1[i];
return true;
}
if(flag2)
{
for(int i = ; i < ; ++i) tmp[i] = tmp2[i];
return true;
}
return false;
}
int main()
{
cin >> n >> m;
for(int i = ; i < n; ++i) scanf("%d", &a[i]);
for(int i = ; i < n; ++i) scanf("%d", &b[i]);
for(int i = ; i <= n; ++i) scanf("%d", &c[i]);
build(, n, );
while(m--)
{
int x0, x1, y0, y1, w;
char opt[];
scanf("%s", opt);
if(opt[] == 'C')
{
scanf("%d%d%d%d%d", &x0, &y0, &x1, &y1, &w);
if(x0 == x1)
{
if(y0 > y1) swap(y0, y1);
if(x0 == ) a[y0] = w;
if(x0 == ) b[y0] = w;
update(, n, , y0);
update(, n, , y1);
}
if(y0 == y1)
{
c[y0] = w;
update(, n, , y0);
}
}
if(opt[] == 'Q')
{
scanf("%d%d", &y0, &y1);
query(, n, , y0, y1, ans);
printf("%d\n", ans[]);
}
}
return ;
}

bzoj3995的更多相关文章

  1. 【线段树】bzoj3995 [SDOI2015]道路修建

    线段树每个结点维护5个域: 整个区间的MST. 将两个左端点连通,两个右端点不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块. 将两个右端点连通,两个左端点不连通,整个区间 ...

  2. 【BZOJ3995】[SDOI2015]道路修建 线段树区间合并

    [BZOJ3995][SDOI2015]道路修建 Description  某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L&l ...

  3. bzoj3995[SDOI2015]道路修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=3995 线段树维护连通性. 我们发现,对于一个区间[L,R],我们只需要知道(1,L),(2,L),( ...

  4. [bzoj3995] [SDOI2015]道路修建 线段树

    Description 某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L<=R),修建若干条专用道路,使得这两列之间(包括 ...

随机推荐

  1. [luoguP2216] [HAOI2007]理想的正方形(二维单调队列)

    传送门 1.先弄个单调队列求出每一行的区间为n的最大值最小值. 2.然后再搞个单调队列求1所求出的结果的区间为n的最大值最小值 3.最后扫一遍就行 懒得画图,自己体会吧. ——代码 #include ...

  2. 【POJ2406】Power Strings(KMP,后缀数组)

    题意: n<=1000000,cas较大 思路:这是一道论文题 后缀数组已弃疗,强行需要DC3构造,懒得(不会)写 ..]of longint; n,m,i,j,len,ans,st:longi ...

  3. (转)详解shell中>/dev/null 2>&1到底是什么

    转 原文地址:https://blog.csdn.net/zouli415/article/details/80651526 前言 相信大家经常能在shell脚本中发现>/dev/null 2& ...

  4. POJ 3230 【DP】

    题意: 某货旅行,在n个城市呆m天. 给出从第i个城市到第j个城市的路费,或者留在某个城市的生活费. 给出在第i天在第j个城市的收益. 可以在城市之间任意穿梭逗留没有其他特殊要求. 求收益最大是多少. ...

  5. Java数组操作方法收集(快速判断某个值在这个数组中)

    Java数组操作最高效的方式是循环取值,如果转换成集合那么就会分配内存,效率不如前者,但是方法多,需要在性能调优上去权衡.切记:数组是数组,集合是集合. 下面是收集最常用的数组转成集合的操作方法: i ...

  6. jdk8 stream可以与list,map等数据结构互相转换

    前面我们使用过collect(toList()),在流中生成列表.实际开发过程中,List又是我们经常用到的数据结构,但是有时候我们也希望Stream能够转换生成其他的值,比如Map或者set,甚至希 ...

  7. 搭建网络svn实战

    工作中的问题(7) 转自:http://blog.csdn.net/xiaoting451292510/article/details/8562570 经常性我们和朋友写一些程序,大家在不同的城市确有 ...

  8. jmeter的master远程运行和停止slave

    jmeter可以部署成master-slave或者叫client-server模式,一个master(client)可以同时控制多个slave(server). 在linux系统下,master(cl ...

  9. jmeter的jmx脚本结构解析

    jmeter的jmx脚本是xml文档,简单分析下其结构 xml是树形结构:jmeter界面的树形结构就是xml的结构 一级目录: 二级目录:在一级目录右键后可以看到的,都可以做为二级目录 三级目录.n ...

  10. 初探无线安全审计设备WiFi Pineapple Nano系列之PineAP

    前言: 之前曾经介绍过国外无线安全审计设备The WiFi Pineapple Nano的SSLsplit模块和ettercap模块及实验. 在玩WiFi Pineapple Nano 设备的过程中, ...