考试总结:这次考试题,有好多部分分,导致了我在考试过程中一心想拿到这些部分分,对于正解没有留出时间进行思考,这是一个教训,在以后的考试中我一定要留出足够的思考时间,不要被部分分限制。还有,我的部分分也没有拿满,犯了一些zz的错误,有因为数组开小的,还有没有控制好优先级的(对于特殊性质的特殊解法),还有自己没有验证正确性的一些暴力优化,还遇到了一个因为我懒,没去学的知识点(痛失20分)。总体来说,这次考试我暴露出的问题有许多,在以后的考试中我会进行改正。

T1 d

思路:很显然,我们要求矩形并起来的最大值,就要去掉最多的 x,y,最小的矩形,那么我们可以将 x,预处理排序v,同时用一个优先队列维护 y ,这样我们刚开始假设去掉 m 个 x,接着我们不断将 x 放回,并去掉 y 更新答案即可。

代码如下:

AC_Code

#include<bits/stdc++.h>
#define int long long
#define re register int
#define lc rt<<1
#define rc rt<<1|1
#define mid ((l+r)>>1)
#define re register int
#define ii inline int
#define iv inline void
using namespace std;
const int N=1e5+10;
const int INF=1e9+10;
int t,n,m,ans;
struct C1
{
int a,pos;
}u1[N];
struct C2
{
int b,pos;
friend bool operator < (C2 x,C2 y)
{
return x.b>y.b;
}
}u2[N];
priority_queue<C2> q;
bool vis[N],v2[N];
ii my1(C1 a,C1 b)
{
return a.a<b.a;
}
ii read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=0;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return (f)?x:(-x);
}
signed main()
{
t=read();
long long minn_a,minn_b;
if(t==0)
return 0;
while(t--)
{
n=read();
m=read();
ans=0;
minn_a=INF;
minn_b=INF;
for(re i=1;i<=n;i++)
{
u1[i].a=read();
u2[i].b=read();
u1[i].pos=u2[i].pos=i;
}
sort(u1+1,u1+n+1,my1);
memset(vis,0,sizeof(vis));
memset(v2,0,sizeof(v2));
while(!q.empty())
q.pop();
for(re i=1;i<=m;i++)
vis[u1[i].pos]=1;
for(re i=m+1;i<=n;i++)
q.push((C2){u2[u1[i].pos].b,u1[i].pos});
ans=u1[m+1].a*q.top().b;
for(re i=m;i;i--)
{
vis[u1[i].pos]=0;
minn_a=u1[i].a;
q.push((C2){u2[u1[i].pos].b,u1[i].pos});
v2[q.top().pos]=1;
q.pop();
minn_b=q.top().b;
if(v2[u1[i].pos])
continue;
ans=max(ans,minn_a*minn_b);
}
printf("%lld\n",ans);
}
return 0;
}


T2 e

思路:很显然,我们需要一种可以维护一条链上信息的数据结构,主席树,那么我们只需要求出所有点的lca,然后分别以这两个点对应的树求出 r 对应的rank,那么我们再通过查询树中 排名为 (rank-1),(rank),(rank+1)的数值进行计算,最后取min即可,注意,在查询的时候有一些细节,当 rank,rank-1,rank+1,<=0或 >sum[lca]-sum[p]的时候我们就不能进行查询,具体实现见代码:

(因为我们要找的是小于r的最大值和大于r的最小值,所以还有另一种打法 hzoi-fengwu

AC_Code

#include<bits/stdc++.h>
#define int long long
#define re register int
#define ii inline int
#define iv inline void
#define mid ((l+r)>>1)
using namespace std;
const int N=5e5+10;
const int INF=1e9+10;
vector<int> v[N];
int n,q,type,tot,timi,r,ans,k,cnt,jk;
int a[N],to[N<<1],next[N<<1],head[N],cun_k[N],lsh[N<<4],rt[N],cun_r[N];
int deep[N],son[N],size[N],num[N],zh[N],fa[N],top[N];
struct CUN
{
int ls,rs,sum;
}use[N*80];
ii read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=0;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return (f)?x:(-x);
}
struct Segment_Tree
{
ii insert(int now,int l,int r,int zh)
{
int p=++jk;
use[p]=use[now];
if(l==r)
{
use[p].sum++;
return p;
}
if(mid>=zh)
use[p].ls=insert(use[now].ls,l,mid,zh);
else
use[p].rs=insert(use[now].rs,mid+1,r,zh);
use[p].sum=use[use[p].ls].sum+use[use[p].rs].sum;
return p;
}
ii gett(int x,int y)
{
int fx=top[x],fy=top[y];
while(fx!=fy)
{
if(deep[fx]<deep[fy])
{
swap(fx,fy);
swap(x,y);
}
x=fa[fx];
fx=top[x];
}
return (deep[x]<deep[y])?x:y;
}
ii query_rank(int last,int now,int l,int r,int zh)
{
if(l==r)
return 0;
int sum=use[use[now].ls].sum-use[use[last].ls].sum;
if(mid>=zh) return query_rank(use[last].ls,use[now].ls,l,mid,zh);
return sum+query_rank(use[last].rs,use[now].rs,mid+1,r,zh);
}
ii query(int last,int now,int l,int r,int rk)
{
if(l==r)
return l;
int sum=use[use[now].ls].sum-use[use[last].ls].sum;
if(sum>=rk) return query(use[last].ls,use[now].ls,l,mid,rk);
return query(use[last].rs,use[now].rs,mid+1,r,rk-sum);
}
}T;
iv add(int x,int y)
{
to[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
iv dfs(int st,int f)
{
num[st]=++timi;
zh[timi]=a[st];
size[st]=1;
deep[st]=deep[f]+1;
for(re i=head[st];i;i=next[i])
{
int p=to[i];
if(p==f)
continue;
fa[p]=st;
dfs(p,st);
size[st]+=size[p];
son[st]=(size[son[st]]>size[p])?son[st]:p;
}
}
iv dfs2(int st,int t)
{
top[st]=t;
if(!son[st])
return;
dfs2(son[st],t);
for(re i=head[st];i;i=next[i])
{
int p=to[i];
if(p==fa[st]||p==son[st])
continue;
dfs2(p,p);
}
}
iv dfs3(int st,int f)
{
rt[st]=T.insert(rt[f],1,cnt,a[st]);
for(re i=head[st];i;i=next[i])
{
int p=to[i];
if(p==f)
continue;
dfs3(p,st);
}
}
signed main()
{
n=read();
q=read();
type=read();
for(re i=1;i<=n;i++)
{
a[i]=read();
lsh[++cnt]=a[i];
}
for(re i=1,u2,v2;i<n;i++)
{
u2=read();
v2=read();
add(u2,v2);
add(v2,u2);
}
dfs(1,0);
dfs2(1,1);
if(q==0)
return 0;
for(re i=1;i<=q;i++)
{
cun_r[i]=read();
lsh[++cnt]=cun_r[i];
cun_k[i]=read();
for(re j=1;j<=cun_k[i];j++)
v[i].push_back(read());
}
sort(lsh+1,lsh+cnt+1);
cnt=unique(lsh+1,lsh+cnt+1)-lsh-1;
for(re i=1;i<=n;i++)
a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;
for(re i=1;i<=q;i++)
cun_r[i]=lower_bound(lsh+1,lsh+cnt+1,cun_r[i])-lsh;
dfs3(1,0);
for(re i=1;i<=q;i++)
{
int lca,rk;
v[i][0]=(v[i][0]-1+ans*type)%n+1;
lca=v[i][0];
for(re j=1;j<v[i].size();j++)
{
v[i][j]=(v[i][j]-1+ans*type)%n+1;
lca=T.gett(lca,v[i][j]);
}
lca=fa[lca];
ans=INF;
for(re j=0;j<v[i].size();j++)
{
rk=T.query_rank(rt[lca],rt[v[i][j]],1,cnt,cun_r[i]);
if(rk>=(use[rt[v[i][j]]].sum-use[rt[lca]].sum))
ans=min(ans,abs(lsh[T.query(rt[lca],rt[v[i][j]],1,cnt,rk)]-lsh[cun_r[i]]);
else
ans=min(ans,abs(lsh[T.query(rt[lca],rt[v[i][j]],1,cnt,rk+1)]-lsh[cun_r[i];
if(rk-1<=1)
ans=min(ans,abs(lsh[T.query(rt[lca],rt[v[i][j]],1,cnt,1)]-lsh[cun_r[i]]));
else
ans=min(ans,abs(lsh[T.query(rt[lca],rt[v[i][j]],1,cnt,rk-1)]-lsh[cun_r[i];
if(rk>=1&&rk<=use[rt[v[i][j]]].sum-use[rt[lca]].sum)
ans=min(ans,abs(lsh[T.query(rt[lca],rt[v[i][j]],1,cnt,rk)]-lsh[cun_r[i]]);
}
printf("%lld\n",ans);
} return 0;
}


T3 f

补坑:

树状数组求逆序对,我们对于一个序列倒序枚举,显然,根据逆序对的定义,我们查询的小于当前数的权值的前缀和即为当前点的逆序对个数,注意,我们的树状数组建立在总序列的值域的基础上

    for(re i=1;i<=n;i++)
{
a[i]=read()+1;
maxx=max(a[i],maxx);
}
for(re i=n;i;i--)
{
ans+=ask(a[i]-1);
add(a[i],1);
}
cout<<ans<<endl;

noip模拟测试22的更多相关文章

  1. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

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

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

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

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

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

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

  5. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  6. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  7. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

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

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

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

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

随机推荐

  1. 图解 Redis | 差点崩溃了,还好有主从复制

    大家好,我是小林哥,又来图解 Redis 啦. 我在前两篇已经给大家图解了 AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失). 不过,由于数据都是存储在一 ...

  2. kubeadm部署高可用版Kubernetes1.21[更新]

    环境规划 主机名 IP地址 说明 k8s-master01 ~ 03 192.168.3.81 ~ 83 master节点 * 3 k8s-master-lb 192.168.3.200 keepal ...

  3. liunx驱动之字符设备的注册

    上一篇文章学习了如何编写linux驱动,通过能否正常加载模块进行验证是否成功,有做过liunx应用开发的小伙伴都知道驱动会在'/dev'目录下以文件的形式展现出来,所以只是能加载驱动模块不能算是完成驱 ...

  4. 编译x86_64 Linux内核并基于QEMU运行

    编译并运行内核镜像 安装包准备 $ sudo apt install git $ sudo apt install build-essential kernel-package fakeroot li ...

  5. 010_Mybatis简介

    目录 Mybatis简介 什么是 MyBatis? 如何获得Mybatis 持久化 持久层 为什么需要Mybatis 第一个Mybatis程序 搭建环境 建库建表 新建父工程 新建普通maven项目 ...

  6. [心得]docker学习笔记

    1. docker是什么??? (1) docker是一台类似虚拟机的功能, 内部由一个个镜像组成, 镜像里可以运行容器, 而这个容器可以是任何东西, 比如mysql, 比如tomcat等等, 它的目 ...

  7. HMM实现中文分词

    链接:https://pan.baidu.com/s/1uBjLC61xm4tQ9raDa_M1wQ  提取码:f7l1 推荐:https://blog.csdn.net/longgb123/arti ...

  8. php自动识别背景并且把它改为白色

    此源码有个阈值可以自己调节,精确度等自测 <?php /*$Colorimg = new Colorimg(); $image=$Colorimg->IMGaction("G:/ ...

  9. ADC电阻分压采集相关知识

    1.电池串联可以增加电压,电池并联可以增加电流,都是为了增加电功率.但是电池不宜并联,即使是相同规格的电池,如果消耗不同,电势就会不同,会造成电池之间的放电现象. 2.电阻的作用: 限流:为使通过用电 ...

  10. ESP32构建系统(CMake版)

    ESP32 芯片是一款 2.4 GHz Wi-Fi 和蓝牙双模芯片,内置 1 或 2 个 32 位处理器,运算能力最高可达 600 DMIPS. ESP-IDF 即乐鑫物联网开发框架,可为在 Wind ...