线段树,居然pe了一次。。现场赛pe可是算wa的。。这尼玛!
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;
#ifdef _WIN32
#define i64 __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define i64 long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif
/************ for topcoder by zz1215 *******************/
#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)
#define FFF(i,a) for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --)
#define S64(a) scanf(in64,&a)
#define SS(a) scanf("%d",&a)
#define LL(a) ((a)<<1)
#define RR(a) (((a)<<1)+1)
#define pb push_back
#define CL(Q) while(!Q.empty())Q.pop()
#define MM(name,what) memset(name,what,sizeof(name))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
const int inf = 0x3f3f3f3f;
const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
const double oo = 10e9;
const double eps = 10e-9;
const double pi = acos(-1.0);
const int maxn = 100011;
const int maxz = 1<<10;
struct zz
{
int l;
int r;
int x;
int y;
int h;
int t;
}zx[maxn<<2+1];
int n,c;
int a[maxn];
int f[maxz+1][maxz+1];
int s[10][maxz];
int get(int x)
{
if(!x) return 0;
x%=9;
if(!x) return 9;
return x;
}
void up(int root)
{
zx[root].t = get(zx[root<<1].t+zx[root<<1|1].t);
zx[root].h = zx[root<<1].h | zx[root<<1|1].h;
zx[root].h |= f[zx[root<<1].y][zx[root<<1|1].x];
zx[root].x = zx[root<<1].x | s[zx[root<<1].t][zx[root<<1|1].x];
zx[root].y = zx[root<<1|1].y | s[zx[root<<1|1].t][zx[root<<1].y];
return ;
}
void build(int l,int r,int root=1)
{
zx[root].l = l;
zx[root].r = r;
if(l==r)
{
zx[root].x = zx[root].y = zx[root].h = 1 << get(a[l]);
zx[root].t = get(a[l]);
return ;
}
else
{
int mid = (l+r)/2;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
up(root);
return ;
}
}
int rex,rey,reh,ret;
int nowx,nowy,nowh,nowt;
void find(int l,int r,int root=1)
{
if(l<=zx[root].l && r>=zx[root].r)
{
ret = get(nowt+zx[root].t);
reh = nowh | zx[root].h;
reh |= f[nowy][zx[root].x];
rex = nowx | s[nowt][zx[root].x];
rey = zx[root].y | s[zx[root].t][nowy];
nowx = rex;
nowy = rey;
nowh = reh;
nowt = ret;
return ;
}
else
{
if(l<=zx[root<<1].r)
{
find(l,r,root<<1);
}
if(r>=zx[root<<1|1].l)
{
find(l,r,root<<1|1);
}
return ;
}
}
void init()
{
int temp;
for(int i=0;i<maxz;i++)
{
for(int j=0;j<maxz;j++)
{
temp = 0;
for(int x=0;x<=9;x++)
{
if(!(i&(1<<x)))
continue;
for(int y=0;y<=9;y++)
{
if(!(j&(1<<y)))
continue;
temp |= 1<<get(x+y);
}
}
f[i][j]=temp;
}
}
for(int i=0;i<=9;i++)
{
for(int j=0;j<maxz;j++)
{
temp = 0;
for(int x=0;x<=9;x++)
{
if(j&(1<<x))
{
temp|=1<<get(i+x);
}
}
s[i][j]=temp;
assert(s[0][j]==j);
}
}
return ;
}
int main()
{
init();
int T;
cin>>T;
for(int tt=1;tt<=T;tt++)
{
cin>>n;
for(int i=1;i<=n;i++)
{
SS(a[i]);
}
build(1,n);
cin>>c;
int now,to;
vector<int>v;
if(tt>1)
{
cout<<endl;
}
cout<<"Case #"<<tt<<":"<<endl;
for(int i=1;i<=c;i++)
{
SS(now);
SS(to);
rex=rey=reh=ret=nowx=nowy=nowt=nowh=0;
find(now,to);
v.clear();
for(int x=0;x<=9;x++)
{
if(reh & (1<<x))
{
v.pb(x);
}
}
sort(v.begin(),v.end());
reverse(v.begin(),v.end());
for(int i=1;i<=5;i++)
{
v.pb(-1);
}
for(int i=0;i<=3;i++)
{
printf("%d ",v[i]);
}
printf("%d\n",v[4]);
}
}
return 0;
}
分享到:
相关推荐
hdu 1166线段树代码
hdu 1166线段树
从简单入门到偏中等的几个题,线段树很灵活,主要懂了lazy操作,其他的自己yy吧。
ACM HDU 1404 Digital Deletions(博弈).docx
2017hdu多校联合训练第一场标程及数据
HDU2013暑期多校联合训练第一场0723-解题报告和标程
线段树入门资料,有利于初学者学习,让他们详细了解线段树。
2019 Multi-University Training Contest 4(2019hdu多校第六场数据与标程)
ACM/ICPC 2010年多校联合第十场第九题的解题报告及代码,AC代码有三个,最好的是src
2019 Multi-University Training Contest 4(2019hdu多校第五场数据与标程),欢迎大家下载
【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源
题面 【题目描述】 有nnn个营地,已知每个营地的人数,有四条命令: (1)Add(1) Add(1)Add iii jjj,iii和jjj为正整数,表示第iii个营地增加jjj个人(jjj不超过303030) (2)Sub(2)Sub(2)Sub iii jjj ,iii和jjj为正...
NULL 博文链接:https://128kj.iteye.com/blog/1738772
大量线段树题目 zoj 1610 线段覆盖 poj 2777 线段覆盖 poj 2528 需要离散化,建树不同,需要处理不同->注意这组数据 3 1 10 1 3 6 10 the ans is 3. hdu 1754 求区间最大值 hdu 1166 求区间和 hdu 1698 成段更新 ...
HDU的ACM,非常的好 涉及了很多算法,例如二分匹配、博弈、组合、最小生成树、搜索、动态规划、贪心算法
HDU2000至2099题的题目以及AC代码(含思路) 适合刚刚接触ACM的同学哦~ emmmm凑字
有2019 Multi-University Training Contest 4,hdu多校第四场的题解,数据标程,有需要的可以下载哦
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
300+ AC 代码 。 大数 , 线段树 , 字符串 , dp.....