题面: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. Apache Shiro RememberMe 1.2.4 反序列化漏洞

    拉取镜像 docker pull medicean/vulapps:s_shiro_1 启动环境 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 ...

  2. Array类型中的检测数组,转换方法,栈方法,队列方法

    我的新博客==> http://www.suanliutudousi.com/2017/08/24/array%E7%B1%BB%E5%9E%8B%E4%B8%AD%E7%9A%84%E6%A3 ...

  3. json、pickle和base64

    json.dumps() 用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数. json.dump() 用于将dict类 ...

  4. 使用neo4j图数据库的import工具导入数据 -方法和注意事项

    背景 最近我在尝试存储知识图谱的过程中,接触到了Neo4j图数据库,这里我摘取了一段Neo4j的简介: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌 ...

  5. echarts数据变了不重新渲染,以及重新渲染了前后数据会重叠渲染的问题

    1.echarts数据变了但是视图不重新渲染 新建Chart.vue文件 <template>  <p :id="id" :style="style&q ...

  6. spring在普通类中获取session和request

    在使用spring时,经常需要在普通类中获取session,request等对像.比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts2 ...

  7. 回车切换input选框

    在工作中许多时候需要考虑到用户体验,当按下回车键时切换input选框就来得十分必要. <!DOCTYPE HTML> <html> <head> <meta ...

  8. dex2jar+jd-gui反编译apk的使用方法

    1.将要反编译的APK后缀名改为.rar或 .zip,并解压 2.得到其中的classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出 ...

  9. jquery实现文字由下到上循环滚动的实例代码

    <div id="oDiv"> <ul id="oUl"> <li>第1个li元素</li> <li> ...

  10. 为什么串行传输时总是LSB在前?

    https://superuser.com/questions/1104212/why-do-serial-ports-send-data-least-significant-bit-first 其实 ...