B. Light bulbs (灯泡开关问题)

///灯泡开关问题
/*
#include<bits/stdc++.h>/// 接近O(m*log(m))算法
using namespace std;
pair<int,int>a[1005];
pair<int,int>temp1,temp2;
struct cmp{
    bool operator ()(const pair<int,int>a,const pair<int,int>b)///结构体pair优先队列重载
    {
        if(a.first==b.first)
            return a.second>b.second;
        return a.first>b.first;
    }
};

int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        priority_queue<pair<int,int>,vector<pair<int,int> >,cmp>qe;
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
            scanf("%d%d",&a[i].first,&a[i].second),qe.push(a[i]);
        int ans=0;
        while(qe.size()>=2)
        {
            temp1=qe.top();
            qe.pop();
            temp2=qe.top();
            qe.pop();
            if(temp1.second<temp2.first)
            {
                ans+=(temp1.second-temp1.first+1);///如果没有交集取前面,后面重新加入队列
                qe.push(make_pair(temp2.first,temp2.second));
            }
            if(temp1.second>=temp2.first)
            {
                ans+=(temp2.first-temp1.first);///如果有交集取前面,删去交集,后面的L+1重新加入队列
                if(temp1.second+1<=temp2.second)
                    qe.push(make_pair(temp1.second+1,temp2.second));
                else
                    qe.push(make_pair(temp2.second+1,temp1.second));///2-5 3-4
            }
        }
        if(qe.size()==1)
            ans+=qe.top().second-qe.top().first+1;
        printf("Case #%d: %d\n",++kase,ans);
    }
    return 0;
}
*/

/*
#include<bits/stdc++.h>///O(m)和上面思路一致
using namespace std;
const int N=1e3+5;
int a[N*2];
int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        int x,y;
        scanf("%d%d",&n,&m);
        for(int i=0;i<2*m;)
        {
            scanf("%d%d",&x,&y);
            a[i++]=x,a[i++]=y+1;///y+1 区间合并得到,为了防止y取没取上
        }
        sort(a,a+2*m);
        int ans=0;
        for(int i=1;i<2*m;i+=2)///直接去掉了交集部分
            ans+=a[i]-a[i-1];
        printf("Case #%d: %d\n",++kase,ans);
    }
    return 0;
}
*/


#include<bits/stdc++.h>///O(m)
using namespace std;
const int N=1e6+5;
const int M=1e3+5;
int a[M*2],b[N];///a存区间,b存值
int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        int x,y;
        int k=0;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            a[k++]=x,b[x]++;
            a[k++]=y+1,b[y+1]--;
        }
        sort(a,a+k);
        int ans=0,sum=0;
        for(int i=0;i<k-1;i++)
        {
            sum+=b[a[i]],b[a[i]]=0;
            if(sum%2)
                ans+=a[i+1]-a[i];///预防第一个没有算上
        }
        b[a[k-1]]=0;///最后一个要置为0
        printf("Case #%d: %d\n",++kase,ans);
    }
    return 0;
}



/*
#include<bits/stdc++.h>///灯泡开关问题  接近O(n)算法
using namespace std;
const int N=1e6+5;
int a[N];
int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        int x,y;
        scanf("%d%d",&n,&m);
        int l=n,r=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            l=min(l,x),r=max(r,y);
            a[x]++,a[y+1]--;
        }
        int ans=0,sum=0;
        for(int i=l;i<=r+1;i++)
        {
            sum+=a[i];
            if(sum%2==1)
                ans++;
            a[i]=0;
        }
        printf("Case #%d: %d\n",++kase,ans);
    }
    return 0;
}

*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值