#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;
}
线段树
最新推荐文章于 2025-01-15 15:00:48 发布