2015-10-08 19:14:54

总结:赛后补的一场。题目蛮有意思的。

A:DFS

思路:搜一下几个环然后判断一下即可。

#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define MP(a,b) make_pair(a,b)
#define PB push_back typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-;
const int INF = ( << ) - ;
const int MAXN = ; int T;
int n,ans,cnt;
int A[MAXN],B[MAXN],pos[MAXN];
int vis[MAXN]; void Dfs(int p){
if(vis[p]) return;
cnt++;
vis[p] = ;
Dfs(pos[p]);
} int main(){
scanf("%d",&T);
while(T--){
MEM(vis,);
scanf("%d",&n);
for(int i = ; i <= n; ++i) scanf("%d",A + i);
for(int i = ; i <= n; ++i){
int a;
scanf("%d",&a);
B[A[i]] = a;
pos[a] = A[i];
}
ans = ;
for(int i = ; i <= n; ++i) if(vis[i] == ){
cnt = ;
Dfs(i);
if(cnt == ) ans++;
else ans += cnt - ;
}
printf("%d\n",ans);
}
return ;
}

B:DP

题意:给出n个数,算出所有子序列去掉连续相同数(只保留一个)后的总和。

思路:总的思路就是总数 - 重复的计数。我们可以枚举每个数,算出其贡献,比如对于第i个数vi。先算左边的数,可取可不取,但是与vi相同的数一定不取,方案数为L,同理算出右边的方案数(算右边时可以取与vi相同的数),那么贡献就是vi×L×R。

#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define MP(a,b) make_pair(a,b)
#define PB push_back typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-;
const int INF = ( << ) - ;
const int MAXN = ;
const ll mod = 1e9 + ; int T;
int n,A[MAXN];
ll pw[MAXN],pre[MAXN],val[MAXN];
map<int,ll> S1; int main(){
pw[] = pre[] = ;
for(int i = ; i <= ; ++i){
pw[i] = pw[i - ] * 2LL % mod;
pre[i] = (pre[i - ] + pw[i]) % mod;
}
scanf("%d",&T);
while(T--){
S1.clear();
scanf("%d",&n);
for(int i = ; i <= n; ++i)
scanf("%d",A + i);
for(int i = ; i <= n; ++i){
if(i == ) val[i] = ;
else val[i] = ( + pre[i - ] - S1[A[i]]) % mod;
val[i] = (val[i] + mod) % mod;
S1[A[i]] += pw[i - ];
}
for(int i = n - ; i >= ; --i){
val[i] = (val[i] * ( + pre[n - i - ])) % mod;
}
ll ans = ;
for(int i = ; i <= n; ++i){
ans = (ans + A[i] * val[i] % mod) % mod;
}
printf("%lld\n",ans);
}
return ;
}

C:树状数组

题意:n个数删除连续的m个数,算出最小逆序数。

思路:用两个树状数组模拟一个删除框即可。

#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define MP(a,b) make_pair(a,b)
#define PB push_back typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-;
const int INF = ( << ) - ;
const int MAXN = ; int T,n,m;
int A[MAXN],fk[][MAXN]; void Update(int id,int x,int d){
while(x <= n){
fk[id][x] += d;
x += x & (-x);
}
} int Getsum(int id,int x){
int res = ;
while(x){
res += fk[id][x];
x -= x & (-x);
}
return res;
} int main(){
scanf("%d",&T);
while(T--){
MEM(fk,);
scanf("%d%d",&n,&m);
for(int i = ; i <= n; ++i) scanf("%d",A + i);
ll inv = ;
for(int i = m + ; i <= n; ++i){
inv += (i - m - ) - Getsum(,A[i]);
Update(,A[i],);
}
ll ans = inv;
// fk0 : pre , fk1 : suf
for(int i = ; i + m <= n; ++i){
inv -= (i - ) - Getsum(,A[i + m]);
inv -= Getsum(,A[i + m] - );
Update(,A[i + m],-);
inv += (i - ) - Getsum(,A[i]);
inv += Getsum(,A[i] - );
Update(,A[i],);
ans = min(ans,inv);
}
printf("%lld\n",ans);
}
return ;
}

D:DP+矩阵快速幂+生成树计数

思路:q轮选出n-1条边(构成一棵树)的方案数为cnt。对于每个生成树,构成其的方案数都是cnt。用dp[i][j]表示i轮选了j种边的方案数,转移方程:dp[i][j] = dp[i - 1][j - 1] * (n - j) + dp[i - 1][j] * j 用矩阵快速幂算出cnt。下面就是生成树计数,算出生成树种类num,那么答案就是cnt × num。

#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define MP(a,b) make_pair(a,b)
#define PB push_back typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-;
const int INF = ( << ) - ;
const int MAXN = ; int T,n,m,p,q,mod;
int D[MAXN][MAXN],G[MAXN][MAXN]; ll Det(int n){
ll A[MAXN][MAXN];
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
A[i][j] = D[i][j];
ll res = ;
for(int i = ; i <= n; ++i){
for(int j = i + ; j <= n; ++j){
while(A[j][i]){
ll t = A[i][i] / A[j][i];
for(int k = i; k <= n; ++k)
A[i][k] = (A[i][k] - A[j][k] * t) % mod;
for(int k = i; k <= n; ++k)
swap(A[i][k],A[j][k]);
res = -res;
}
}
if(!A[i][i]) return ;
res = res * A[i][i] % mod;
}
return (res + mod) % mod;
} struct Mx{
ll a[MAXN][MAXN];
void clear(){ MEM(a,); }
void stand(){ clear(); for(int i = ; i <= n; ++i) a[i][i] = ; }
Mx operator * (const Mx &b){
Mx c; c.clear();
for(int k = ; k <= n; ++k)
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j){
c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j]) % mod;
}
return c;
}
}; Mx t; Mx Q_pow(int v){
Mx res; res.stand();
while(v){
if(v & ) res = res * t;
t = t * t;
v >>= ;
}
return res;
} int main(){
scanf("%d",&T);
while(T--){
MEM(D,);
MEM(G,);
scanf("%d%d%d%d",&n,&m,&p,&q);
mod = p;
for(int i = ; i <= m; ++i){
int a,b;
scanf("%d%d",&a,&b);
D[a][a]++;
D[b][b]++;
G[a][b] = G[b][a] = ;
}
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
D[i][j] -= G[i][j];
ll val = Det(n - );
//structure Mx t
t.clear();
for(int i = ; i <= n; ++i){
t.a[i][i] = i;
t.a[i][i - ] = n - i;
}
Mx ans; ans.clear();
ans.a[][] = n - ;
ans = Q_pow(q - ) * ans;
printf("%lld\n",(val * ans.a[n - ][]) % mod);
}
return ;
}

BestCoder #58 div1的更多相关文章

  1. HDU 5496 - BestCoder Round #58 - Beauty of Sequence

      题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=637&pid=1002 思路 : 考 ...

  2. Bestcoder HDU5059 Help him 字符串处理

    Help him Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. Bestcoder#5 1002

    Bestcoder#5 1002 Poor MitsuiTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?

    NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591  单片机解密 #####[ ...

  5. BestCoder Round #80 1002

    HDU 5666 Segment 题意:给你条斜率为-1,常数项为q(q为质数)的直线,连接原点与直线上整数格点,问你在有多少个格点在形成的无数个三角形内,而不在线段上,结果对P取模. 思路:best ...

  6. android模仿58筛选下拉框(PopupWindow实现)

    前言:前几天用58同城APP找房子的时候,看到筛选下拉框蛮不错的,然后也有很多朋友需要实现这个功能,于是从网上下载了一个demo,在他的基础上进行修改,花了几个小时对他的代码进行修改,重构,封装.把一 ...

  7. Bestcoder#5 1003

    Bestcoder#5 1003 Poor RukawTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. BestCoder 2nd Anniversary

    A题 Oracle http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=703&pid=1001 大数相加: ...

  9. Bestcoder Round #84

    A题 Aaronson http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=718&pid=1001 感觉一 ...

随机推荐

  1. WinError 5

    IDE工具:pychrm 语言:python 在使用os模块修改路径名称时,总是会报 WinError 5 这个错误,就是拒绝访问,之前也遇见过,就是要操作的当前路径里有文件已经打开,代码不能再次访问 ...

  2. kotlin正式由Goole公布为Android的最新开发语言

    那么,现在大家开发Android的话一般来说都是直接用Java,这个没错吧(高手除外).嗯,那么用力那么久的Java,不知道大家是否有想过Java的不足,已经很多可以优化的地方呢.当然,新修订的版本中 ...

  3. AsyncTask--远程图片获取与本地缓存

    对于客户端——服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手机流量就用完了,等用户发现是你的应用消 ...

  4. phpcms v9表单实现问答咨询功能

    本文转自别人 phpcms v9的留言板插件可以安装留言板,做问答咨询,那样的话有很多东西需要修改,也有人发现phpcms v9有个表单向导功能,只能留言,不能回复,今天仿站网:新源网络工作室告诉大家 ...

  5. phpcms V9内容页调用标签

    1.页面标题:{$title} 2.发表时间:{$inputtime} 3.内容来源:{$copyfrom} 4.文章内容:{$content} 5.缩略图地址:{$thumb} 6.组图列表: {l ...

  6. Go基础---->go的第一个程序

    今天我们学习搭建一个学习go语言的开发环境. Go语言 一.下载go 下载地址:https://golang.org/dl/ 校验下载,在命令行输入go version 二.编写第一个hello wo ...

  7. JZOJ.5288【NOIP2017模拟8.17】球场大佬

    Description       每天下午,古猴都会去打羽毛球.但是古猴实在是太强了,他必须要到一些比较强的场去打.但是每个羽毛球场都有许多的人排着队,每次都只能上四个人,每个人都有自己的能力值,然 ...

  8. 170331、58到家MQ如何快速实现流量削峰填谷

    问:为什么会有本文? 答:上一篇文章<到底什么时候该使用MQ?>引起了广泛的讨论,有朋友回复说,MQ的还有一个典型应用场景是缓冲流量,削峰填谷,本文将简单介绍下,MQ要实现什么细节,才能缓 ...

  9. CH5302 金字塔【区间DP】

    5302 金字塔 0x50「动态规划」例题 描述 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间 ...

  10. Linux磁盘分区工具的使用

    ----------fdisk分区工具----------   一..下面来介绍fdisk分区工具的命令格式:    fdisk是传统的Linux硬盘分区工具,也是Linux系统中最常用的一种硬盘分区 ...