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

一!个!小!时!

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

垃圾选手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. hdu 5382

    \(F(n)=\sum_{i=1}^n\sum_{j=1}^n[lcm(i,j)+gcd(i,j)\geq n]\) \(S(n)=\sum_{i=1}^nF(i)\) \(F(n)=n^2-\sum ...

  2. Python-网络编程之粘包、UDP

    目录 粘包问题 subprocess模块 struct模块 UDP协议编程 简易qq聊天室 粘包问题 什么是粘包问题呢? 在我们写 tcp socket编程的时候,tcp协议是一个流式的协议,服务端第 ...

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

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

  4. react antd样式按需加载配置以及与css modules模块化的冲突问题

    通过create-react-app脚手架生成一个项目 然后运行npm run eject 把webpack的一些配置从react-scripts模块弹射出来, 方便自己手工增减,暴露出来的配置文件在 ...

  5. PAT甲级——A1075 PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  6. JDK1.8 之Lambda表达式

    概述 Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 你可以将其想做一种速记,在你需要 ...

  7. logcat日志文件

    android日志系统提供了记录和查看系统调试信息的功能,日志都是从各个软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来进行查看和使用 开发者选项,有个选项叫做“日志记录器缓冲区大 ...

  8. jmeter参数化之用户参数

    1.     用badboby进行录制,录制完成后保存,用JMeter格式进行保存,如:登陆.jmx 2.     在jmeter中打开保存的文件登陆.jmx. 3.在step1上右击-添加-前置处理 ...

  9. Windows API 第20篇 SetVolumeMountPoint 设置卷挂载点参数错误

    函数原型:BOOL SetVolumeMountPoint(                                                   IN   LPCTSTR lpszVo ...

  10. [Swoole系列入门教程 1] CentOs 上的Swoole安装

    如果已经用宝塔安装好了PHP, 开启相应的扩展 一.编译安装git clone https://github.com/swoole/swoole-src.git cd swoole-src/ phpi ...