考试总结:这次考试题,有好多部分分,导致了我在考试过程中一心想拿到这些部分分,对于正解没有留出时间进行思考,这是一个教训,在以后的考试中我一定要留出足够的思考时间,不要被部分分限制。还有,我的部分分也没有拿满,犯了一些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 客户端实现读写分离实现

    背景 (1) redis单机的读写性能轻松上大几万,不过线上环境不会只部署光秃秃的一个节点,还是会配合 sentinel 再部署一个 slave作为高可用节点的: 但是standby的slave节点是 ...

  2. Linux中的chkconfig

    chkconfig是用来查看开机自启动项目的命令.默认列出linux系统开机自启的项目.平时我们使用时习惯加上--list 从这个图中可以看到当前系统有哪些开机启动项目,就是红色框中的on. 那么怎么 ...

  3. zbxtable的使用

    实验环境: zabbix server 172.16.1.121 mysql 172.16.1.121 访问端 172.16.1.122 54.1 zbxtable 1 说明 ZbxTable使用Go ...

  4. 2、配置tomcat-service服务

    1.将Tomcat设置成服务 (假设我们缺省的Tomcat目录为d:\Tomcat_oa) : 2.同时按住"win+r"键调出"运行",在方框内输入" ...

  5. 使用curl断点续传下载文件

    办公网络网速不是很好,使用Chrome下载一些软件时不时会中断,恶心的是Chrome居然不支持断点续传下载(为什么chrome的下载不支持断点续传呢?),迅雷自然是不能装的,那怎么办?还好我有大名鼎鼎 ...

  6. 导入项目发现没得右边没得maven

    使用ctrl + shift+A点Add Maven Project 就行了 参考:https://www.cnblogs.com/Juff-code/p/13390356.html

  7. CentOS-Docker搭建Nextcloud

    下载镜像 $ docker pull nextcloud 运行镜像 $ docker run -d --restart=unless-stopped --name nextcloud -v /home ...

  8. 大话Java代理模式

    一.什么是代理 首先理解一下什么是代理.简单来说,代理就你要做一件事情,我替你把事情做了.这是现实生活中我们遇到的代理的需求场景.但写代码的时候对代理场景的需求,跟现实场景有点区别,本质上还是帮你做事 ...

  9. Java:Java的<<<移位运算符详解

    1) 左移运算(<<)       左移就是把所有位向左移动几位 如:   12 << 2    意思就是12向左移动两位 12的二进制是: 0000 1100 通过这个图我们 ...

  10. .NET Core/.NET5/.NET6 开源项目汇总11:WPF组件库1

    系列目录     [已更新最新开发文章,点击查看详细] WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Frame ...