snoi多校模拟赛 1.18 t1 query
2018-01-18 18:12
190 查看
A 查询(query.pas/c/cpp)TL:5S ML:512MB
【Description】给定一个含有N个非负整数的序列,请写一个程序,支持以下两个操作:1、Q l r 表示求l至r这一段所有数的和,结果对329701061取模2、C l r 表示将l至r这一段中的每一个数变为其立方。【Input】
第一行一个整数N。
接下来N行,每行一个整数a[i],表示初始序列。
接下来一个整数Q,表示操作数量。
接下来Q行,每行一个操作,格式见上。【Output】
对于每个Q操作,进行回答。【Sample Input】38 3 45Q 1 2C 2 3Q 1 3C 1 2Q 2 3 【Sample Output】119919747【Hint】 20%:N, Q <= 100040%:N, Q<=3000060%:N, Q <= 50000另外20%:对于所有的C操作, l=r100%:N, Q<=100000,初始数值在0…329701060内。首先,这题打表找规律,发现每个数模329701061意义下48个周期一循环所以线段树中要保存48个值,足以解决本题。之后就是裸的线段树代码:#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define rson ((now<<1)|1)
#define lson (now<<1)
#define mid ((s[now].l+s[now].r)>>1)
#define ll long long
#define ljm 329701061
#define zrx 48
struct nod
{
ll v[50],l,r,z;
nod(int l=0,int r=0,int z=0):l(l),r(r),z(z){memset(v,0,sizeof(v));}
}s[400005];
int a[100005],n,q,ql,qr;
ll li(ll a)
{
return (((a*a)%ljm)*a)%ljm;
}
void update(int now)
{
for(int i=0;i<48;i++)
s[now].v[i]=(s[lson].v[i]+s[rson].v[i])%ljm;
}
void add(int now,int V)
{
ll tmp[50];
f
4000
or(int i=0;i<48;i++) tmp[i]=s[now].v[i];
for(int i=0;i<48;i++) s[now].v[i]=tmp[(i+V)%zrx];
}
void down(int now)
{
if(!s[now].z) return;
add(lson,s[now].z);
add(rson,s[now].z);
s[lson].z=(s[lson].z+s[now].z)%zrx;
s[rson].z=(s[rson].z+s[now].z)%zrx;
s[now].z=0;
}
void build(int now,int L,int R)
{
s[now]=nod(L,R,0);
if(L==R)
{
s[now].v[0]=a[L];
for(int i=1;i<48;i++)
s[now].v[i]=li(s[now].v[i-1]);
return;
}
build(now*2,L,mid);
build(now*2+1,mid+1,R);
update(now);
}
void Add(int now,int L,int R)
{
if(s[now].l>=L&&s[now].r<=R)
{
s[now].z=(s[now].z+1)%zrx;
add(now,1);
return;
}
down(now);
if(L<=mid) Add(now*2,L,R);
if(R>mid) Add(now*2+1,L,R);
update(now);
}
ll query(int now,int L,int R)
{
if(s[now].l>=L&&s[now].r<=R) return s[now].v[0];
down(now);
ll ans=0;
if(L<=mid) ans=(ans+query(now*2,L,R))%ljm;
if(R>mid) ans=(ans+query(now*2+1,L,R))%ljm;
return ans;
}
char c[1];
int main()
{
freopen("query.in ","r",stdin);
freopen("query.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
scanf("%d",&q);
while(q--)
{
scanf("%s%d%d",c,&ql,&qr);
if(c[0]=='C') Add(1,ql,qr);
else printf("%d\n",query(1,ql,qr));
}
}
【Description】给定一个含有N个非负整数的序列,请写一个程序,支持以下两个操作:1、Q l r 表示求l至r这一段所有数的和,结果对329701061取模2、C l r 表示将l至r这一段中的每一个数变为其立方。【Input】
第一行一个整数N。
接下来N行,每行一个整数a[i],表示初始序列。
接下来一个整数Q,表示操作数量。
接下来Q行,每行一个操作,格式见上。【Output】
对于每个Q操作,进行回答。【Sample Input】38 3 45Q 1 2C 2 3Q 1 3C 1 2Q 2 3 【Sample Output】119919747【Hint】 20%:N, Q <= 100040%:N, Q<=3000060%:N, Q <= 50000另外20%:对于所有的C操作, l=r100%:N, Q<=100000,初始数值在0…329701060内。首先,这题打表找规律,发现每个数模329701061意义下48个周期一循环所以线段树中要保存48个值,足以解决本题。之后就是裸的线段树代码:#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define rson ((now<<1)|1)
#define lson (now<<1)
#define mid ((s[now].l+s[now].r)>>1)
#define ll long long
#define ljm 329701061
#define zrx 48
struct nod
{
ll v[50],l,r,z;
nod(int l=0,int r=0,int z=0):l(l),r(r),z(z){memset(v,0,sizeof(v));}
}s[400005];
int a[100005],n,q,ql,qr;
ll li(ll a)
{
return (((a*a)%ljm)*a)%ljm;
}
void update(int now)
{
for(int i=0;i<48;i++)
s[now].v[i]=(s[lson].v[i]+s[rson].v[i])%ljm;
}
void add(int now,int V)
{
ll tmp[50];
f
4000
or(int i=0;i<48;i++) tmp[i]=s[now].v[i];
for(int i=0;i<48;i++) s[now].v[i]=tmp[(i+V)%zrx];
}
void down(int now)
{
if(!s[now].z) return;
add(lson,s[now].z);
add(rson,s[now].z);
s[lson].z=(s[lson].z+s[now].z)%zrx;
s[rson].z=(s[rson].z+s[now].z)%zrx;
s[now].z=0;
}
void build(int now,int L,int R)
{
s[now]=nod(L,R,0);
if(L==R)
{
s[now].v[0]=a[L];
for(int i=1;i<48;i++)
s[now].v[i]=li(s[now].v[i-1]);
return;
}
build(now*2,L,mid);
build(now*2+1,mid+1,R);
update(now);
}
void Add(int now,int L,int R)
{
if(s[now].l>=L&&s[now].r<=R)
{
s[now].z=(s[now].z+1)%zrx;
add(now,1);
return;
}
down(now);
if(L<=mid) Add(now*2,L,R);
if(R>mid) Add(now*2+1,L,R);
update(now);
}
ll query(int now,int L,int R)
{
if(s[now].l>=L&&s[now].r<=R) return s[now].v[0];
down(now);
ll ans=0;
if(L<=mid) ans=(ans+query(now*2,L,R))%ljm;
if(R>mid) ans=(ans+query(now*2+1,L,R))%ljm;
return ans;
}
char c[1];
int main()
{
freopen("query.in ","r",stdin);
freopen("query.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
scanf("%d",&q);
while(q--)
{
scanf("%s%d%d",c,&ql,&qr);
if(c[0]=='C') Add(1,ql,qr);
else printf("%d\n",query(1,ql,qr));
}
}
相关文章推荐
- snoi多校模拟赛 1.18 t3 home
- snoi多校模拟赛1.16 t1 光之大陆
- snoi多校模拟赛1.15 t1 travel
- snoi多校模拟赛 1.17 t1 path
- snoi多校模拟赛1.15 t3 string
- 1.18 NOI省选模拟赛 响子 千秋 千纱
- snoi多校模拟赛 t3 z
- request.querystring 获取值为乱码
- 出现org.hibernate.hql.internal.ast.QuerySyntaxException: goodsinfo is not mapped [from goodsinfo错误
- org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: b near line 1, column 49...
- Can’t connect to MySQL server on ‘localhost’(10055) + Can not open connection + Could not execute query
- VS中MFC连接MySQL由于系统不同位(32/64)引起的错误:无法解析的外部符号 _mysql_init@4、_mysql_query
- http_build_query()函数使用方法
- MySQL Query Profile 简单使用
- Range Minimum Query(RMQ)
- Spring data jpa HQL @Query 自定义查询及更新删除 及 sql写法
- Structure of the Basic MDX Query
- PL/SQL : Procedural Language / Structual Query Language and it is an exrension to SQL.
- laravel5.1 子查询(Query_Builder)
- QT for linux 的错误 undefined reference to 'FcFreeTypeQueryFace' 的解决方法