[HDU5603] the soldier of love 题解

考虑到正向求解困难,于是正难则反。

那么实际上对于 \(a_i\)\(a_{i+1}\) 来说,它们给答案的贡献就是满足 \(l_j>a_i,r_j<a_{i+1}\) 的区间数量。

那么就是经典转化了。直接转换为二维数点问题即可。时间复杂度 \(O(tn\log V)\),离散化可以将 \(\log V\) 转化为 \(\log n\)

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
const int M=1e6+5;
const int K=2e6+5;
struct que{
	int x,y,id,o;
}q[K];int n,m,k;
int c[M],as[N];
int cmp(que x,que y){
	if(x.x!=y.x) return x.x<y.x;
	return (x.y!=y.y)?x.y<y.y:x.id<y.id;
}void add(int x){
	for(;x<=1e6;x+=x&-x) c[x]++;
}int sum(int x){
	int re=0;
	for(;x;x-=x&-x) re+=c[x];
	return re;
}void solve(){
	for(int i=1;i<=n;i++){
		int l,r;cin>>l>>r;
		q[++k]={l,r,0,0};
	}for(int i=1,x;i<=m;i++){
		int num,lst;
		cin>>num,x=as[i]=0;
		while(num--){
			lst=x,cin>>x;
			q[++k]={lst,x-1,i,-1};
			if(lst) q[++k]={lst,lst-1,i,1};
		}q[++k]={x,1e6,i,-1};
		if(x) q[++k]={x,x-1,i,1};
		q[++k]={1e6+1,1e6,i,1};
	}sort(q+1,q+k+1,cmp);
	for(int i=1;i<=k;i++){
		if(!q[i].x) continue;
		if(!q[i].id) add(q[i].y);
		else as[q[i].id]+=q[i].o*sum(q[i].y);
	}for(int i=1;i<=m;i++)
		cout<<n-as[i]<<"\n";
	for(int i=1;i<=1e6;i++) c[i]=0;
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	while(cin>>n>>m) k=0,solve();
	return 0;
}
posted @   长安一片月_22  阅读(13)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示