///灯泡开关问题
/*
#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;
}
*/
B. Light bulbs (灯泡开关问题)
最新推荐文章于 2021-01-28 21:21:58 发布