题目

link

求偶数子序列

满足

的个数。

分析

首先, 我们先把每一对a[i] + a[j]存起来, 这样就可以把题目的偶数个条件无视了。
设 T[i,j] = a[i] + a[j]; 因为我们是要求序列个数, 所以对于 [i,j]区间, 我们
要找出 [i,j] 内有多少对满足 T[x,y] < T[i,j] 的。
把 (i,j)想成坐标系的点, 那么上面求的就是 平面矩形 {[i,i],[j,j]} 中有多少点。
利用前缀和 和矩形相减就可以快速得出了。所以用二维的树状数组维护就有了。

Code

取余是一个特殊值, 可以直接用unsigned更加简便。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const LL MOD = 1LL<<32;
const int maxn = 500 + 31; struct Point {
int x, y;
LL sum; Point(int _x, int _y, LL _s):\
x(_x),y(_y),sum(_s){} bool operator < (const Point a) const {
if(sum == a.sum) {
return x == a.x ? y < a.y : x < a.x;
} else return sum < a.sum;
}
}; vector<Point> Tmp;
LL Num[maxn][maxn];
LL A[maxn], B[maxn]; ///BIT
int lowbit(int x) { return x&(-x); }
LL Sum(int x, int y) {
LL ret = 0;
int xx = x;
while(xx > 0) {
int yy = y;
while(yy > 0)
{
ret = (ret + Num[xx][yy]) % MOD;
yy -= lowbit(yy);
}
xx -= lowbit(xx);
}
return ret;
}
void Add(int x, int y, LL Val) {
int xx = x;
while(xx < maxn)
{
int yy = y;
while(yy < maxn)
{
Num[xx][yy] = (Num[xx][yy] + Val) % MOD;
yy += lowbit(yy);
}
xx += lowbit(xx);
}
} int main() {
//cout << MOD <<endl;
int t, n;
scanf("%d",&t);
for(int kase = 1; kase <= t; ++kase)
{
Tmp.clear();
memset(Num,0,sizeof(Num));
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%lld",A+i);
for(int i = 0; i < n; ++i)
for(int j = i+1; j < n; ++j)
{
Tmp.push_back(Point(i+1,j+1,(A[i]+A[j])%MOD));
}
sort(Tmp.begin(), Tmp.end());
LL Ans = 0;
for(int i = 0; i < Tmp.size(); ++i)
{
Point t = Tmp[i];
LL ss = (Sum(t.y-1,t.y-1) - Sum(t.x,t.y-1) + MOD) % MOD;
ss = (ss - Sum(t.y-1,t.x) + Sum(t.x,t.x) + MOD) % MOD;
ss = (ss+1) % MOD;
Ans = (Ans + ss) % MOD;
Add(t.x,t.y,ss);
}
//Ans %= MOD;
printf("Case %d: %lld\n",kase, Ans);
}
return 0;
}

Light OJ 1343 - Aladdin and the Black Stones的更多相关文章

  1. Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS

    进入a b 多少努力p, q 使p*q == a && p < q && p >= b 直接大整数分解 然后dfs所有可能的解决方案劫持 #include ...

  2. Light OJ 1341 Aladdin and the Flying Carpet

    题意:求大于b的a的因数对有几组.例10  2结果为{2,5},12 2结果为{2,6}{3,4}-----不反复 解一:分解质因数+DFS #include <iostream> #in ...

  3. Light OJ 1114 Easily Readable 字典树

    题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...

  4. Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖

    题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...

  5. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  6. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  7. light oj 1007 Mathematically Hard (欧拉函数)

    题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...

  8. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  9. Light OJ 1288 Subsets Forming Perfect Squares 高斯消元求矩阵的秩

    题目来源:Light OJ 1288 Subsets Forming Perfect Squares 题意:给你n个数 选出一些数 他们的乘积是全然平方数 求有多少种方案 思路:每一个数分解因子 每隔 ...

随机推荐

  1. linux环境下vim创建java文件,并编译运行

    一.前提 安装Java 二.创建工作目录并编辑java文件 三.编译 四.运行

  2. Tomcat热部署--start tomcat后就可自动部署war包

    使用tomcat图形化界面,需要现在配置文件中设置用户名和密码: 在maven中配置Tomcat插件: root目录下的内容可以直接访问: 跳过测试: 查看端口占用:

  3. Java中的Null是什么?

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  4. python3的字符串和字节

    Python3中内置类型bytes和str用法及byte和string之间各种编码转换 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode(16进制) ...

  5. MT【324】增量代换

    实数$a,b,c$满足$a^2+b^2+c^2=1$求$f=\min\{(a-b)^2,(b-c)^2,(c-a)^2\}$的最大值 分析:由对称性不妨设$c\ge b\ge a$,令$b-a=s,c ...

  6. Linux内核模块编程——Hello World模块

    Linux内核模块编程 编程环境 Ubuntu 16.04 LTS 什么是模块 内核模块的全称是动态可加载内核模块(Loadable Kernel Modul,KLM),可以动态载入内核,让它成为内核 ...

  7. vue关于为空使用默认值

    参考地址:https://segmentfault.com/q/1010000009898107/a-1020000009898747 实现效果如下:

  8. python并发编程之协程知识点

    由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ...

  9. Idea查看并过滤某个接口或者类的实现

    查看当前类的父类 会出现一个图 不过这个有点鸡肋,我们通常想看一个类的实现有哪些,虽然有个方法可以,但是没有图. 查看类的实现 在你想查看的类上 Ctrl+H(Ctrl+Alt+B是直接弹窗,不能过滤 ...

  10. codeforces-1142 (div1)

    div1真难,现在就是后悔, 非常后悔 A.显然如果我们知道起点和终点是哪两个点,我们可以算出距离通过b / gcd(a,b)的方式求出需要走几步的. 并且数据范围似乎也允许我们这么做,所以直接枚举取 ...