2014 ACM/ICPC Asia Regional Xi'an Online
03 hdu5009
状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数。
普通的O(n*n)是会超时的,可以想到o[]最大为sqrt(n),问题是怎么快速找到从i开始往前2种颜色、三种、四种。。。o[]种的位置。
离散化之后,可以边走边记录某个数最后一个出现的位置,初始为-1,而所要求的位置就等于
if(last[a[i]]==-1) 该数没有出现过,num[i][1] = i,num[i][j+1] = num[i-1][j];
else last[a[i]]之前 num[i][1] = i,num[i][j+1] = num[i-1][j],之后num[i][j]= num[i-1][j];
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define N 50010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int a[N];
int dp[N];
int num[][],last[N];
map<int,int>f;
int main()
{
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
f.clear();
int g = ;
for(i = ; i<= n ;i++)
{
scanf("%d",&a[i]);
if(!f[a[i]])
{
f[a[i]] = ++g;
a[i] = g;
}
else a[i] = f[a[i]];
}
for(i = ; i <= n; i++)
dp[i] = INF;
memset(last,-,sizeof(last));
memset(num,,sizeof(num));
int k = sqrt(n*1.0)+;
int tk = ;
dp[] = ;
last[a[]] = ;
num[][] = ;
dp[] = ;
for(i = ; i <= n ;i++)
{
if(last[a[i]]==-)
{
tk+=;
num[i%][] = i;
for(j = ; j <= min(tk-,k-) ; j++)
num[i%][j+] = num[(i-)%][j];
}
else
{ num[i%][] = i;
for(j = ; j < min(k,tk) ; j++)
{
if(last[a[i]]==num[(i-)%][j]) break;
num[i%][j+] = num[(i-)%][j];
}
for(int g = j+ ; g <= min(tk,k) ; g++)
num[i%][g] = num[(i-)%][g];
}
last[a[i]] = i;
for(j = ; j <= min(k,tk); j++)
{
int po = num[i%][j+];
dp[i] = min(dp[i],dp[po]+j*j);
// cout<<dp[po]<<" "<<po<<endl;
}
}
printf("%d\n",dp[n]); }
return ;
}
09 hdu5015
构造矩阵
先构造出1*(n+2)的矩阵 (233, 233+a1, 233+a1+a2, 233+a1+a2+a3, ..., 233+a1+a2+..+an, 1),表示第一列上的值。
此矩阵为A,然后想要使A*B = C,C为第二列的值,所以B可以为
10 10 10 10 10 .......0
0 1 1 1 1........0
0 0 1 1 1........0
0 0 0 1 1........0
0 0 0 0 1........0
3 3 3 3 3........1
然后快速幂就可以了。。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 12
#define LL __int64
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
#define mod 10000007
struct Mat
{
LL mat[N][N];
};
int n;
int a[N];
Mat operator * (Mat a,Mat b)
{
Mat c;
memset(c.mat,,sizeof(c.mat));
int i,j,k;
for(k = ; k < n ; k++)
{
for(i = ; i < n ; i++)
{
if(a.mat[i][k]==) continue;//优化
for(j = ; j < n ; j++)
{
if(b.mat[k][j]==) continue;//优化
c.mat[i][j] = (c.mat[i][j]+(a.mat[i][k]*b.mat[k][j])%mod)%mod;
}
}
}
return c;
}
Mat operator ^(Mat a,int k)
{
Mat c;
int i,j;
for(i = ; i < n ; i++)
for(j = ; j < n ; j++)
c.mat[i][j] = (i==j);
for(; k ; k >>= )
{
if(k&) c = c*a;
a = a*a;
}
return c;
}
int main()
{
int m,i,j;
Mat c;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(c.mat,,sizeof(c.mat));
for(i = ; i <= n; i++)
{
c.mat[][i] = ;
for(j = ; j <= i ; j++)
c.mat[j][i] = ;
}
for(i = ; i <= n ; i++)
c.mat[n+][i] = ;
c.mat[n+][n+] = ;
LL s = ;
Mat ans;
memset(ans.mat,,sizeof(ans));
ans.mat[][] = s;
for(i = ; i <= n; i++)
{
scanf("%d",&a[i]);
s+=a[i];
s%=mod;
ans.mat[][i] = s;
}
ans.mat[][n+] = ;
int tn = n;
n+=;
if(m>)
ans = ans*(c^(m-));
// for(i = 0 ; i < n ; i++)
// {for(j = 0; j< n ; j++)
// cout<<c.mat[i][j]<<" ";
// puts("");
// }
// for(i = 0 ; i < n ; i++)
// {
// for(j = 0; j < n ; j++)
// cout<<ans.mat[i][j]<<" ";
// puts("");
// }
printf("%I64d\n",ans.mat[][tn]);
}
return ;
2014 ACM/ICPC Asia Regional Xi'an Online的更多相关文章
- hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)
思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’ 'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...
- 2014 ACM/ICPC Asia Regional Xi'an Online Paint Pearls
传说的SB DP: 题目 Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...
- 2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)
题目链接 A题:(字符串查找,水题) 题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Son ...
- HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP
Clone Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other) Total Submiss ...
- HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...
- HDU 5000 Clone(离散数学+DP)(2014 ACM/ICPC Asia Regional Anshan Online)
Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself ...
- 2014 ACM/ICPC Asia Regional Shanghai Online
Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...
- 2014 ACM/ICPC Asia Regional Guangzhou Online
Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...
随机推荐
- 纯html、css3、js的时钟
之前在网上看了一些使用js写的时钟,但感觉实现的方法有点麻烦,所以就自己重新写了一个例子,样子有点丑,但方法比较简单,大家就凑合看吧 其中采用的主要方法是原生js里面的Data(时期)对象,以及它的. ...
- Mybatis传多个参数(三种解决方案)
http://blog.csdn.net/liangyihuai/article/details/49965869 (zhuan)
- C++之动态数组
C99支持一种名为变长数组的结构来方便程序员.C++也提供了一种长度可在程序运行时确定的数组类型:动态数组.声明格式为:(声明 int 类型的数组) ; //此处可修改 ArraySize 的值 in ...
- C++预定义字符函数
利用 get 成员函数可读取文件中的一切字符,包括空白字符.文件结尾.用 >> 读取文件,会自动忽略空白字符(空格.换行符.制表符) C++ 预定义的字符函数(均在 cctype 库中定义 ...
- Qt timer学习
QTimer(重复和单发计时器) 应用QTimer时,先创建一个QTimer类,利用connect将timeout()与对应槽函数连接,在调用start()函数设置定时器时间间隔,每经过设置时间后,定 ...
- win2008使用FireDac连接ORACLE数据库问题
2008上装DELPHI XE7,无论用FireDac 还是Ado都连不上ORACLE数据库 --------------------------- Debugger Exception Notifi ...
- C#的HTTP协议中POST与GET的区别
引言 HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然来.但是如果我问你HTTP协议的请求方法有哪些?POST与GET的差异?GET或POST传送数据量的大小有限制吗?HTTP响应的状态 ...
- web学习之Django--安装
前提有python,easy_install 关于easy_install 的安装,比较简单的装法 : wget -q http://peak.telecommunity.com/dist/ez_se ...
- HTTP/TCP
转:http://blog.csdn.net/sundacheng1989/article/details/28239711 http://blog.csdn.net/sundacheng1989/a ...
- JavaScript中的闭包和匿名函数
JavaScript中的匿名函数及函数的闭包 1.匿名函数 2.闭包 3.举例 4.注意 1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没 ...