bzoj1635

来源:互联网 发布:电脑必学软件 编辑:程序博客网 时间:2024/05/22 06:29

分析:一开始没想到怎么搞。。后来发现好像用差分可以做。。
把每个限制看作一对括号,如果是暴力,那么我们肯定要把l+1到r-1的所有数-1。。
那么我们可以用差分序列做,每次对一个给出的左右端点,f[a[i].x+1]++,f[a[i].y]–,这样扫一遍用h-差分序列的前缀和,不就正好是答案吗?

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m,h,l,r;const int N=1e5+5;int f[N];struct node{    int x,y;}a[N];bool cmp(node a,node b){    if (a.x==b.x)return a.y<b.y;    return a.x<b.x;}int main(){    scanf("%d%d%d%d",&n,&l,&h,&r);    fo(i,1,r)    {        scanf("%d%d",&a[i].x,&a[i].y);        if (a[i].x>a[i].y)swap(a[i].x,a[i].y);    }    sort(a+1,a+1+r,cmp);    fo(i,1,r)    {        if (a[i].x==a[i-1].x&&a[i].y==a[i-1].y)continue;        f[a[i].x+1]++;f[a[i].y]--;    }    int sum=0;    fo(i,1,n)    {        sum+=f[i];        //printf("%d\n",f[i]);        printf("%d\n",h-sum);    }    return 0;}
0 0
原创粉丝点击