FZU-1921+线段树
简单的线段树。
记录MinVal 和 相应的ID即可
/*
线段树
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = ;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-;
#define L(x) (x<<1)
#define R(x) (x<<1|1) struct Tree{
int l,r,id,val;
}tree[ maxn<< ];
int a[ maxn ]; void build( int L,int R,int n ){
tree[ n ].l = L;
tree[ n ].r = R;
if( L==R ){
tree[ n ].id = L;
tree[ n ].val = a[ L ];
return ;
}
//tree[ n ].val = 0;
int mid = (L+R)/;
build( L,mid,L(n) );
build( mid+,R,R(n) );
if( tree[ L(n) ].val<tree[ R(n) ].val ) {
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else if( tree[ L(n) ].val==tree[ R(n) ].val ){
if( tree[L(n)].id<tree[R(n)].id ){
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
} void update1( int val,int L,int R,int n ){
if( L==R ){
tree[ n ].val += val;
return ;
}
int mid = (L+R)/;
if( tree[n].id<=mid ) update1( val,L,mid,L(n) );
else update1( val,mid+,R,R(n) );
if( tree[ L(n) ].val<tree[ R(n) ].val ) {
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else if( tree[ L(n) ].val==tree[ R(n) ].val ){
if( tree[L(n)].id<tree[R(n)].id ){
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
} void update2( int id,int val,int L,int R,int n ){
if( L==R ){
tree[ n ].val += val;
return ;
}
int mid = (L+R)/;
if( id<=mid ) update2( id,val,L,mid,L(n) );
else update2( id,val,mid+,R,R(n) );
if( tree[ L(n) ].val<tree[ R(n) ].val ) {
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else if( tree[ L(n) ].val==tree[ R(n) ].val ){
if( tree[L(n)].id<tree[R(n)].id ){
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
} void query( int L,int R,int n ){
if( L==R ) return ;
int mid = (L+R)/;
query( L,mid,L(n) );
query( mid+,R,R(n) );
if( tree[ L(n) ].val<tree[ R(n) ].val ) {
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else if( tree[ L(n) ].val==tree[ R(n) ].val ){
if( tree[L(n)].id<tree[R(n)].id ){
tree[ n ].val = tree[ L(n) ].val;
tree[ n ].id = tree[ L(n) ].id;
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
}
else {
tree[ n ].val = tree[ R(n) ].val;
tree[ n ].id = tree[ R(n) ].id;
}
} int main(){
int T;
int Case = ;
scanf("%d",&T);
while( T-- ){
int n;
scanf("%d",&n);
for( int i=;i<=n;i++ )
scanf("%d",&a[i]);
build( ,n, );
int m;
scanf("%d",&m);
int x,y;
while( m-- ){
scanf("%d%d",&x,&y);
if( x== ) update1( y,,n, );
else update2( x,y,,n, );
}
query( ,n, );
printf("Case %d: %d %d\n",Case++,tree[].id,tree[].val);
}
return ;
}
FZU-1921+线段树的更多相关文章
- FZU 2171 线段树 区间更新求和
很模板的题 在建树的时候输入 求和后更新 #include<stdio.h> #include<string.h> #include<algorithm> #inc ...
- FZU 2171(线段树的延迟标记)
题意:容易理解. 分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞, 然后我就一直没去碰线段树的题了 ...
- FZU 2105 (线段树)
Problem 2105 Digits Count Problem Description Given N integers A={A[0],A[1],...,A[N-1]}. Here we h ...
- HDU 3974 Assign the task(简单线段树)
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- FZU 1921——栀子花开——————【线段树单点更新】
栀子花开 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】
FZU 2105 Digits Count Time Limit:10000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- F - Change FZU - 2277 (DFS序+线段树)
题目链接: F - Change FZU - 2277 题目大意: 题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作 (1) 1 v k x : a[v] += x, a[v ' ...
- FZU 2105 Digits Count(按位维护线段树)
[题目链接] http://acm.fzu.edu.cn/problem.php?pid=2105 [题目大意] 给出一个序列,数字均小于16,为正数,每次区间操作可以使得 1. [l,r]区间and ...
- FZu Problem 2236 第十四个目标 (线段树 + dp)
题目链接: FZu Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...
- FZU 2105 Digits Count(线段树)
Problem 2105 Digits Count Accept: 302 Submit: 1477 Time Limit: 10000 mSec Memory Limit : 262144 KB P ...
随机推荐
- C#中的二进制序列化和Json序列化
序列化就是把一个对象变成流的形式,方便传输和还原.小弟不才,总结下对二进制序列化和Json序列化的使用: 1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在 ...
- 制作BibTex文件
上一篇日志中讲到了在LaTeX中使用BibTex管理参考文献,这篇日志具体总结下如何制作BibTex文件. 制作BibTex文件,主要有以下几种方法: 手工制作: 直接从期刊数据库中下载: 借助Goo ...
- krpano资料
- 插件笔记——dataTables使用说明
jquery DataTables中文使用说明 出处:http://blog.vunso.com/201405/jquery-datatables%E4%B8%AD%E6%96%87%E4%BD%BF ...
- C++ 的隱式型別轉換
先上一段代碼, 這段代碼竟然可以編譯過,我的老天! class Boo { Boo(int c){ cout << "I'm Boo"; } }; void do_so ...
- CMake基础教程
如果需要配置和检查我们工程中的所有依赖,那么可以选用CMake工具:但是,这并不是必须的,因为我们可以使用其他的工具或者是IDE(比如Makefiles或者Visual Studio)来配置我们的工程 ...
- Limit参数优化MySQL查询的方法
在做一些查询时,总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的.那么,在mysql中有那些方式是可以避免全表扫面?除了通过使用索引列或分区等方式来进行 ...
- linux计划任务运行php文件的方法分享
在linux下,借助crontab,设置计划任务每天6点10分执行filename.php文件,写入一行时间到log日志中. 创建计划任务的脚本: dos2unix /path/to/filename ...
- Spark小课堂Week4 从控制台看Spark逻辑结构
Spark小课堂Week4 从控制台看Spark逻辑结构 层级关系: 从监控控制台,我们可以看到如下关系: 一个 Job 包含 n Stage 一个 Stage 包含 n Task Job0解决什么问 ...
- Spark Streaming揭秘 Day5 初步贯通源码
Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...