hdu 4031 问题分解+线段树+暴力

原创 2016年08月31日 15:13:30
/*区间有两种情况
如果区间值为1则区间内的数处于同一状态,为0则不属于同一状态,要再分 
记录回复好的时间,如果查询时间》=这个时间,
则区间继续属于回复状态,更新父亲节点值
否则ans  = ans + (R-L + 1)
这种问题的复杂度不太好估计,最坏情况下要一直分下去,
感觉复杂度没有那么好保障
但是也能做吧
上面想的做法应该不对233

查了网上的做法……好像是N^2的算法啊
不会做的时候看看能不能分解问题?
先求出问题的一部分
先求出被攻击的次数,再减去防御的次数
防御的次数用暴力来统计,暴力统计的时候也要记录着,反正每次都是求当前值
可是他把t设置的这么小为什么……
这里学会用树状数组来区间更新,单点求值,比线段树方便不少。 
*/ 
#include<algorithm>
#include<cstdio>
#include<string.h> 
using namespace std;
const int maxn = 20050;
int tree[maxn];
int protect[maxn];
int left[maxn];
int right[maxn]; 
int time1[maxn];
int n;
int lowbit(int x)
{
	return x & -x;
}

int sum(int x)
{
	int ret = 0;
	while(x > 0){
		ret += tree[x];
		x -= lowbit(x);
	}
	return ret;
}

void add(int x,int d){
	while(x <= n){
		tree[x] += d;
		x += lowbit(x);
	}
}

int build()
{
	memset(tree,0,sizeof(tree));
	memset(protect,0,sizeof(protect));
	memset(left,0,sizeof(left));
	memset(right,0,sizeof(right));
	memset(time1,0,sizeof(time1));
}

int main()
{
    int t;
    scanf("%d",&t);
    for(int test = 1; test <= t; test++){
    	printf("Case %d:\n",test);
    	int N,Q,CD;
    	scanf("%d %d %d",&N,&Q,&CD);
    	n = N;
    	build();
    	int cnt = 0;
    	for(int i = 1; i <= Q; i++){
    		char s[20];
    		scanf("%s",s);
    		if (s[0] == 'A'){
    			scanf("%d %d",&left[cnt],&right[cnt]);
    			add(left[cnt],1);
    			add(right[cnt] + 1,-1);
			    cnt++;
			}
			else{
			
				int where;
				scanf("%d",&where);
				for(int j = time1[where]; j < cnt; j++){
				    if (where >= left[j] && where <= right[j]){
				    	protect[where]++;
				    	time1[where] = j + CD;
				    	j = time1[where] - 1;
					}
				}
			    printf("%d\n",sum(where)- protect[where]);
			}
		}
    	
	}
	return 0;
}

相关文章推荐

【线段树II:区间修改+点查询】hdu 4031 Attack

【线段树II:区间修改+点查询】hdu 4031 Attack题目链接:hdu 4031 Attack题目大意有位置1-n个防御塔,每次敌人会对一个区间进行攻击。防御塔有一个冷却时间t。问某个时间时,...

HDU 4031 Attack(离线+线段树)

A - A Time Limit:3000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64u Submit Status...
  • kidozh
  • kidozh
  • 2014年09月03日 21:34
  • 319

hdu 4031 Attack(树形结构-线段树)

Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total S...

hdu 1166线段树

  • 2013年07月02日 16:29
  • 2KB
  • 下载

hdu acm1166线段树

  • 2014年05月03日 18:41
  • 2KB
  • 下载

HDU - 1540 Tunnel Warfare 线段树 或者 让人心酸的暴力过

HDU - 1540 Tunnel Warfare Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Form...

HDU 5634 Rikka with Phi(暴力、线段树)

题意: 给定N,M≤3×105,N为序列长度,M为操作数,保证任意时刻序列值Ai≤107给定N, M\le 3\times10^5, N为序列长度, M为操作数,保证任意时刻序列值A_i\le10...
  • lwt36
  • lwt36
  • 2016年02月27日 16:57
  • 312

HDU4288:Coder(线段树单点更新版 && 暴力版)

Problem Description   In mathematics and computer science, an algorithm describes a set of procedur...

hdu1394 (逆序数,暴力,线段树)

点击打开链接 一直没理解题目什么意思,后来看网上的解释才明白。 1,暴力解法 给你一个有0-n-1组成的序列。这个序列有n-1中排列方式(题中所给的),让你求出那种排列的逆序数最小。 n-1中排列...

hdu 1394 Minimum Inversion Number(最小逆序数) 线段树/暴力

传送门:hdu 1394 Minimum Inversion Number题目大意给定n个数,求这个数组最小逆序数。 可能有很多人对逆序数不太了解,在这里科普一下:对于n个元素来讲,他们之间遵循一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4031 问题分解+线段树+暴力
举报原因:
原因补充:

(最多只允许输入30个字)