题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333
之前遇到过一个一样的问题是用分块做的(http://blog.csdn.net/elicococoo/article/details/24061193),所以这个题想都没想就用分块敲了,然后就被wa一脸。。果然不是正统做法。。
思路:
这个题目的正确姿势是读入全部query,然后将询问按右界排序,然后按数列顺序将数字插入树状数组中,如果该点是query的右界就求和,如果该点的数之前被读入过,就删掉之前读入的位置并将数插入该点中,时间O(nlogn)。
AC代码:
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
#define lowbit(x) x & (-x)
const int M = 30020;
const int Q = 100020;
struct Query
{
int l, r, i;
bool operator < (const Query &i) const
{
return r <