题面:https://www.cnblogs.com/Juve/articles/11655531.html

三道数据结构?

d:

贪心,先按a排序,然后枚举删了前i个a值比较小的,然后在剩下的里面删m-i个b小的,然后统计答案

用主席树查b排名(m-i+1)或用堆维护b

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
const int MAXN=1e5+;
int read(){
int x=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'',ch=getchar();}
return x;
}
int t,n,m,ans;
struct node{
int a,b;
friend bool operator < (node p,node q){
return p.a<q.a;
}
}sq[MAXN];
priority_queue<int>q;
signed main(){
t=read();
while(t--){
n=read(),m=read();
ans=;
for(int i=;i<=n;++i) sq[i].a=read(),sq[i].b=read();
sort(sq+,sq+n+);
while(!q.empty()) q.pop();
for(int i=m+;i<=n;++i) q.push(-sq[i].b);
for(int i=m;i>=;--i){
int mx=-q.top();
ans=max(ans,mx*sq[i+].a);
if(sq[i].b>mx){
q.pop();
q.push(-sq[i].b);
}
}
printf("%lld\n",ans);
}
return ;
}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+;
int read(){
int x=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'',ch=getchar();}
return x;
}
int t,n,m,ans,mx=;
struct node{
int a,b;
friend bool operator < (node p,node q){
return p.a<q.a;
}
}sq[MAXN];
int root[MAXN],tot=;
struct chairman_tree{
int ls,rs,val;
}tr[MAXN<<];
void insert(int &now,int pre,int l,int r,int pos){
now=++tot;tr[now]=tr[pre];++tr[now].val;
if(l==r) return ;
int mid=(l+r)>>;
if(pos<=mid) insert(tr[now].ls,tr[pre].ls,l,mid,pos);
else insert(tr[now].rs,tr[pre].rs,mid+,r,pos);
}
int query(int x,int y,int l,int r,int num){
if(l==r) return l;
int sum=tr[tr[y].ls].val-tr[tr[x].ls].val,mid=(l+r)>>;
if(sum>=num) return query(tr[x].ls,tr[y].ls,l,mid,num);
else return query(tr[x].rs,tr[y].rs,mid+,r,num-sum);
}
signed main(){
t=read();
while(t--){
n=read(),m=read();
ans=tot=mx=;
for(int i=;i<=n;++i) sq[i].a=read(),sq[i].b=read(),mx=max(mx,sq[i].b);
sort(sq+,sq+n+);
for(int i=;i<=n;++i)
insert(root[i],root[i-],,mx,sq[i].b);
for(int i=;i<=m;++i)
ans=max(ans,sq[i+].a*query(root[i],root[n],,mx,m-i+));
printf("%lld\n",ans);
}
return ;
}

主席树

e:

开始学习主席树上树

不难看出是在每个询问点到所有询问点的lca路径上的前趋后继,然后就打的测试点分治和暴力

新知识:树上主席树,维护每个节点到根的前缀主席树,然后区间查询前趋后继

查前趋:

当前mid比val大,去右区间查找,但是会有一种情况:val等于mid+1,但主席树中没有mid+1,这时特判一下去找左区间

后继同理

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0',ch=getchar();}
return x;
}
const int MAXN=1e5+5;
int n,q,typ,a[MAXN],ans=0,p[MAXN],b[MAXN],mx;
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
int root[MAXN],tot=0;
struct node{
int ls,rs,val;
}tr[MAXN<<6];
void insert(int &now,int pre,int l,int r,int val){
now=++tot;tr[now]=tr[pre],++tr[now].val;
if(l==r) return ;
int mid=(l+r)>>1;
if(val<=mid) insert(tr[now].ls,tr[pre].ls,l,mid,val);
else insert(tr[now].rs,tr[pre].rs,mid+1,r,val);
}
int get_pre(int x,int y,int l,int r,int val){
if(tr[y].val-tr[x].val==0) return 0;
if(l==r) return l;
int mid=(l+r)>>1,res=0;
if(val>mid){
res=get_pre(tr[x].rs,tr[y].rs,mid+1,r,val);
if(res==0) res=get_pre(tr[x].ls,tr[y].ls,l,mid,val);
}else res=get_pre(tr[x].ls,tr[y].ls,l,mid,val);
return res;
}
int get_nxt(int x,int y,int l,int r,int val){
if(tr[y].val-tr[x].val==0) return 0;
if(l==r) return l;
int mid=(l+r)>>1,res=0;
if(val<=mid){
res=get_nxt(tr[x].ls,tr[y].ls,l,mid,val);
if(res==0) res=get_nxt(tr[x].rs,tr[y].rs,mid+1,r,val);
}else res=get_nxt(tr[x].rs,tr[y].rs,mid+1,r,val);
return res;
}
int deep[MAXN],fa[MAXN],siz[MAXN],son[MAXN];
void dfs(int x){
siz[x]=1;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x]) continue;
fa[y]=x;
deep[y]=deep[x]+1;
dfs(y);
siz[x]+=siz[y];
if(siz[son[x]]<siz[y]) son[x]=y;
}
}
int top[MAXN];
void DFS(int x,int topf){
insert(root[x],root[fa[x]],1,mx,a[x]);
top[x]=topf;
if(son[x]) DFS(son[x],topf);
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x]||y==son[x]) continue;
DFS(y,y);
}
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
return x;
}
signed main(){
n=read(),q=read(),typ=read();
for(int i=1;i<=n;++i) a[i]=read(),mx=max(mx,a[i]);
for(int i=1,u,v;i<n;++i){
u=read(),v=read();
add(u,v),add(v,u);
}
dfs(1);DFS(1,1);
while(q--){
int r=read(),k=read();
int lca;
for(int i=1;i<=k;++i){
p[i]=read();
p[i]=(p[i]-1+ans*typ)%n+1;
if(i==1) lca=p[i];
else lca=LCA(lca,p[i]);
}
ans=0x3f3f3f3f;
for(int i=1;i<=k;++i){
int pre=get_pre(root[fa[lca]],root[p[i]],1,mx,r);
int nxt=get_nxt(root[fa[lca]],root[p[i]],1,mx,r);
if(pre) ans=min(ans,abs(r-pre));
if(nxt) ans=min(ans,abs(nxt-r));
}
printf("%lld\n",ans);
}
return 0;
}

f:

不会了,打的暴力树状数组逆序对

csps模拟68d,e,f题解的更多相关文章

  1. [CSP-S模拟测试50]反思+题解

    ??大部分人都觉得T3是道不可做题去刚T1T2了,于是我就侥幸苟到了前面? 这场考试比较成功的就是快速水掉了T1T2的部分分,1h拿到88分起码为之后硬肝T3上了保险(赛后发现就算T3爆零也能rank ...

  2. [CSP-S模拟测试48]反思+题解

    状态很垃圾的一场考试.感觉“这么多分就够了”的心态很是在给自己拖后腿. 打开题面,第一页赫然写着:$Claris' Contest$. 吓得我差点手一抖关掉.不过后来想想似乎强到变态的人出的题都不是很 ...

  3. [CSP-S模拟测试47]反思+题解

    打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...

  4. csps模拟测试707172部分题解myc

    题面:https://www.cnblogs.com/Juve/articles/11678524.html 骆驼:构造题,留坑 根据5×5的矩形构造成大矩形 毛一琛: mid in the midd ...

  5. csps模拟测试7576一句话题解

    题面:https://www.cnblogs.com/Juve/articles/11694454.html 75考了数学,化学和物理... T1: 假设有一个A和B,那么对于每一个j!=i,都有$\ ...

  6. csp-s模拟64trade,sum,building题解

    题面:https://www.cnblogs.com/Juve/articles/11639755.html trade: 70分sbdp,然后一直想优化,dp还是很好写的 正解是反悔贪心 维护一个小 ...

  7. csp-s模拟测试44「D·E·F」

    用心出题,用脚造数据 乱搞场 1 #include<bits/stdc++.h> 2 #define re register 3 #define int long long 4 #defi ...

  8. csp-s模拟测试87

    csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...

  9. 反省——关于csp-s模拟50

    本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...

随机推荐

  1. 从0的1学习JavaSE,Jdk的安装

    一.常用的dos命令 dir 罗列出当前目录的下所有文件名字 cd 路径 切换路径,该路径可以是相对于路径也可以是绝对路径 相对路径,只相对于当前的目录下的文件 绝对路径,是从盘符开始的路径地址 注意 ...

  2. 一个很SB的方法,来开始调一个刚启动就SB的程序

    自己鼓捣的方法,累死我了... 遇到一个程序,这程序启动之后,会自动重新启动我的电脑, 我想调试它一下,但是遇到了问题, 如果我用调试器附加上去的话,电脑是不重起了,但是它启动了之后会立刻黑屏,全黑, ...

  3. Docker的概念及基本用法

    Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种在安全.可 ...

  4. 十个非常实用的MySQL命令

      建赟  版主 楼主   前言 今天介绍一些MySQL常用的实用命令,都是一些比较简单的命令.已经知道的朋友,就当是巩固吧,不知道的童鞋,可以好好在自己的机器上,练习下. 0. 显示数据库 命令:s ...

  5. Navicat Premium_11.2.7 安装及破解,连接Oracle数据库

    下载Navicat Premium_11.2.7简体中文版, 安装 Navicat 11 for Windows 系列原版程序.Navicat | 下载 Navicat 14 天 Windows.Ma ...

  6. The linux command 之存储媒介

    一.常用的命令 mount:挂载文件系统 unmount:卸载文件系统 fdisk:硬盘分区命令 fdformat:格式化软盘 fsck:检查和修复文件系统 mkfs:创建文件系统 dd:转换和拷贝一 ...

  7. 配置虚拟机上的RedHat6 Linux系统的网络(选择的是仅主机模式)

    1.启动虚机,网络选择:仅主机模式 2.进入自己的本地网络配置中,修改相关配置 1)修改VMware NetWork Adapter VMnet1 ip为192.168.137.1,子网掩码:255. ...

  8. phonegap 开发指南系列(3) ----在Eclipse中Android开发环境搭建

      前提条件:已在Eclipse中安装好Android SDK 和 ADT. 1.下载PhoneGap,解压. 2.用Eclipse新建一个安卓项目. 3.将phoneGap解压包里的Android文 ...

  9. Windows Server 2003服务器清理C盘空间的资料多个解决方法

    一.关闭IIS HTTPRERR日志功能 默认情况下,2003服务器会把所有IIS访问错误的记录写入 C:WINDOWSsystem32LogFilesHTTPERR 下的 log 文件中,如果访问量 ...

  10. thinkphp 运算符

    我们可以对模板输出使用运算符,包括对“+”“ –” “*” “/”和“%”的支持. 大理石平台厂家 例如: 运算符 使用示例 + {$a+$b} - {$a-$b} * {$a*$b} / {$a/$ ...