HDU 3333 & 离线+线段树
题意:
统计一段区间内不同数字之和.如1 1 2 3 1 统计2---5即1+2+3.
SOL:
很少打过离线的题目...这种可离线可在线的题不管怎么样一般都是强行在线...
考虑这题,此前做过一个类似的题----POJ的染色,那个题目因为颜色不多,可以用二进制记录状态水过.而这个题目刚开始没有什么想法...更别说带更改的题目了(不过貌似树套树还挺好写的...).
网上的题解都模模糊糊...看了将询问排序就有点醍醐灌顶.
没有修改的这样的询问有什么特点与优势呢? 前面的数对后面没有影响-----当我们将询问按照右端点升序排好后,对于当前询问,右端点以右的数对结果没有影响,
我们可以将数列的元素一个一个插入,如果出现两个元素相同,我们只需要保留坐标更靠后的那一个-----正确性是否显然?对于两个相同元素ai,aj,1<=i<j<=n,我们对一个询问(l,r)进行讨论.
由于排序的性质有r>=j. 若l<=i,则没有什么影响,若l>i,若我们不保存j,就不能得到正确答案.
因为数据比较大,所以不仅要离散化,数据还要开longlong,也是因此wa了一次.
这题过得还是比较轻松,接下来打打修改版的吧...
CODE:
/*==========================================================================
# Last modified: 2016-02-25 14:50
# Filename: hdu3333.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> #define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] #define maxn 200000
#define maxm 200000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull; template<class T> inline
void read(T& num) {
bool start=false,neg=false;
char c;
num=0;
while((c=getchar())!=EOF) {
if(c=='-') start=neg=true;
else if(c>='0' && c<='9') {
start=true;
num=num*10+c-'0';
} else if(start) break;
}
if(neg) num=-num;
}
/*==================split line==================*/
struct Infor{
ll a,id;
}sorta[maxn];
struct Query{
int ql,qr,id;
}q[maxm];
ll ans[maxn],sum[maxn],num[maxn],L,R,cnt=0,number[maxn],last[maxm]; int cmp1(const Query &x,const Query &y){return x.qr<y.qr;}
int cmp(const Infor &x,const Infor &y){ return x.a<y.a; }
void pushup(int o){ sum[o]=sum[o*2]+sum[o*2+1];}
void updata(int o,int l,int r,int q,ll x){
if (l==r) {
sum[o]=x;
return;
}
int mid=rs(l,r),lc=ls(o,0),rc=lc|1;
if (q<=mid) updata(lc,l,mid,q,x);
else updata(rc,mid+1,r,q,x);
pushup(o);
}
ll query(int o,int l,int r){
if (L<=l && r<=R) return sum[o];
int mid=rs(l,r),lc=ls(o,0),rc=lc|1;
ll t=0;
if (L<=mid) t+=query(lc,l,mid);
if (R>mid) t+=query(rc,mid+1,r);
return t;
}
int main(){
int cas; read(cas);
while (cas--){
cnt=1;
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
memset(sorta,0,sizeof(sorta));
memset(q,0,sizeof(q));
memset(number,0,sizeof(number));
memset(last,0,sizeof(last));
int n; read(n);
FORP(i,1,n) {
read(number[i]); sorta[i].a=number[i]; sorta[i].id=i;
}
sort(sorta+1,sorta+1+n,cmp);
ll t=sorta[1].a; num[sorta[1].id]=1;
FORP(i,2,n) {
if (sorta[i].a!=t) ++cnt,t=sorta[i].a;
num[sorta[i].id]=cnt;
}
int m; read(m);
FORP(i,1,m) {read(q[i].ql); read(q[i].qr); q[i].id=i;}
sort(q+1,q+1+m,cmp1);
int head=1;
FORP(i,1,n){
if (last[num[i]]) updata(1,1,n,last[num[i]],0);
last[num[i]]=i;
updata(1,1,n,i,number[i]);
while (q[head].qr==i) {
L=q[head].ql; R=q[head].qr;
ans[q[head].id]=query(1,1,n);
head++;
}
}
FORP(i,1,m) printf("%lld\n",ans[i]);
}
}
HDU 3333 & 离线+线段树的更多相关文章
- hdu 3333 离线线段树 + 思维/树状数组 /在线主席树
#include<iostream> #include<cstdio> #include<string> #include<cmath> #includ ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- HDU 3333 & 3874 (线段树+离线询问)
两个题目都是求区间之内,不重复的数字之和,3333需要离散化处理................. 调试了一下午........说多了都是泪........... #include <iostr ...
- HDU 5700 区间交 离线线段树
区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- bzoj2333 离线 + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...
- BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)
BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...
- HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改
题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...
随机推荐
- elipse插件整理
整理一下用过的eclipse插件: 1. WindowBuilder :swing插件,可以拖啊拖啊拖出来一个窗口,可以显著提高开发效率. 官网: http://www.eclipse.org/w ...
- codevs 1488GangGang的烦恼
题目链接:http://codevs.cn/problem/1488/ 写个高精度大数运算就行 #include<cstdio> #include<iostream> #inc ...
- JQuery阻止冒泡事件on绑定中异常情况分析
科普下事件冒泡以及默认行为,以下面例子举列子: 事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的.事件会随着 DOM 的层次结构依次向上传播. 事件 ...
- Delphi中函数定义和声明的位置
当函数(或过程)A定义在函数(或过程)B之前,那么函数B就可以调用函数A,并且编译成功,例如下面的 procedure TForm1.btn1Click(Sender: TObject); 和 f ...
- 解决Pyqt打包后运行报错:应用程序无法启动 因为程序的并行配置不正确
做了一个生成二维码的小程序:http://www.cnblogs.com/dcb3688/p/4241048.html 直接运行脚本没问题,用pyinstaller打包后再运行就直接报错了: 应用程序 ...
- .Learning.Python.Design.Patterns.2nd.Edition之单实例模式
可以慢慢理解.. 对照JAVA class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.inst ...
- HDU5115 Dire Wolf(区间DP)
渐渐认识到区域赛更侧重的是思维及基本算法的灵活运用,而不是算法的量(仅个人见解),接下来要更多侧重思维训练了. 区间DP,dp[i][j]表示从i到j最终剩余第i 与第j只的最小伤害值,设置0与n+1 ...
- golang基础知识之文件操作
读取文件所有内容以及获得文件操作对象 package mainimport ( "bufio" "fmt" "io" "io/io ...
- Silverlight中的TabControl如何绑定数据?重写tabcontrol和tabItem 解决绑定友好问题。可以绑定对象集合
在 WPF 中,TabControl 可以直接将 ItemsSource 绑定数据源,见 将 TabControl 绑定到数据的示例 http://msdn.microsoft.com/zh-cn/l ...
- java 请求 google translate
// */ // ]]> java 请求 google translate Table of Contents 1. 使用Java获取Google Translate结果 1.1. 开发环境设置 ...