知识一览
单点查询区间值
c++/结构体排序
题目链接
又到了花开的季节,每到这时都会有人出来赏花。每朵花都有花期从stari 到endi(都包含),过了花期后花就会凋零。同时每个人都会选择一个时间点timei去赏花。你需要做的是返回所有人能看到多少朵花。
输入描述:
第一行输入两个正整数n(1≤n≤2∗10^5) 和 m(1≤m≤2∗10^5)分别表示花的数目和有多少人来赏花。
接下来n行,每行有两个整数,表示第i朵花的的花期starti和endi其中1 <=starti<=endi<=10^9。
接下来1行,m个整数,第i个数表示第i个人选择赏花的时间timei(1<=timei<=10^9)。
输出描述:
共1行m个整数,其中第i个数表示第i人能看到的花的数目。
示例1
输入
4 4
1 6
3 7
9 12
4 13
2 3 7 11
输出
1 2 2 2
Java TLE ;C++ AC
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N=6e5+10;
struct Node{
int a,w;
}node[N];
bool cmp(Node a,Node b){
if(a.a!=b.a)return a.a<b.a;
else return b.w<a.w;
}
int main(){
IOS
int n,m;
cin>>n>>m;
int aa[m];
map<int,int> mp;
int cnt=-1;
while(n-->0){
int a,b;cin>>a>>b;
node[++cnt].a=a;node[cnt].w=1;
node[++cnt].a=b;node[cnt].w=-1;
}
for(int i=0;i<m;i++){
cin>>aa[i];
node[++cnt].a=aa[i];node[cnt].w=0;
}
sort(node,node+cnt+1,cmp);
int ans=0;
for(int i=0;i<=cnt;i++){
if(node[i].w!=0)ans+=node[i].w;
else mp[node[i].a]=ans;
}
for(int i=0;i<m;i++) cout<<mp[aa[i]]<<" ";
return 0;
}