线段树

来源:互联网 发布:长沙工业软件培训 编辑:程序博客网 时间:2024/06/05 15:19
#include<bits/stdc++.h>//问题可以转化为对区间添值,单点查询此区间有几个值using namespace std;const int maxn=4e5;int ans_to[300],num=0;struct Node{    int root,flag;  //flag延迟标记    vector<int>v;   //动态加值}c[3*maxn];//-3倍,,,非两倍关系orz..void build(int root,int l,int r){    if(l==r){c[root].flag=0;c[root].v.clear();return;}    int mid=(l+r)>>1;    build(root<<1,l,mid);    build(root<<1|1,mid+1,r);    c[root].v.clear();    c[root].flag=0;}void push_down(int root){    if(c[root].flag)    {        c[root<<1].flag=1;        c[root<<1|1].flag=1;        for(int i=0;i<c[root].v.size();i++)        {            c[root<<1].v.push_back(c[root].v[i]);            c[root<<1|1].v.push_back(c[root].v[i]);        }        c[root].flag=0;        c[root].v.clear();//清除此区间的值    }}void update(int root,int l,int r,int from,int to,int id){     //push_down(root,l,r);     //debug   这写的话就得不到答案了,好久找..    if(l>=from&&r<=to)    {        c[root].flag=1;        c[root].v.push_back(id);        return;    }    //push_down(root,l,r);       //debug 不符合的区间被处理的话下次就找不到里面的值了    if(l>to||r<from) return;    push_down(root);         //debug -ok    int mid=(l+r)>>1;    update(root<<1,l,mid,from,to,id);    update(root<<1|1,mid+1,r,from,to,id);}void query(int root,int l,int r,int x){    if(l==r)    {        for(int i=0;i<c[root].v.size();i++) ans_to[num++]=c[root].v[i];        return;    }    push_down(root);    int mid=(l+r)>>1;    if(x<=mid) query(root<<1,l,mid,x);    else query(root<<1|1,mid+1,r,x);}int isleap(int y){    if(y%400==0||(y%4==0)&&(y%100!=0)) return 1;    return 0;}int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int _day[3000][14][35];void init(){int s=1;    for(int y=2000;y<=2999;y++)    {        int flag=isleap(y);        if(flag) month[2]++;        for(int m=1;m<=12;m++)        {            for(int d=1;d<=month[m];d++)            {                 _day[y][m][d]=s++;            }        }        if(flag) month[2]--;    }    //cout<<s<<endl;}int jud(int y,int m,int d,int y1,int m1,int d1){    if((y<y1-1)||(y<y1&&m1+12>m+1)||(y<y1&&d1>=d)||(y==y1&&(m+1<m1||(m+1==m1&&d1>=d))))    return 1;    return 0;}int main(){    //freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);    init();    int n;    while(scanf("%d",&n)!=EOF)    {        build(1,1,_day[2999][12][31]);        for(int i=0;i<n;i++)        {            int y,m,d,y1,m1,d1,id;            scanf("%d%d%d%d%d%d%d",&y,&m,&d,&y1,&m1,&d1,&id);            if(!jud(y,m,d,y1,m1,d1)) continue;            int s1=_day[y][m][d],s2=_day[y1][m1][d1];            update(1,1,_day[2999][12][31],s1,s2,id);        }        int cm;        scanf("%d",&cm);        while(cm--)        {            int y,m,d;            scanf("%d%d%d",&y,&m,&d);            int s=_day[y][m][d];            num=0;            query(1,1,_day[2999][12][31],s);            sort(ans_to,ans_to+num);            printf("%d ",num);            for(int i=0;i<num;i++) printf("%d ",ans_to[i]);printf("\n");        }    }    return 0;}

原创粉丝点击