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

permutation:

参考:https://www.cnblogs.com/clno1/p/10832579.html

因为原来的数组不好做于是我们想反过来数组,根据交换条件:值相邻且位置差大于等于k,那么在变换后的数组就变成了位置相邻且差值大于等于k。这样的话变换操作变成了,相邻的大于等于k的值临近交换,于是我们注意到因为现在只能临近交换的原因,两个差值小于k的数他们的相对位置不可能发生改变。那么问题就变成了,在只有一些相对位置限制条件下,无限制的可以随意交换位置,求这个数组的最小字典序(原数组字典序最小也是现在数组字典序最小)。那么我们容易想到拓扑排序。

但是如果每个点都想后面差值小于k的点连边的话,这个图会变得十分巨大,时间无法承受。于是我们必循得考虑优化建图:我们注意到像a->b,b->c,a->c这种建图,a->c这条边是不必要的。于是我们想办法避免掉这种无意义的边,所以对于某个点,我们让它向后面的所有限制(即差值小于k)中只向最小的那一个点连边,那么用线段树维护这样的信息,这样就达到优化建图的目的。

这样只向最小的连边为什么是对的呢?借用上面大佬的一句话:倒着加入,显然 p_i 连向 (p_i-k, p_i)∪(p_i, p_i+k)。我们只需要分别连向两个区间中下标最小的那一个即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=5e5+;
int n,k,a[MAXN],pos[MAXN],du[MAXN],ans[MAXN],num=;
vector<int>m[MAXN];
priority_queue<int>q;
int tr[MAXN<<];
void update(int k,int l,int r,int opt,int val){
if(l==r){
tr[k]=min(tr[k],val);
return ;
}
int mid=(l+r)>>;
if(opt<=mid) update(k<<,l,mid,opt,val);
else update(k<<|,mid+,r,opt,val);
tr[k]=min(tr[k<<],tr[k<<|]);
}
int query(int k,int l,int r,int opl,int opr){
if(opl>opr) return 0x3f3f3f3f;
if(opl<=l&&r<=opr) return tr[k];
int mid=(l+r)>>,res=0x3f3f3f3f;
if(opl<=mid) res=min(res,query(k<<,l,mid,opl,opr));
if(opr>mid) res=min(res,query(k<<|,mid+,r,opl,opr));
return res;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i){
scanf("%d",&a[i]);
pos[a[i]]=i;
}
memset(tr,0x3f,sizeof(tr));
for(int i=n;i>=;--i){
int p=query(,,n,max(,pos[i]-k+),pos[i]);
if(p<=n) m[pos[i]].push_back(pos[p]),++du[pos[p]];
p=query(,,n,pos[i],min(n,pos[i]+k-));
if(p<=n) m[pos[i]].push_back(pos[p]),++du[pos[p]];
update(,,n,pos[i],i);
}
for(int i=;i<=n;++i){
if(!du[i]) q.push(-i);
}
while(!q.empty()){
int x=-q.top();
q.pop();
ans[x]=++num;
int N=m[x].size();
for(int i=;i<N;++i){
int y=m[x][i];
--du[y];
if(!du[y]) q.push(-y);
}
}
for(int i=;i<=n;++i){
printf("%d\n",ans[i]);
}
return ;
}

tree:

好像是个结论:边权之和就是答案

#include<cstdio>
#define int long long
int n,ans=;
signed main(){
scanf("%lld",&n);
for(int i=,u,v,w;i<n;++i){
scanf("%lld%lld%lld",&u,&v,&w);
ans+=w;
}
printf("%lld\n",ans);
return ;
}

game:

模拟用堆可以有50分

考虑如何优化

我们对于前p个数找出最大值,并开桶统计所有数出现的次数

然后对于一个新加入的点,如果它大于当前的最大值,那么下一个人一定选择新加如的这个点,所以最大值没有变

否则更新新加入的数的次数并更新最大值

考虑到最大值一定不上升,所以复杂度较有保障

但是还是会T,所以我们离散化一下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#define re register
using namespace std;
const int MAXN=;
int n,k,a[MAXN],p,tim[MAXN],cnt,b[MAXN];
signed main(){
scanf("%d%d",&n,&k);
for(re int i=;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+n+);
cnt=unique(b+,b+n+)-b-;
for(int i=;i<=n;++i) a[i]=lower_bound(b+,b+cnt+,a[i])-b;
while(k--){
scanf("%d",&p);
re long long ans1=,ans2=;
re int maxp=;
for(re int i=;i<=p;++i){
++tim[a[i]];
maxp=max(maxp,a[i]);
}
ans1+=b[maxp];
--tim[maxp];
while(maxp>&&tim[maxp]==) --maxp;
for(re int i=;i<=n;++i){
if(i&){
if(p+<=n){
++p;
if(a[p]>=maxp) ans1+=b[a[p]];
else{
ans1+=b[maxp];
--tim[maxp];
++tim[a[p]];
while(maxp>&&tim[maxp]==) --maxp;
}
}else{
ans1+=b[maxp];
--tim[maxp];
while(maxp>&&tim[maxp]==) --maxp;
}
}else{
if(p+<=n){
++p;
if(a[p]>=maxp) ans2+=b[a[p]];
else{
ans2+=b[maxp];
--tim[maxp];
++tim[a[p]];
while(maxp>&&tim[maxp]==) --maxp;
}
}else{
ans2+=b[maxp];
--tim[maxp];
while(maxp>&&tim[maxp]==) --maxp;
}
}
}
printf("%lld\n",ans1-ans2);
}
return ;
}

csps-s模拟测试62,63Graph,Permutation,Tree,Game题解的更多相关文章

  1. [CSP-S模拟测试62]题解

    A.Graph 因为点可以随便走,所以对于每个联通块,答案为边数/2向下取整. 用类似Tarjan的方式,对于每个联通块建立一棵搜索树,尽量让每一个节点的儿子两两配对,如果做不到就用上头顶的天线. # ...

  2. [考试反思]1006csp-s模拟测试62:隔断

    本来说好的好一场烂一场. 那样的日子结束了,连着烂了两场...幸亏T3傻逼了救我一命不算太惨... T1树上的特殊性质会做但是没有继续想下去就死在错贪心上了还没有过那个点... T2迭代至稳定被我错误 ...

  3. csp-s模拟测试61砖块, 数字,甜圈题解

    题面:https://www.cnblogs.com/Juve/articles/11626350.html 砖块: 直接模拟即可,map统计被覆盖的次数 #include<iostream&g ...

  4. csp-s模拟测试56Merchant, Equation,Rectangle题解

    题面:https://www.cnblogs.com/Juve/articles/11619002.html merchant: 二分答案,贪心选前m大的 但是用sort复杂度不优,会T掉 我们只是找 ...

  5. csp-s模拟测试54x,y,z题解

    题面:https://www.cnblogs.com/Juve/articles/11606834.html x: 并差集,把不能分到两个集合里的元素和并到一起,设连通块个数为cnt,则答案为:$2^ ...

  6. csp-s模拟测试53u,v,w题解

    题面:https://www.cnblogs.com/Juve/articles/11602450.html u: 用差分优化修改 二维差分:给(x1,y1),(x2,y2)加上s: $d[x1][y ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  8. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

  9. csp-s模拟测试98

    csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...

随机推荐

  1. 【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap.

    对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了. 下面分为GET.POST.DELETE还有PUT的请求,说明@Path.@Query.@QueryMap.@Bo ...

  2. RoadFlow2.7.5 MyController.cs

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  3. 什么是PoE、PSE、PD设备?

    一个完整的PoE系统包括供电端设备(PSE, Power Sourcing Equipment)和受电端设备(PD, Power Device)两部分.PSE设备是为以太网客户端设备供电的设备,同时也 ...

  4. HDU 5052 /// 树链剖分+线段树区间合并

    题目大意: 给定n (表示树有n个结点) 接下来n行给定n个点的点权(在这个点上买鸡或者卖鸡的价钱就是点权) 接下来n-1行每行给定 x y 表示x结点和y结点之间有一条边 给定q (表示有q个询问) ...

  5. MySQL 11章_索引、触发器

    一. 索引: . 为什么要使用索引: 一本书需要目录能快速定位到寻找的内容,同理,数据表中的数据很多时候也可以为他们创建相应的“目录”,称为索引,当创建索引后查询数据也会更加高效 . Mysql中的索 ...

  6. 以 Ubuntu 为例:清理 linux 系统的"垃圾"文件

    clean 命令删除所有的软件安装包. 在网络连接正常的情况下,我们执行软件安装命令,软件安装结束后,以 .deb 为后缀的软件包就不再需要了.这种情况和 Windows 平台.手机的安卓平台上的情况 ...

  7. JS对象 向上取整ceil() ceil() 方法可对一个数进行向上取整。 语法: Math.ceil(x) 注意:它返回的是大于或等于x,并且与x最接近的整数。

    向上取整ceil() ceil() 方法可对一个数进行向上取整. 语法: Math.ceil(x) 参数说明: 注意:它返回的是大于或等于x,并且与x最接近的整数. 我们将把 ceil() 方法运用到 ...

  8. mysql-connetor-c 自动创建数据库、数据库表的命令

    1.首先连接MySQL默认的数据库mysql // 参数说明: // strIP: MySQL数据库的IP地址 // nPort: MySQL数据库的端口号 // strDBName: 要连接的数据库 ...

  9. 微信公众号开发API接口大全

    在本文中,我们列出微信公众平台上可以使用的API接口以及举例如何在微信公众平台调用这些接口实现相应的功能. 接口调用说明: ① Appkey请使用的微信公众号,不要使用默认的trailuser ② 接 ...

  10. 請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢

    請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢?下面的function可以將listview的縮圖加到listview2但是全都顯示listview1第一張的圖 ...