hdu1540(线段树区间合并)
2015-09-05 22:28
441 查看
这题是个很恶心的题,区间合并是比较裸的。但这题有的东西没有叙述清楚,题目上说的是一组数据,但测试数据却是多组数据,这题还有几点需要注意的,一是一个村庄可以被摧毁多次,当然如果你代码写得好,这点也是没关系的。我当时用b^=1来表示每次变化,但如果;连续摧毁两次,我的结果就相当于重建了,后来只有老老实实的写了。所以大家得注意到类似多多次摧毁的问题。后来都改过来了却一直1000多ms wa,我想可能是有些小细节没注意到,又是摧毁的问题,如果村子摧毁了,那么这个村子就没有相连的村子。改过来后果断a了。楼主水平比较低,查询时写了两个查询函数,一是查询村子左边连续的个数,一是右边连续的个数。网上看别人大神的代码,run的时间比我少,需要的空间比我少,代码长度比我少。。。真的是得继续努力!
#include <iostream> #include<stdio.h> #include<algorithm> #include<stack> #define MAX 50100 using namespace std; int n,m; typedef struct { int left,right,lnum,rnum,mid,len; void get() { mid=(right+left)>>1; len=right-left+1; } void set(int a) { lnum=rnum=a; } }P; P p[MAX*4]; int d[MAX]; void push_up(int k) { int lt=k<<1,rt=lt+1; p[k].lnum= p[lt].lnum== p[lt].len? p[lt].lnum+ p[rt].lnum: p[lt].lnum; p[k].rnum= p[rt].rnum== p[rt].len? p[rt].rnum+ p[lt].rnum: p[rt].rnum; } void build(int k,int l,int r) { p[k].left=l; p[k].right=r; p[k].get(); if(l==r) { p[k].set(1); return; } build(k<<1,l, p[k].mid); build(k<<1|1, p[k].mid+1,r); push_up(k); } void update(int k,int a,int f) { if( p[k].len==1) { d[a]=f; p[k].set(d[a]); return; } if(a<= p[k].mid) update(k<<1,a,f); else update(k<<1|1,a,f); push_up(k); } int query_left(int k,int l,int a) { if( p[k].left==l&& p[k].right==a) return p[k].rnum; if( p[k].mid>=a) return query_left(k<<1,l,a); else { int temp=query_left(k<<1|1, p[k].mid+1,a); return temp==a- p[k].mid? temp+ p[k<<1].rnum:temp; } } int query_right(int k,int a,int r) { if( p[k].left==a&& p[k].right==r) return p[k].lnum; if( p[k].mid<a) return query_right(k<<1|1,a,r); else { int temp =query_right(k<<1, a, p[k].mid); return temp== p[k].mid-a+1? temp+ p[k<<1|1].lnum:temp; } } int main() { char ch; int a; while(scanf("%d%d",&n,&m)!=EOF) { stack<int> s; build(1,1,n); fill(d+1,d+1+n,1); while(m--) { cin>>ch; if(ch=='D') { scanf("%d",&a); s.push(a); update(1,a,0); } if(ch=='Q') { scanf("%d",&a); if(d[a]) printf("%d\n",a!=n?query_left(1,1,a)+query_right(1,a+1,n):query_left(1,1,a)); else printf("0\n"); } if(ch=='R') { if(s.empty()) continue; a=s.top(); s.pop(); update(1,a,1); } } } return 0; }
相关文章推荐
- C++ 内存划分与虚函数表在内存中的位置
- 手环方案
- hdu 5279 Reflect phi 欧拉函数
- 贪心算法简介
- 项羽过江
- 王力:怎样学习古代汉语(zz)
- shell
- JQuery之编写弹窗
- 华为机试测试- 字符串最长的数字串
- for_each_process
- 2015-09-05
- 鸡汤乱入
- 组合模式(Composite Pattern)
- HDU 1542 Atlantis
- 使用switch语句键盘录入一个月份,判断季节
- Canvas制作排序算法演示动画
- IOS工作笔记1年,收集整理,常用方法
- Java开发工程师职业发展图
- OpenERP|odoo Web开发
- matlab自定义函数的五种表示(前2种重点)