题目:http://acm.hdu.edu.cn/showproblem.php?pid=6058

分析题目的时候,由于枚举的区间很多,而第k大的值范围小,应该要想到去枚举第k大的值然后找到这个值对答案的贡献。

题解:我们只要求出对于一个数x左边最近的k个比他大的和右边最近k个比他大的,扫一下就可以知道有几个区间的kk大值是xx.(这个地方自己举几个例子就知道了)

我们考虑从小到大枚举x,每次维护一个链表(我写了一个双链表),链表里只有大于x的数,每次求x对答案的贡献的时候,直接在链表中x的位置左右k个值扫一边就可以了。

ac代码:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
struct node
{
ll key;
ll l,r;
}num[];
ll a[];
ll pos[];
ll pre[],nex[]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d %d",&n,&k);
num[].l=-;
num[n].r=-;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(i!=) num[i].l=i-;
if(i!=n) num[i].r=i+;
num[i].key=a[i];
pos[a[i]]=i;
}
ll sum=;
for(int i=;i<=n;i++)
{
fill(pre+,pre+k+,-);
fill(nex+,nex+k+,-);
ll po=pos[i];
ll temp=num[po].l;
int ret=;
pre[]=nex[]=po;
while(temp!=- && ret<=k)
{
pre[ret++]=temp;
temp=num[temp].l;
}
temp=num[po].r;
ret=;
while(temp!=- && ret<=k)
{
nex[ret++]=temp;
temp=num[temp].r;
}
/*
for(int i=1;i<=k;i++) cout<<pre[i]<<' ';
cout<<endl;
for(int i=1;i<=k;i++) cout<<nex[i]<<' ';
cout<<endl;
*/
for(int j=;j<k;j++)
{
if(pre[k-j-]==- || nex[j]==-) continue;
ll ans=pre[k-j-]-pre[k-j];
ll ans2=nex[j+]-nex[j];
if(pre[k-j]==-) ans=pre[k-j-];
if(nex[j+]==-) ans2=n-nex[j]+;
// cout<<ans<<' '<<ans2<<endl;
sum+=ans*ans2*(ll)i;
}
// delete
ll nl=num[po].l;
ll nr=num[po].r;
num[nl].r=nr;
num[nr].l=nl;
}
printf("%lld\n",sum);
}
return ;
}

用链表去维护左右比x大的数还是很神奇的(从小到大去计算贡献值,每次算完小的值就从链表里面删去,,,, 厉害了)。。这个真心没想到

hdu 6058 思维的更多相关文章

  1. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  2. HDU 2588 思维 容斥

    求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...

  3. HDU 1431 思维 基础数论

    找范围内回文素数,最大到1e8,我就是要枚举回文串,再判素数,然后因为这种弱智思路死磕了很久题目. /** @Date : 2017-09-08 15:24:43 * @FileName: HDU 1 ...

  4. hdu 6058 Kanade's sum (计算贡献,思维)

    题意: 给你一个全排列,要你求这个序列的所有区间的第k大的和 思路:比赛的时候一看就知道肯定是算贡献,也知道是枚举每个数,然后看他在多少个区间是第K大,然后计算他的贡献就可以了,但是没有找到如何在o( ...

  5. HDU 6058:Kanade's sum(思维)

    题目链接 题意 给出一个n和一个k,求1~n的每个区间的第k大的总和是多少,区间长度小于k的话,贡献为0. 思路 首先有一个关系:当一个数是第k大的时候,前面有x个比它大的数,那么后面就有k-x-1个 ...

  6. HDU - 6058 Kanade's sum

    Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6058 /* 思路是:找出每个x为第k大的区间个数有多少 用pos[i]保存当前x的位置, ...

  7. 【链表】2017多校训练三 HDU 6058 Kanade's sum

    acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...

  8. hdu 4883 思维题

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4883 TIANKENG’s restaurant Time Limit: 2000/1000 MS (Ja ...

  9. hdu 5014 思维题/推理

    http://acm.hdu.edu.cn/showproblem.php?pid=5014 从小数開始模拟找方法规律,然后推广,尤其敢猜敢尝试,错了一种思路继续猜-----这是一种非常重要的方法啊 ...

随机推荐

  1. spring boot 学习常用网站

    springboot的特性 https://www.cnblogs.com/softidea/p/5644750.html 1.自定义banner https://www.cnblogs.com/cc ...

  2. SQLyog Enterprise Trial 试用期问题

    SQLyog Enterprise Trial 是 SQLyog的试用版,有效期30天:试用期过后提示购买之后才能使用:解决办法:修改注册表(过期就得改比较麻烦,但暂时可以用,等有时间了再找其他办法) ...

  3. SQL-W3Chool-高级:SQL CREATE DATABASE 语句

    ylbtech-SQL-W3Chool-高级:SQL CREATE DATABASE 语句 1.返回顶部 1. CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库. ...

  4. <frameset>和<body>不能共用

    frameset 定义: frameset 元素可定义一个框架集.它被用来组织多个窗口(框架).每个框架存有独立的文档.在其最简单的应用中,frameset 元素仅仅会规定在框架集中存在多少列或多少行 ...

  5. 断句:Store all parameters but the first passed to this function as an array

    // Store all parameters but the first passed to this function as an array //除了第一个参数,把调用publish函数时的所有 ...

  6. Qt打开文件QFileDialog

    //打开Pts文件按钮点击事件void AnalysisPtsDataTool201905::OnOpenFileButtonClick(){ qDebug()<<"open f ...

  7. 使用iptables为docker容器动态添加端口映射

    1.将当前iptables的配置写入保存到/etc/sysconfig/iptables 2.保存 /etc/init.d/iptables sava 3.修改iptables配置(vi /etc/s ...

  8. java泛型中特殊符号的含义

    java泛型中的标记符含义:  E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number ...

  9. Equals和GetHashCode

    Q:2个方法同时被重写的场景? A:Dictionary或HashTable的key使用时,必须重写这两个方法; 因为:根据key取值的时候也是把key转换成HashCode并且验证Equals后再取 ...

  10. linux如何添加服务为系统服务快速启动或关闭

    当在linux系统安装了一些服务比如apache,mysql,iptables等等后想快速启动或者重启 但是在使用系统启动或者关闭服务时候发现输入指令 >service httpd restar ...