# 【NOIP 模拟赛】平均数 涂色游戏 序列题解

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
#include<ctime>
#include<cmath>
using namespace std;
#define eps 1e-5
long double a[200000];
long double c[200000];
long double temp[200000];
long double sum[200000];
long long n,k;
long long ans=0;
void my_merge(int x,int y)
{
int mid=x+y>>1;
int l=x,r=mid+1;
int top=x-1;
while(l<=mid && r<=y)
{
if(sum[l]>sum[r])
{
temp[++top]=sum[r++];
ans+=mid+1-l;
}
else temp[++top]=sum[l++];
}
while(l<=mid) temp[++top]=sum[l++];
while(r<=y) temp[++top]=sum[r++];
for(int i=x;i<=y;i++) sum[i]=temp[i];
}
void gui_sort(int x,int y)
{
if(x>=y) return;
int mid=x+y>>1;
gui_sort(x,mid);
gui_sort(mid+1,y);
my_merge(x,y);
}
bool check(long double x)
{
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]-x;
ans=0;
gui_sort(0,n);
if(ans>=k) return true;
return false;
}
int main()
{
freopen("ave.in","r",stdin);
freopen("ave.out","w",stdout);
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
{
double x;
scanf("%lf",&x);
a[i]=x;
}
long double l=0,r=1000000000;
while(r-l>=eps)
{
long double mid=(l+r)/2.0;
if(check(mid)) r=mid;
else l=mid;
}
double ans=l;
printf("%.4lf",ans);
return 0;
}

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<iomanip>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const int mod=998244353;
long long c[150][150];
long long f[150][150];
long long dp[150][150];
long long ksm(long long x,long long k)
{
long long ans=1;
long long mid=x;
while(k)
{
if(k&1) ans=(ans*mid)%mod;
mid=(mid*mid)%mod;
k>>=1;
}
return ans;
}
struct mat{
long long a[105][105];
}ans,tmp;
int n,m,p,q;
mat operator*(mat a,mat b){
int i,j,k;mat c;
for(i=1;i<=p;i++)
for(j=1;j<=p;j++){
c.a[i][j]=0;
for(k=1;k<=p;k++) c.a[i][j]=(c.a[i][j]+(long long)a.a[i][k]*b.a[k][j])%mod;
}
return c;
}

main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&p,&q);
for(int i=0;i<=p;i++) c[i][0]=1;
for(int i=1;i<=p;i++)
for(int j=1;j<=i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++)
f[i][j]=(f[i-1][j-1]*(p-j+1)+f[i-1][j]*j)%mod;
for(int j=1;j<=p;j++)
for(int k=1;k<=p;k++){
for(int x=max(q,max(j,k));x<=p;x++)
tmp.a[j][k]=(tmp.a[j][k]+(long long)c[j][j+k-x]*c[p-j][x-j])%mod;
tmp.a[j][k]=(long long)f[n][k]*tmp.a[j][k]%mod*ksm(c[p][k],mod-2)%mod;
//  printf("%d ",tmp.a[j][k]);
}
m--;
for(int i=1;i<=p;i++) ans.a[i][i]=1;
while(m)
{
if(m&1) ans=ans*tmp;
tmp=tmp*tmp;m>>=1;
}
long long sum=0;
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
sum=(sum+(long long)f[n][i]*ans.a[i][j])%mod;
cout<<sum;
return 0;
}

orz主席树

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
struct xianduan
{
xianduan *ls,*rs;
int size;
void* operator new(size_t,xianduan *_,xianduan *__,int ___)
{
static xianduan *mempool,*c;
if(c==mempool)
mempool=(c=new xianduan[1<<15])+(1<<15);
c->ls=_;
c->rs=__;
c->size=___;
return c++;
}
friend xianduan* build_tree(xianduan *o,int x,int y,int pos,int c_size)
{
int mid=x+y>>1;
if(x==y) return new(0x0,0x0,o->size+c_size)xianduan;
if(pos<=mid) return new(build_tree(o->ls,x,mid,pos,c_size),o->rs,o->size+c_size)xianduan;
else return new(o->ls,build_tree(o->rs,mid+1,y,pos,c_size),o->size+c_size)xianduan;
}
friend int query(xianduan *o,int x,int y,int k)
{
if(y<=k) return o->size;
int mid=x+y>>1;
if(k<=mid) return query(o->ls,x,mid,k);
else return o->ls->size+query(o->rs,mid+1,y,k);
}
}*root[200000];
struct change
{
int tim,lei,x;
bool operator <(change b) const
{
return tim<b.tim;
}
}changes[250000];
int top=0;
int a[250000];
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
changes[++top].tim=l;
changes[top].lei=1;
changes[top].x=x;
changes[++top].tim=r+1;
changes[top].lei=-1;
changes[top].x=x;
}
sort(changes+1,changes+1+top);
root[0]=new (0x0,0x0,0)xianduan;
root[0]->ls=root[0]->rs=root[0];
int wz=1;
for(int i=1;i<=100000;i++)
{
root[i]=root[i-1];
while(changes[wz].tim==i && wz<=top)
{
root[i]=build_tree(root[i],1,100000,changes[wz].x,changes[wz].lei);
wz++;
}
}
long long ans=0;
for(int i=1;i<=n;i++)
{
ans+=query(root[i],1,100000,a[i]);
}
printf("%d\n",ans);
for(int i=1;i<=q;i++)
{
int p,v;
scanf("%d%d",&p,&v);
p^=ans;
v^=ans;
ans-=query(root[p],1,100000,a[p]);
a[p]=v;
ans+=query(root[p],1,100000,a[p]);
printf("%d\n",ans);
}
return 0;
}

#### [NOIP模拟赛]多边形

2017-08-20 13:55:15

#### [NOIP模拟赛]越唱越勇

2017-08-27 14:33:26

#### [NOIP模拟赛]天文观测

2017-08-26 14:29:07

#### 幻想乡模拟赛题解

2012年11月04日 10.33MB 下载

#### NOIP2017模拟赛（八）总结

2017-06-21 16:31:36

#### [noip模拟赛]中位数（乱搞）

2016-08-25 15:56:36

#### Hzwer[NOIP]模拟赛小奇挖矿

2016年09月29日 74KB 下载

#### 【NOIP模拟】序列

2016-09-19 20:38:44

#### 【bzoj 十连测】[noip2016十连测第九场]Problem B: 小P的单调区间（最长上升子序列+树状数组）

2016-11-17 09:16:18

#### 2015重庆市NOIP模拟赛题目+数据

2015年10月04日 8.2MB 下载