csps模拟68d,e,f题解
题面: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题解的更多相关文章
- [CSP-S模拟测试50]反思+题解
??大部分人都觉得T3是道不可做题去刚T1T2了,于是我就侥幸苟到了前面? 这场考试比较成功的就是快速水掉了T1T2的部分分,1h拿到88分起码为之后硬肝T3上了保险(赛后发现就算T3爆零也能rank ...
- [CSP-S模拟测试48]反思+题解
状态很垃圾的一场考试.感觉“这么多分就够了”的心态很是在给自己拖后腿. 打开题面,第一页赫然写着:$Claris' Contest$. 吓得我差点手一抖关掉.不过后来想想似乎强到变态的人出的题都不是很 ...
- [CSP-S模拟测试47]反思+题解
打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...
- csps模拟测试707172部分题解myc
题面:https://www.cnblogs.com/Juve/articles/11678524.html 骆驼:构造题,留坑 根据5×5的矩形构造成大矩形 毛一琛: mid in the midd ...
- csps模拟测试7576一句话题解
题面:https://www.cnblogs.com/Juve/articles/11694454.html 75考了数学,化学和物理... T1: 假设有一个A和B,那么对于每一个j!=i,都有$\ ...
- csp-s模拟64trade,sum,building题解
题面:https://www.cnblogs.com/Juve/articles/11639755.html trade: 70分sbdp,然后一直想优化,dp还是很好写的 正解是反悔贪心 维护一个小 ...
- csp-s模拟测试44「D·E·F」
用心出题,用脚造数据 乱搞场 1 #include<bits/stdc++.h> 2 #define re register 3 #define int long long 4 #defi ...
- csp-s模拟测试87
csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...
- 反省——关于csp-s模拟50
本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...
随机推荐
- Shiro术语
请花2分钟阅读和理解Shiro中的术语 - 这是非常重要的.这里的术语和概念在文档中的任何地方都被引用,并且将大大简化您对Shiro和一般的安全性的理解. 因为使用了一些您可能不太明白的术语,所以安全 ...
- eclipse导入别人项目配置tomcat和jdk
1.file--import--General--Existing Projiect into Workspace-- 2.导入项目成功后,项目会有错误,需重新进行tomcat及jdk的配置 项目名右 ...
- Spring REST(4)
REST风格 /user/1 get请求 获取用户 /user/1 post请求 新增用户 /user/1 put请求 更新用户 /user/1 delete请求 删除用户 在Sp ...
- 知识图谱+Recorder︱中文知识图谱API与工具、科研机构与算法框架
目录 分为两个部分,笔者看到的知识图谱在商业领域的应用,外加看到的一些算法框架与研究机构. 文章目录 @ 一.知识图谱商业应用 01 唯品金融大数据 02 PlantData知识图谱数据智能平台 03 ...
- IK分词器 原理分析 源码解析
IK分词器在是一款 基于词典和规则 的中文分词器.本文讲解的IK分词器是独立于elasticsearch.Lucene.solr,可以直接用在java代码中的部分.关于如何开发es分词插件,后续会有文 ...
- python 取出aws中ip有,zabbix中没有的ip
#!/usr/bin/env python3# coding=utf-8import requestsimport jsonimport boto3 headers = {'Content-Type' ...
- 数据库MySQL--连接查询
例子文件1:https://files.cnblogs.com/files/Vera-y/myemployees.zip 例子文件2:https://files-cdn.cnblogs.com/fil ...
- Java 几种队列区别的简单说明
前言 队列,字面意思就可以明白. 是一种线性的数据暂存与管理工具. 也可以让各种业务功能进行逐个的队列运行. 此篇博客只说明一下Java有几种队列 未阻塞和阻塞队列的区别 未阻塞: 1.未阻塞的队列在 ...
- yii2 vendor/bower/jquery/dist not exist
查看 vendor 文件夹,只有bower-asset文件夹 手动修改 bower-asset 为bower 倒也可以,yii2项目每次 composer install 成功之后,每次重命名这个文件 ...
- a^a^a^a^a^a^a^a^a
a^a^a^a是从前向后算,也就是a^(a^3)