HDU 4031 Attack (线段树)
成功袭击次数=所有袭击次数-成功防守次数
需要一个辅助pre来记录上一次袭击成功什么时候,对于每个查询,从上一次袭击成功开始,每隔t更新一次。
感觉这样做最坏时间复杂度是O(n^2),这里 说是O(q)*O(q/t)log(n),应该是超时边缘。
能AC或许因为数据不强。
PS.初始化的时候直接memset会超时,每次根据N的大小build线段树,memset也根据N的大小来就能AC。
#include <cstdio>
#include <cstring>
#include <cstdlib> #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lc rt << 1
#define rc rt << 1 | 1 using namespace std; const int MAXN = ; struct node
{
int l, r;
}; node D[MAXN];
int sum[ MAXN << ];
int flag[ MAXN << ];
int pre[ MAXN ];
int defen[MAXN];
int N, Q, t; void PushDown( int rt, int m )
{
if ( flag[rt] )
{
flag[lc] += flag[rt];
flag[rc] += flag[rt];
sum[lc] += flag[rt]*(m-(m>>));
sum[rc] += flag[rt]*(m>>);
flag[rt] = ;
}
return;
} void update( int L, int R, int l, int r, int rt )
{
if ( L <= l && r <= R )
{
sum[rt] += ;
flag[rt] += ;
return;
}
PushDown(rt, r - l + );
int m = ( l + r ) >> ;
if ( L <= m ) update( L, R, lson );
if ( R > m ) update( L, R, rson );
return;
} int query( int L, int l, int r, int rt )
{
if ( L == l && r == L ) return sum[rt];
PushDown(rt, r - l + );
int m = ( l + r ) >> ;
if ( L <= m ) return query( L, lson );
else return query( L, rson );
} void build( int l, int r, int rt )
{
flag[rt] = sum[rt] = ;
if ( l == r ) return;
int m = ( l + r ) >> ;
build( lson );
build( rson );
return;
} int main()
{
int T, cas = ;
scanf( "%d", &T );
char str[];
while( T-- )
{
scanf( "%d%d%d", &N, &Q, &t );
build( , N, );
memset( defen, , sizeof(int)*(N+) );
memset( pre, , sizeof(int)*(N+) );
memset( D, , sizeof(D[])*(N+) ); int cnt = ;
printf( "Case %d:\n", ++cas );
for ( int i = ; i < Q; ++i )
{
scanf( "%s", str );
if ( str[] == 'A' )
{
scanf("%d%d", &D[cnt].l, &D[cnt].r );
update( D[cnt].l, D[cnt].r, , N, );
++cnt;
}
else
{
int a;
scanf( "%d", &a );
for ( int i = pre[a]; i <= cnt; )
{
if ( a >= D[i].l && a <= D[i].r )
{
pre[a] = i + t;
++defen[a];
i += t;
}
else ++i;
}
//printf("qry=%d def=%d\n", query(a, 1, N, 1 ), defen[a] );
printf( "%d\n", query(a, , N, ) - defen[a] );
}
//printf("***qry=%d def=%d\n", query(5, 1, N, 1 ), defen[5] );
}
}
return ;
}
HDU 4031 Attack (线段树)的更多相关文章
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4031 Attack 线段树
题目链接 Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...
- hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
随机推荐
- CNMeM is disabled
See here: http://deeplearning.net/software/theano/library/config.html You can change this in the env ...
- 牛客小白月赛1 I あなたの蛙が帰っています 【卡特兰数】
链接:https://www.nowcoder.com/acm/contest/85/I题目描述 あなたの蛙が帰っています! 蛙蛙完成了一趟旅行,回家啦!但它还是没有去它心中非常想去的几个地方.总共 ...
- Linux自带mariadb卸载
MySQL安装过程中报错: dpkg: regarding mysql-community-server_5.6.39-1debian9_i386.deb containing mysql-commu ...
- percona-zabbix-templates插件安装监控MySQL
前期准备:被监控机已经安装好php 1.在zabbix客户端安装mysql监控插件rpm包 rpm -ivh https://www.percona.com/downloads/percona-mon ...
- scrapy--dbmeinv
第一次将自己的爬虫文件与大家分享.豆瓣美女网页图片爬取.比较简单,但很实用.给大家提供思路为主,增强个人的爬虫能力.希望能帮助到大家!!! 好了,让我们进入正题. 先给大家看下成果!!!激励大家赶快行 ...
- php精华之独孤九剑
首先分享一个地址 https://segmentfault.com/a/1190000013696265(这个是主要的分享,人家作者写的非常棒
- Ajax全解析
什么是Ajax Ajax基本概念 Ajax(Asynchronous JavaScript and XML):翻译成中文就是异步的JavaScript和XML. 从功能上来看是一种在无需重新加载整个网 ...
- 笔记-git-协作开发
笔记-git-协作开发 1. git协作开发 git协作的典型做法是,创建一个git服务器,被多个人操作. 示意图如下: 一般来说协作分为如下几个步骤: 创建一个git裸服务器 (git i ...
- Android 程序中获取一个反向 Shell
代码如下: String command = "ls -al /"; Process process = Runtime.getRuntime().exec(command); 之 ...
- python文件,字符串,二进制的读写
读文件: f = open('/Users/michael/test.txt', 'r') #一次读取文件的全部内容 f.read() #文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且 ...