某看起来不会做题1

P2448 无尽的生命

题目描述

逝者如斯夫,不舍昼夜!
叶良辰认为,他的寿命是无限长的,而且每天都会进步。
叶良辰的生命的第一天,他有1点能力值。第二天,有2点。第n天,就有n点。也就是S[i]=i
但是调皮的小A使用时光机,告诉他第x天和第y天,就可以任意交换某两天的能力值。即S[x]<>S[y]
小A玩啊玩,终于玩腻了。
叶良辰:小A你给我等着,我有100种办法让你生不如死。除非能在1秒钟之内告知有多少对“异常对”。也就是说,最后的能力值序列,有多少对的两天x,y,其中x<y,但是能力值S[x]>S[y]?
小A:我好怕怕啊。
于是找到了你。

输入输出格式

输入格式:

第一行一个整数k,表示小A玩了多少次时光机
接下来k行,xi,yi,表示将S[xi]S[yi]进行交换

输出格式:

有多少“异常对”

输入输出样例

输入样例#1:

2
4 2
1 4

输出样例#1: 复制

4

样例说明

最开始是123456...
然后是 143256...
然后是 243156...
符合的对是[14][23][24][34]

数据说明

对于30%的数据,xi,yi<=2000
对于70%的数据, xi,yi<=100000
对于100%的数据, xi.yi<=2311k<=100000




看来是随机出一道好题
肯定不能用逆序对直接搞
那样做只能得70分?

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define lowbit((a)) (a)&(-(a))
using namespace std;

typedef long long ll;

int hash[N],b[N],a[N];
ll ans,tree[N];
int n,m,cnt;

struct node{
    int x,y;
}q[N];

inline int read(){
    int a=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    for(a=0;isdigit(c);a=a*10+c-'0',c=getchar());
    return a*f;
}

inline int find(int x) {
    int l=1,r=m;
    while(l<=r) {
        int mid=(l+r)>>1;
        if(hash[mid]==x) return mid;
        else if(hash[mid]<x) l=mid+1; 
        else r=mid-1;
    }
    return r;
}
struct BIT{
    int n;
    int tre[N];
    init(int n){
        this-n=n;
        memset(tre,false,sizeof(tre));
    }


inline int lowbit(int x) {
    return x&(-x);
}

inline void add(int x,ll val) {
    for (int i=x;i<=m;i+=lowbit(i)) tree[i]+=val;
}

inline ll query(int x) {
    ll sum=0;
    for (int i=x;i;i-=lowbit(i)) sum+=tree[i];
    return sum;
}

int main() {
    n=read();
    for (int i=1;i<=n;i++) a[++cnt]=q[i].x=read(),a[++cnt]=q[i].y=read();
    sort(a+1,a+cnt+1); 
    for (int i=1;i<=cnt;i++)
        if (a[i]!=a[i-1]) hash[++m]=a[i];
    for (int i=1;i<=m;i++) b[i]=i;
    for (int i=1;i<=n;i++) {
        int x=find(q[i].x),y=find(q[i].y);
        swap(b[x],b[y]);
    }
    add(b[m],1);
    for (int i=m-1;i;i--) {
        ll x=(ll)(hash[i+1]-hash[i]-1),p=query(i);
        ans=ans+(x*p);
        add(i,x);
        ans=ans+query(b[i]-1);
        add(b[i],1);
    }
    printf("%lld",ans);
    return 0;
}
posted @   Grary  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)
博客园 首页 私信博主 编辑 关注 管理 新世界
点击右上角即可分享
微信分享提示