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】的更多相关文章

  1. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  2. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  3. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  4. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  5. 【ContestHunter】【弱省胡策】【Round3】(C)

    容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...

  6. 【ContestHunter】【弱省胡策】【Round2】

    官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...

  7. 【ContestHunter】【弱省胡策】【Round8】

    平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...

  8. 【ContestHunter】【弱省胡策】【Round6】

    KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...

  9. 【ContestHunter】【弱省胡策】【Round5】

    反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...

随机推荐

  1. R语言编程艺术(5)R语言编程进阶

    本文对应<R语言编程艺术> 第14章:性能提升:速度和内存: 第15章:R与其他语言的接口: 第16章:R语言并行计算 ================================== ...

  2. P1102 A-B数对

    P1102 A-B数对用map过掉,可以当高效的桶排用,map<long long,int>m;意思是m[long long]==int; #include<iostream> ...

  3. UI自动化测试(六)TestNG操作详解

    在编写TestNG代码的时候,若没有下载TestNG的jar包的话,代码会出错,下载jar包方法见该链接中java+selenium环境搭建的第二步即可:http://www.cnblogs.com/ ...

  4. 基于CommonsCollections4的Gadget分析

    基于CommonsCollections4的Gadget分析 Author:Welkin 0x1 背景及概要 随着Java应用的推广和普及,Java安全问题越来越被人们重视,纵观近些年来的Java安全 ...

  5. php调用python脚本

    主要参考两篇文章 PHP中的换行详解 利用PHP调试Python Python小窥 - 写给Python的入门者 这两篇文章结合起来进行测试,主要过程如下 cd /var/www/html mkdir ...

  6. Android对Sqlite数据库的增删改查

    SqLite 数据库 Google 为我们提供了sqlite相关的api SqLiteOpenHelper 这是一个抽象的类 如果想要使用的话,需要其他的类去继承他 SqLiteDatabase 类 ...

  7. Web服务器指纹识别工具httprint

    Web服务器指纹识别工具httprint   在Web渗透测试中,准确判断服务器的类型直接影响后期渗透测试的成功率.Kali Linux提供了专门的Web服务器指纹识别工具Httprint.该工具根据 ...

  8. Nmap扫描教程之Nmap基础知识

    Nmap扫描教程之Nmap基础知识 Nmap扫描Nmap基础知识 Nmap是一个免费开放的网络扫描和嗅探工具包,也叫网络映射器(Network Mapper).Nmap工具可以用来扫描电脑上开放的端口 ...

  9. bzoj3111: [Zjoi2013]蚂蚁寻路

    题目链接 bzoj3111: [Zjoi2013]蚂蚁寻路 题解 发现走出来的图是一向上的凸起锯齿状 对于每个突出的矩形dp一下就好了 代码 /* */ #include<cstdio> ...

  10. notepad++ 如何选择10000行-20000行之间的文本?

    最近要上传导入一批数据,但是数据太多,一次上传不了,所以就要分批上传,而且数据全部在一个txt里面,这时就想一次复制一部分出来导入,直到导入完成,但是问题来了,数据太多,选择1到10000行,鼠标要拉 ...