刚刚写了一个小时的博客没了,浏览器自动刷新。

一!个!小!时!

鼠标键盘电脑哪个都不能摔,气死我了。

垃圾选手T1T2没思路,T3倒是想出来得比较早,靠T3撑着分数。

数据结构学傻选手,属实垃圾。

T1平均数:

一个序列的所有数如果减去x,那么平均数也会减去x。可以二分这个x,统计序列里平均数小于0的序列的个数,含义为原序列平均数小于x的序列的个数。最后统计值小于k且最接近k的x就是所求答案。

序列的平均数小于0,那么序列的和也一定小于0。表现在前缀和上即为一个区间的sumr<suml-1,转化为求前缀和序列的逆序对个数。

归并排序的时候前缀和数组下标从0开始,因为可能存在序列开始的一段就小于0的情况,要和sum0比较。

#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
double ans;
int num;
double b[],c[],s[],a[],maxx;
void work(int l,int r){
if(l==r){
b[l]=s[l];
return;
}
int mid=(l+r)/;
work(l,mid);
work(mid+,r);
int ll=l,rr=mid+,p=l;
while(ll<=mid&&rr<=r){
if(b[ll]<=b[rr]){
c[p++]=b[ll++];
}
else{
num+=mid-ll+;
c[p++]=b[rr++];
}
}
while(ll<=mid){
// num+=r-mid;
c[p++]=b[ll++];
}
while(rr<=r){
c[p++]=b[rr++];
}
for(int i=l;i<=r;i++){
b[i]=c[i];
}
}
int check(double x){
num=;
for(int i=;i<=n;i++){
s[i]=s[i-]+a[i]-x;
}
work(,n);
return num;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%lf",&a[i]);
maxx=max(maxx,a[i]);
}
double l=,r=1e9;
while(l+1e-<r){
double mid=(l+r)*0.5;
if(check(mid)<k){
l=mid;
}
else r=mid;
}
printf("%.4lf",l);
return ;
}

T2涂色游戏:

考试的时候先想到矩阵快速幂,然后不会推DP式子……

因为相邻两列涂q种颜色与具体是哪种颜色无关,转化成关于列的DP问题。

先求出一列涂i种颜色的方案数。设f[i][j]为一列里到第i行涂了j种颜色的方案数,f[i][j]=f[i-1][j-1]*(p-(j-1))+f[i-1][j]*j,含义是从剩下的p-(j-1)种颜色中选一个新颜色涂,或者从已有的j种颜色中选一个重复。设g[i]=f[n][i],g[i]即一列涂i种颜色的方案数。

考虑从上一列的j种颜色转移到这一列的k种颜色。对于每一种确定的用了j种颜色的涂色方案,先枚举j和k的并集x。那么这种情况下k可以分成两部分,与j交集的部分有C(j,j+k-x)种选择,k剩下的颜色有C(p-j,x-j)种选择。然后对于每一种确定了k种颜色的选择方案,有g[k]/C(p,k)种涂色方案。

那么每一种确定的j转移给k的方案数就是,再乘上一个dp[i-1][j],即上一列j种颜色的总方案数。

初始化是dp[1][i]=g[i]。

发现对于不同列的j到k的转移,乘上的参数是一样的,那么就可以用矩阵快速幂优化。

答案矩阵的初始化是dp[1][i],转移矩阵的a[i][j]即为i转移到j的参数,然后进行矩阵快速幂m-1次(从第二列开始)。

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=;
int n,m,p,q;
long long f[][],c[][],dp[][],ans;
struct node{
long long g[][];
}a,b,d;
long long ks(long long x,long long k){
long long num=;
while(k){
if(k&)num=num*x%mod;
x=x*x%mod;
k>>=;
}
return num;
}
long long cal(int j,int k){
long long num=;
for(int x=max(q,max(j,k));x<=min(p,j+k);x++){
num=(num+(c[j][j+k-x]*c[p-j][x-j]%mod)%mod)%mod;
}
return num;
}
node cheng(node x,node y){
node e;
for(int i=;i<=p;i++){
for(int j=;j<=p;j++){
e.g[i][j]=;
}
}
for(int k=;k<=p;k++){
for(int i=;i<=p;i++){
for(int j=;j<=p;j++){
e.g[i][j]=(e.g[i][j]+x.g[i][k]*y.g[k][j]%mod)%mod;
}
}
}
return e;
}
void ksm(int k,node x){
while(k){
if(k&)b=cheng(b,x);
x=cheng(x,x);
k>>=;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&p,&q);
c[][]=;
for(int i=;i<=;i++){
c[i][]=;
for(int j=;j<=i;j++){
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
}
f[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=p;j++){
f[i][j]=(f[i-][j]*j%mod+f[i-][j-]*(p-(j-))%mod)%mod;
}
}
for(int i=;i<=p;i++){
for(int j=max(q-i,);j<=min(n,p);j++){
a.g[i][j]=(a.g[i][j]+f[n][j]*ks(c[p][j],mod-)%mod*cal(i,j)%mod)%mod;
}
}
for(int i=;i<=p;i++){
b.g[][i]=f[n][i];
}
m--;
ksm(m,a);
for(int i=;i<=p;i++){
ans=(ans+b.g[][i])%mod;
}
printf("%lld",ans);
return ;
}

T3序列:

一边写题解一边复习这些题才搞了一个多小时,第二遍写倒是挺快的。然后T3可能将是今天写题解耗时最少的题……?

看到强制在线,第一反应是答案由上一个答案转移而来。

n和q的复杂度都是1e5级别,肯定要优化其中一个到log。因为答案很可能从上一个进行变化而来,每次修改是单点的,询问的具体内容又不变,考虑怎么才能存下询问的全部信息并快速找出每次修改影响了哪些询问。

询问是区间询问的形式,考虑存下哪个询问的x覆盖了哪些范围,并快速得知每次修改的位置会影响哪些x。发现对于每次修改,覆盖了修改位置的x中,受到影响的x在一定范围内,即修改位置的原数与现在的数的中间这个范围。因为每次只修改一个位置,对于一个询问若存在影响只能是答案+1或-1,所以如果能够快速查出多少个x在这个受到影响的范围内就能得知答案进行了多少变化。于是把询问的左右端点拆开,像差分一样,l处记录x的+1,r+1处记录x的-1。然后用一棵下标是x的值的主席树,保存序列每个位置受到哪些x的覆盖。

对于每次修改,只要查出修改位置有多少个x的值在修改值和原值中间而受到影响,对答案进行相应加减即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,q,cnt1,pre=;
int a[],tree[];
long long ans;
struct node{
int pos,x,val;
}b[];
struct node1{
int l,r,x;
}c[];
bool cmp(node x,node y){
if(x.pos<y.pos)return true;
else return false;
}
int T[*],L[*],R[*],tot,cnt[*];
void build(int &p,int l,int r){
p=++tot;
if(l==r)return;
int mid=(l+r)/;
build(L[p],l,mid);
build(R[p],mid+,r);
}
void update(int &p,int pre,int l,int r,int x,int val){
p=++tot;
L[p]=L[pre],R[p]=R[pre],cnt[p]=cnt[pre]+val;
if(l==r)return;
int mid=(l+r)/;
if(x<=mid)update(L[p],L[pre],l,mid,x,val);
else update(R[p],R[pre],mid+,r,x,val);
}
void add(int x){
for(;x<=n;x+=(x&-x))tree[x]++;
}
int ask(int x){
if(!x)return ;
int val=;
for(;x;x-=(x&-x))val+=tree[x];
return val;
}
int query(int p,int l1,int r1,int l,int r){
if(l1<=l&&r<=r1)return cnt[p];
int mid=(l+r)/;
if(r1<=mid)return query(L[p],l1,r1,l,mid);
if(l1>mid)return query(R[p],l1,r1,mid+,r);
return query(L[p],l1,mid,l,mid)+query(R[p],mid+,r1,mid+,r);
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
b[++cnt1].pos=x,b[cnt1].x=z,b[cnt1].val=;
b[++cnt1].pos=y+,b[cnt1].x=z,b[cnt1].val=-;
c[i].l=x,c[i].r=y,c[i].x=z;
}
sort(b+,b+*m+,cmp);
cnt1=;
build(T[],,n);
for(int i=;i<=n+;i++){
if(b[cnt1].pos==i){
while(b[cnt1].pos==i){
update(T[i],pre,,n,b[cnt1].x,b[cnt1].val);
pre=T[i];
if(b[cnt1].val==-){//r
ans+=ask(n)-ask(b[cnt1].x-);
}
else{//l
ans-=ask(n)-ask(b[cnt1].x-);
}
cnt1++;
}
}
else if(i<=n){
T[i]=pre;
}
if(i<=n)add(a[i]);
}
printf("%lld\n",ans);
for(int i=,p,v;i<=q;i++){
scanf("%d%d",&p,&v);
long long pos=p^ans;
long long x=v^ans;
if(x>a[pos]){
int num=query(T[pos],a[pos]+,x,,n);
ans+=num;
a[pos]=x;
}
else if(x<a[pos]){
int num=query(T[pos],x+,a[pos],,n);
ans-=num;
a[pos]=x;
}
printf("%lld\n",ans);
}
return ;
}

再也不用垃圾浏览器写题解了orzzzzzzzz气死我了

一晚上就写这一篇了,虽然连带了漫长的复习时间,重新搞懂这些题并努力总结套路…

咕掉的题解还有n篇,我好难——

2019.9.26 csp-s模拟测试52 反思总结的更多相关文章

  1. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  4. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  5. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  6. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  7. 2019.10.26 csp-s模拟测试88 反思总结

    今天的主人公是什么? 60.1K!!!! 先扔代码再更新防止我等会儿一上头不打算写完题解 T1: #include<iostream> #include<cstdio> #in ...

  8. 2019.10.26 CSP%您赛第三场

    \(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...

  9. 2019.10.30 csp-s模拟测试94 反思总结

    头一次做图巨的模拟题OWO 自从上一次听图巨讲课然后骗了小礼物以后一直对图巨印象挺好的233 T1: 对于XY取对数=Y*log(x) 对于Y!取对数=log(1*2*3*...*Y)=log1+lo ...

随机推荐

  1. 用React实现一个自动生成文章目录的组件

    原文地址:小寒的博客 功能介绍 这个组件的效果呐,就是你在浏览这个页面的时候点击右上角的叉叉看到的那个文章目录. 功能很简单,就是根据文章内容自动生成这个目录,可以快速跳转. 需要的知识点 正则 do ...

  2. ios与android设备即时语音互通的录音格式预研说明

    本文虽属原创,但是内容都是来自于网络,参考了大家的微博,以及论坛的总结. 在做语音对讲的时候,将会碰到录制语音格式的问题,因为要考虑自己开发设备的支持的格式,还要考虑其他设备操作系统的支持的格式,以及 ...

  3. 版本控制git之三-多人协作 变基 推送 拉取 删除远程分支

      版本控制git之三-多人协作 wangfeng7399已关注0人评论350人阅读2019-02-20 21:33:08   如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源 ...

  4. 黑裙晖安装后修改mac和sn

    d当前使用6.2 打开putty sudo -i 然后在/tmp目录下创建一个临时目录,名字随意,如:boot mkdir -p /tmp/boot 第四步:切换到dev目录 cd /dev 第五步: ...

  5. Netty设置高低水位

    Configure high and low write watermarks   Server ServerBootstrap bootstrap = new ServerBootstrap(); ...

  6. Delphi遍历进程-Win32API

    本博客的Delphi代码使用的版本均为DelphiXE10.x 1.1 .枚举进程 通过进程名称获取指定的进程ID,代码很详细,不再赘述 unit Uuitls; interface uses TlH ...

  7. vue 组件内引入外部在线js、css

    参考:https://blog.csdn.net/u010881899/article/details/80895661 例:引入element-ui js: mounted() { const oS ...

  8. vue 报错:Cannot read property '_wrapper' of undefined

    我的情况是@click="xx" ,而xx函数未定义

  9. [转]Visual Studio 2010单元测试(3)--顺序单元测试

    之前我们做的测试都是一个一个进行的,当然我们也可以一次性选择多个测试方法进行,但是测试运行的顺序以“测试列表编辑器”窗口中的默认列表顺序为准.在实际场景中,我们需要进行有顺序的单元测试,步骤可能每一步 ...

  10. SpringData _day02_JPQL和SQL的方式查询

    1.Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件,这时就可以使用@Query注解,结合JPQL的语句方式完成查询 JPQ ...