[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 ...
随机推荐
- sort-桶排序
void list_insert(list<int> &t,int num) { auto iter=t.begin(); for(;iter!=t.end();++iter) { ...
- EOJ Monthly 2018.11 D. 猜价格
猜价格 分两种情况讨论: k≤n,先猜至多 k 次 1,由于回答 <1 肯定是假的,所以可以把剩余系下是哪次错试出来,然后用至多 n 次搞定. k>n,每个数都猜两次,如果两次结果不一样, ...
- Python全栈开发-Day12-Mysql数据库和ORM
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...
- 第 6 章 存储 - 042 - 用 volume container 共享数据
volume container volume container 是专门为其他容器提供 volume 的容器.它提供的卷可以是 bind mount,也可以是 docker managed volu ...
- 关于nodejs访问mysql的思考
nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql.安装成功后的访问数据库代码如下: var mysql = require('mysql'); ...
- xpath是什么(入门教程)
xpath是什么(入门教程) 一.总结 一句话总结:一句话,XPath 是一门在 XML 文档中查找信息的语言.简单来说,html类似于xml结构,但是没有xml格式那么严格. 在xml中查找信息 包 ...
- (转)UCOSII源代码剖析
启动工作原理 刚接触操作系统的时候觉得这个最神秘,到底里面做了什么,怎么就成了个操作系统,它到底有什么用,为什么要引进来着个东东.学了之后才知道,原来最根本的思想还是源于汇编里面的跳转和压栈,以调用一 ...
- maven的安装以及问题
https://blog.csdn.net/machao0903/article/details/73368909https://www.cnblogs.com/jiejiecool/p/421885 ...
- ico 图标 生成 工具 网站
http://www.faviconico.org/favicon favicon.ico在线制作,在线Favicon.ico制作转换工具
- gradlew 的https代理设定
在内网编译vlc for Android 时, 总是在 [./gradlew assemble] 卡住, 在网上找到了设置代理的方法: 在gradlew 的同一目录,建立一个 gradle.prope ...