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;
}

hdu5143 暴力枚举

http://acm.hdu.edu.cn/showproblem.php?pid=5143 Problem Description NPY is learning arithmeti...
  • u013573047
  • u013573047
  • 2014年12月14日 20:17
  • 1216

最大字段和 暴力 分治 动态规划时间对比

//============================================================================ // Name : maxs...
  • judyge
  • judyge
  • 2015年04月17日 17:55
  • 1171

【HDU】5930 GCD【暴力+线段树二分】

题目链接:GCD首先以每个点作为右端点的相同区间gcd的左端点构成一个区间,则这些区间最多只有log个。nlogn暴力预处理出每个gcd值的个数。 考虑修改第i个点值对所有gcd值的影响,影响的gc...
  • u013368721
  • u013368721
  • 2016年10月08日 11:00
  • 1084

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

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

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
  • 358

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

Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total S...
  • u011836218
  • u011836218
  • 2014年08月19日 10:50
  • 272

hdu 1166线段树

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

hdu acm1166线段树

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

HDU5475——An easy problem(线段树or暴力)

题目链接        题目意思很好理解,给定若干操作Q,给定一个模值M,操作分两种,1 和  2,给定一运算值并赋初值为1,当操作数为1时,运算值乘以操作数1后的数。当操作数为2时,运算值除以...
  • Jason_crawford
  • Jason_crawford
  • 2016年07月18日 16:37
  • 316

HDU1394 Minimum Inversion Number [暴力] [线段树-单点更新]

题意: 分析: //AC CODE(暴力): #include #include using namespace std; int sec[5010]; int main()...
  • lmyclever
  • lmyclever
  • 2011年10月05日 20:01
  • 472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4031 问题分解+线段树+暴力
举报原因:
原因补充:

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