【ContestHunter】【弱省胡策】【Round7】
Prufer序列+高精度+组合数学/DP+可持久化线段树
Magic
利用Prufer序列,我们考虑序列中每个点是第几个插进去的,再考虑环的连接方式,我们有$$ans=\sum_{K=3}^n N^{N-K-1}*K*\frac{(K-1)!}{2} * \binom{N}{K}$$
然而直接高精算会爆……
注意到每一项与前一项相差不大,有$now=last*N/(N-K+1)$,所以我们算出来第一项以后不用每次重算后面的了……
//Round7 A
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
const int N=;
/*******************template********************/ int n;
struct bint{
LL v[];
int l;
LL& operator [] (int x){return v[x];}
bint(){l=; memset(v,,sizeof v);}
}ans;
const LL Limit=100000000000000LL;
void print(bint& a){
printf("%lld",a[a.l]);
D(i,a.l-,) printf("%014lld",a[i]);
puts("");
}
void mul(bint& a,const int &b){
LL tmp=;
F(i,,a.l){
a[i]=a[i]*b+tmp;
tmp=a[i]/Limit;
a[i]%=Limit;
}
if (tmp) a[++a.l]=tmp;
}
void del(bint& a,const int &b){
LL tmp=,last=;
D(i,a.l,){
tmp=(a[i]+last*Limit)%b;
a[i]=(a[i]+last*Limit)/b;
last=tmp;
}
while(a[a.l]== && a.l) a.l--;
}
bint operator + (bint a,bint b){
int l=max(a.l,b.l);
F(i,,l){
a[i]+=b[i];
if (a[i]>=Limit) a[i]-=Limit,a[i+]++;
}
if (a[l+]>) a.l=l+; else a.l=l;
return a;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
scanf("%d",&n);
bint p,ans;
p[p.l=]=;
F(i,,n-) mul(p,n);
mul(p,n-);
del(p,);
F(k,,n){
mul(p,n-k+);
del(p,n);
ans=ans+p;
// ans+=Pow(n,n-k-1)*k*fac[k-1]/2*C(n,k);
}
print(ans);
return ;
}
Rectangle
QwQ真是一道好题!
先考虑所有的a[i]=1的情况,这时候我们的做法是线段树维护最大连续区间。
然后我们推广一下,用可持久化线段树,对每一个高度都维护一个最大连续区间。
同时再用一个priority_queue来维护一下当前的答案!(官方题解这里说是set……然而我用set给MLE了!什么鬼!!)
//Round7 B
#include<cstdio>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline LL getint(){
LL r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,M=;
/*******************template********************/ int n,m,Max,a[N],b[N],rt[M],cnt; struct node{
int l,r,maxl,maxr,max;
}t[];
#define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
#define lch L,l,mid
#define rch R,mid+1,r
void build(int &o,int l,int r){
o=++cnt;
t[o].maxl=t[o].maxr=t[o].max=r-l+;
if (l==r) return;
build(lch);
build(rch);
}
inline void maintain(int o,int l,int r){
t[o].maxl=t[L].maxl; t[o].maxr=t[R].maxr;
if (t[L].maxl==mid-l+) t[o].maxl+=t[R].maxl;
if (t[R].maxr==r-mid) t[o].maxr+=t[L].maxr;
t[o].max=max(t[L].maxr+t[R].maxl,max(t[L].max,t[R].max));
}
void update(int &o,int l,int r,int pos){
t[++cnt]=t[o], o=cnt;
if (l==r){t[o].maxl=t[o].maxr=t[o].max=;return;}
if (pos<=mid) update(lch,pos);
else update(rch,pos);
maintain(o,l,r);
}
bool cmp(int x,int y){return a[x]<a[y];}
struct data{
LL v;
int id;
data(LL x=,int id=):v(x),id(id){}
bool operator < (const data &b)const{
return v<b.v || (v==b.v && id>b.id);
}
};
priority_queue<data>Q;
int main(){
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
n=getint(); m=getint();
Max=;
F(i,,n){
a[i]=getint();
Max=max(Max,a[i]);
b[i]=i;
}
sort(b+,b+n+,cmp);
build(rt[],,n); LL ans=;
for(int i=,j=;i<=Max;i++){
rt[i]=rt[i-];
for(;a[b[j]]==i- && j<=n;j++)
update(rt[i],,n,b[j]);
Q.push(data((LL)t[rt[i]].max*i,i));
// printf("height=%d val=%lld\n",i,(LL)t[rt[i]].max*i);
} data x=Q.top();
printf("%lld\n",ans=x.v);
LL pos;
while(m--){
pos=getint()^ans;
update(rt[a[pos]],,n,pos);
Q.push(data((LL)t[rt[a[pos]]].max*a[pos],a[pos]));
a[pos]--;
for(x=Q.top(); (LL)x.id*t[rt[x.id]].max!=x.v;Q.pop(),x=Q.top());
ans=Q.top().v;
printf("%lld\n",ans);
}
return ;
}
【ContestHunter】【弱省胡策】【Round7】的更多相关文章
- 弱省胡策 Magic
弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...
- 【弱省胡策】Round #5 Count
[弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...
- luoguP3769 [CH弱省胡策R2]TATT
luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...
- 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)
DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...
- 【ContestHunter】【弱省胡策】【Round3】(C)
容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...
- 【ContestHunter】【弱省胡策】【Round2】
官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...
- 【ContestHunter】【弱省胡策】【Round8】
平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...
- 【ContestHunter】【弱省胡策】【Round6】
KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...
- 【ContestHunter】【弱省胡策】【Round5】
反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...
随机推荐
- ref:Spring JDBC框架
ref:https://blog.csdn.net/u011054333/article/details/54772491 Spring JDBC简介 先来看看一个JDBC的例子.我们可以看到为了执行 ...
- InnoDB的锁机制浅析(三)—幻读
文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁) Inno ...
- Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹
Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹 Nmap工具的准备工作 当用户对Nessus工具有清晰的认识后,即可使用该工具实施扫描.但是,在扫描之前需要做一些准备工作,如探测网络中活动的主 ...
- BZOJ.1011.[HNOI2008]遥远的行星(思路 枚举)
题目链接 设当前为\(i\),令\(j=\lfloor a*i\rfloor\),\(1\sim j\) 即为对\(i\)有贡献的行星,这一区间的答案应为\[f[i]=M_i*\sum_{k=1}^j ...
- hdu 4605 树状数组 ****
题目大意很简单. 有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点.然后每个结点都有一个重量值,根结点是1 然后有一个球,从结点1开始往子孙结点走. 每碰到一个结点,有三种情况 如果 ...
- HDU 5907 Find Q dp
Find Q 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5907 Description Byteasar is addicted to the ...
- IBM MR10i阵列卡配置Raid0/Raid1/Raid5(转)
RAID5配置: 其实RAID0/RAID1都基本一致,只是选择的类型不同. 1. 开机看到ctrl+h的提示按下相应的键,等ServerRaid 10-i卡初始化完成则进入WebBIOS 配置界面: ...
- stm32的swd接口的烧写协议是否公开的呢?
stm32的swd接口的烧写协议是否公开的呢? 需要用一台好的示波器来抓才能有足够的存储深度,保证你能够过滤掉那个该死的50clock. 按照Arm的手册,每次转换发送方都需要一个TNR---但是我观 ...
- Go 面试题(附答案解析)
1.写出下面代码输出内容 package main import ( "fmt" ) func main() { defer_call() } func defer_call() ...
- oracle linux dtrace
http://docs.oracle.com/cd/E37670_01/E38608/html/pref.html