hdu1540(线段树区间合并)
来源:互联网 发布:ty90遥控编程器官网 编辑:程序博客网 时间:2024/05/21 21:58
这题是个很恶心的题,区间合并是比较裸的。但这题有的东西没有叙述清楚,题目上说的是一组数据,但测试数据却是多组数据,这题还有几点需要注意的,一是一个村庄可以被摧毁多次,当然如果你代码写得好,这点也是没关系的。我当时用b^=1来表示每次变化,但如果;连续摧毁两次,我的结果就相当于重建了,后来只有老老实实的写了。所以大家得注意到类似多多次摧毁的问题。后来都改过来了却一直1000多ms wa,我想可能是有些小细节没注意到,又是摧毁的问题,如果村子摧毁了,那么这个村子就没有相连的村子。改过来后果断a了。楼主水平比较低,查询时写了两个查询函数,一是查询村子左边连续的个数,一是右边连续的个数。网上看别人大神的代码,run的时间比我少,需要的空间比我少,代码长度比我少。。。真的是得继续努力!
#include <iostream>#include<stdio.h>#include<algorithm>#include<stack>#define MAX 50100using 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;}
0 0
- hdu1540(线段树区间合并)
- hdu1540 线段树区间合并
- hdu1540线段树区间合并
- hdu1540(线段树区间合并)
- hdu1540 Tunnel Warfare(线段树区间合并详解)
- HDU1540-Tunnel Warfare(线段树区间合并)
- HDU1540:Tunnel Warfare(线段树区间合并)
- hdu1540 Tunnel Warfare 线段树区间合并
- HDU1540-Tunnel Warfare-线段树区间合并
- hdu1540 Tunnel Warfare 线段树区间合并
- HDU1540 Tunnel Warfare (线段树区间合并)
- hdu1540-Tunnel Warfare 线段树区间合并
- HDU1540 Tunnel Warfare(线段树,区间合并)
- HDU1540 Tunnel Warfare (线段树区间合并)
- HDU1540 Tunnel Warfare(线段树+区间合并)
- HDU1540 Tunnel Warfare(线段树区间合并)
- HDU1540 Tunnel Warfare(线段树区间合并 | 线段树新姿势)
- HDU1540--线段树(最长连续区间)
- Yahu谈游戏哲学:什么是游戏性
- 3.OC之NSMutableArray
- 用python统计文本里的单词出现次数最多的10个
- 继承后基类、派生类的访问属性
- linux 标准GPIO 驱动模型—version1
- hdu1540(线段树区间合并)
- C++ 内存划分与虚函数表在内存中的位置
- 1025. PAT Ranking (25)
- ADT升级中出现的问题的解决方案
- HBuild+MUI学习笔记(三):安卓模拟器安装时的注意事项
- jquery选择器(原创)<四>
- C++起航,hello world
- 修改Eclipse创建项目的默认charset 为utf-8
- My first blog on CSDN