题面: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. 一幅图解决R语言绘制图例的各种问题

    一幅图解决R语言绘制图例的各种问题 用R语言画图的小伙伴们有木有这样的感受,"命令写的很完整,运行没有报错,可图例藏哪去了?""图画的很美,怎么总是图例不协调?" ...

  2. LogInfoHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  3. (转)AttributeError: module 'tkinter' has no attribute 'messagebox'

    AttributeError: module 'tkinter' has no attribute 'messagebox' improt tkinter from tkinter import * ...

  4. python备份数据库并发送邮件附件

    记录下自己学习python的过程 这个是进行备份后,并发送邮件附件进行保存的功能. 相对来说比较简陋,可以自行修改,简略步骤,美化过程等. 示例代码: #!/usr/bin/env python # ...

  5. 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll已解决

    问题 : 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll 解决 1, 首先把C:\Windows\SysWOW64\的api-ms-win-crt- ...

  6. jpa简单规则(转https://www.cnblogs.com/rulian/p/6434631.html)

    一.常用规则速查 1  And 并且2  Or  或3  Is,Equals 等于4  Between  两者之间5  LessThan 小于6  LessThanEqual   小于等于7  Gre ...

  7. 根据单个或多个字段对list对象去重

    pojo  省略 在list 对象中,根据某一字段进行去重,重写Comparator /** * 去重 * * @param orderList * @return * @author ziggo * ...

  8. pathlib生成文件的软链接

    在训练深度网络时,保存模型,想要维护一个latest.t7的文件,想到给最好的模型创建一个软链接到latest.t7 这样模型不占地,还能便于后续脚本加载最好模型 起初是看到mmdetection中是 ...

  9. 在CentOS 7上安装常用的YUM源

    参考地址:https://blog.csdn.net/u010048823/article/details/51298183 以epel源为例子,来讲解如何添加额外的YUM源. Extra Packa ...

  10. docker集群管理之kubernetes

    一.简介 kubernetes又叫做k8s,是Google开发的一款开源的docker集群管理工具,在这里对它的“发家史”,我不做过多的阐述,有时间大家可以自己去百度一下: 下面我要讲的就是容易混淆的 ...