[POJ3378]Crazy Thairs
Problem
给你一个数列,让你求由五个元素组成的顺序对的个数。
Solution
DP:用DP[i][j]表示把第j个作为五元组中第i个的方案数
则DP[i][j]=sum{DP[k][j-1]} (k < i && a[k] < a[i])
所以只要用树状数组维护最小值即可
但需要离散化和高精度。
Notice
代码较长,比较容易写错
Code
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define sqz main
#define ll long long
#define reg register int
#define lowbit(x) (x & -x)
#define rep(i, a, b) for (reg i = a; i <= b; i++)
#define per(i, a, b) for (reg i = a; i >= b; i--)
#define travel(i, u) for (reg i = head[u]; i; i = edge[i].next)
const int INF = 1e9, N = 50000;
const double eps = 1e-6, phi = acos(-1.0);
ll mod(ll a, ll b) {if (a >= b || a < 0) a %= b; if (a < 0) a += b; return a;}
ll read(){ ll x = 0; int zf = 1; char ch; while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar(); while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;}
void write(ll y) { if (y < 0) putchar('-'), y = -y; if (y > 9) write(y / 10); putchar(y % 10 + '0');}
int now, T[N + 5];
struct BigInteger
{
int len;
int val[10];
/* 转换 */
BigInteger(int x = 0)
{
I_TO_B(x);
}
void I_TO_B(int x)
{
len = 0;
memset(val, 0, sizeof(val));
while(x)
{
val[len++] = x % 100000000;
x /= 100000000;
}
}
void print()
{
per(i, len - 1, 0) printf("%d", val[i]);
putchar('\n');
}
friend BigInteger operator +(BigInteger x, BigInteger y)
{
int len = x.len > y.len ? x.len : y.len;
BigInteger ans;
rep(i, 0, len - 1)
{
ans.val[i] += x.val[i] + y.val[i];
ans.val[i + 1] += ans.val[i] / 100000000;
ans.val[i] %= 100000000;
}
if (ans.val[len] != 0) len++;
ans.len = len;
return ans;
}
friend BigInteger operator +(BigInteger x, int t)
{
BigInteger y;
y.I_TO_B(t);
return x + y;
}
friend void operator +=(BigInteger &x, BigInteger y)
{
x = x + y;
}
friend void operator +=(BigInteger &x, int t)
{
x = x + t;
}
friend void operator ++(BigInteger &x)
{
x += 1;
}
};
struct Node
{
int val, id;
}x[N + 5];
int cmp(Node X, Node Y)
{
return X.val < Y.val;
}
struct node
{
BigInteger val[6][N + 5];
void build(int l, int r)
{
rep(i, 1, 5)
rep(j, l, r) val[i][j] = 0;
}
BigInteger query(int x, int y)
{
BigInteger ans = 0;
while(y)
{
ans += val[x][y];
y -= lowbit(y);
}
return ans;
}
void modify(int x, int y, BigInteger v)
{
while (y <= now)
{
val[x][y] += v;
y += lowbit(y);
}
}
}BIT;
int sqz()
{
int n;
while(~scanf("%d", &n))
{
BIT.build(1, N);
rep(i, 1, n) x[i].val = read(), x[i].id = i;
sort(x + 1, x + n + 1, cmp);
now = 0;
rep(i, 1, n)
{
if (x[i].val != x[i - 1].val) now++;
T[x[i].id] = now;
}
rep(i, 1, n)
{
BIT.modify(1, T[i], 1);
rep(j, 2, 5)
BIT.modify(j, T[i], BIT.query(j - 1, T[i] - 1));
}
BIT.query(5, now).print();
}
}
[POJ3378]Crazy Thairs的更多相关文章
- [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)
树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...
- poj 3378 Crazy Thairs dp+线段树+大数
题目链接 题目大意: 给出n个数, 让你求出有多少个5元组满足 i < j < k < l < m并且ai < aj < ak < al < am 我们 ...
- ●POJ 3378 Crazy Thairs
题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ...
- 【POJ】3378 Crazy Thairs(树状数组+dp+高精)
题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ...
- POJ 3378 Crazy Thairs(树状数组+DP)
[题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ...
- [POJ 3378] Crazy Thairs
Link: POJ 3378 传送门 Solution: 按序列长度$dp$, 设$dp[i][j]$为到第$i$个数,符合要求的序列长度为$j$时的序列个数, 易得转移方程:$dp[i][j]=\s ...
- DevOps is dirty work - CI drives you crazy
一直很想谈谈Continuous Integration(CI),持续集成. 就在不久前一次朋友聚会上,一个刚刚跳槽到一家创业公司的朋友跟我抱怨说他们没有CI,没有code review,要做点事太累 ...
- Here's to the crazy ones.
Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square h ...
- [poj1200]Crazy Search(hash)
Crazy Search Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26713 Accepted: 7449 Descrip ...
随机推荐
- 学习笔记30—Windows那些事
1.win10编程窗口:powerShell 2.Win7设置工具栏折叠:我们只需要在底部任务栏空白位置点击鼠标右键,然后选择“属性”,在弹出额属性对话框中,将“任务栏按钮”后面的“始终合并.隐藏标签 ...
- MySQL学习(五)
查询数据的学习与练习 建立一个表 CREATE TABLE goods ( `goos_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `cat_ ...
- Qt访问注册表并调用子进程
在实际应用中需要在一个进程启动另外一个进程,可以将子进程的路径写入注册表中,然后主进程读取注册表中子进程路径,启动子进程,并以命令行参数的形式传入参数,启动子进程.具体实现方式如下 (1) ...
- JS中如何生成全局变量
JS中如何生成全局变量 一.总结 一句话总结:在函数内部,一般用var声明的为局部变量,没用var声明的一般为全局变量 在函数内没用var声明的一般为全局变量 1.js中的函数中的this指向的是谁? ...
- vs2013安装及opencv3.0的配置
vs2013的安装改善计划,不勾选. Windows8 和 windows phone不勾选 然后进行解压安装.(我安装在了e盘的次级目录) 安装完成,点击“启动” 登陆界面,点击“以后再说”. ...
- 尝试重新(多次反复)处理某个逻辑的示例(good)
以下例程的优点: 1.可以重新尝试某个动作 2.另外,在重新尝试的同时,可以做一些逻辑判断及标记的初始化 public static bool RetryLogin() { ...
- English trip V1 - B 18. Workplaces 工作地方 Teacher:Russell Key: do / does
In this lesson you will learn to talk about workplaces. 课上内容(Lesson) My English Teacher name is Russ ...
- C#流(stream)
http://www.cnblogs.com/liuxinls/archive/2013/02/15/2912968.html 流用于对IO处理 在System.IO名称空间中有以下类 BinaryR ...
- 浅谈微服务架构、容器技术与K8S
关注嘉为科技,获取运维新知 企业应用系统:从单体应用走向微服务架构:从裸金属走向容器. 如果在诸多热门云计算技术诸如容器.微服务.DevOps.OpenStack等之中,找出一个最火的方向,那么可能非 ...
- 2019/01/17 对django项目部署的学习
前记:最近在学习django项目的部署. 开发环境:windows10,使用pycharm,python2.7.15,django1.11.本地测试使用nginx和前端交互. 生产环境:centos7 ...