The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H
比赛链接https://www.jisuanke.com/contest/3098?view=challenges
B题 拉格朗日插值
题意 T组输入。一个n次多项式 f(x) ,每项的系数不知道,只知道f(0),f(1)..f(n) 的值,m个询问,L,R。计算$\sum_{i=L}^{R}f(i)\quad mod(9999991)$
$(1\leq T\leq 5) $
$(1\leq n\leq 1000) $
$(1\leq m\leq 2000) $
$(1\leq L\leq R \leq 9999990)$
解析 遇到这题我是崩溃的,听大家说是拉格朗日插值,找到了一个快速拉格朗日的板子,贴上去就过了。。。
#include<bits/stdc++.h>
using namespace std;
#define maxn 1010
typedef long long LL;
const LL mod = ; LL powmod(LL aa, LL x) {
LL res = ;
for(; x > ; x >>= ) {
if(x & )res = (res * aa) % mod;
aa = (aa * aa) % mod;
}
return res;
} struct lagrange {
#define ll long long
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define D 2010 //D比MAXN大100就行
ll a[D], f[D], g[D], p[D], p1[D], p2[D], b[D], h[D][], C[D];
void init(int M) {//初始化:参数填MAXN + 20
f[] = f[] = g[] = g[] = ;
rep(i, , M + ) f[i] = f[i - ] * i % mod;
g[M + ] = powmod(f[M + ], mod - );
per(i, , M + ) g[i] = g[i + ] * (i + ) % mod;
}
/*给定一组样本数据a[],规模为0-d,计算出第n项*/
ll calcn(int d, ll *a, ll n) {
if (n <= d) return a[n];
p1[] = p2[] = ;
rep(i, , d + ) {
ll t = (n - i + mod) % mod;
p1[i + ] = p1[i] * t % mod;
}
rep(i, , d + ) {
ll t = (n - d + i + mod) % mod;
p2[i + ] = p2[i] * t % mod;
}
ll ans = ;
rep(i, , d + ) {
ll t = g[i] * g[d - i] % mod * p1[i] % mod * p2[d - i] % mod * a[i] % mod;
if ((d - i) & ) ans = (ans - t + mod) % mod;
else ans = (ans + t) % mod;
}
return ans;
}
/*
给定一组观测点(0, a[0]), (1, a[1]), ...,(m, a[m]),、
样本点的个数为a(x)的最高次+1。
求在该函数模型下,a[0]+a[1]+...+a[n]的和。
*/
ll ta[D];
ll polysum(ll m, ll *a, ll n) { // 给定a[0].. a[m],求\sum_{i=0}^{n}a[i]
memcpy(ta, a, sizeof(a[]) * (m + ));
ta[m + ] = calcn(m, ta, m + );
rep(i, , m + )ta[i] = (ta[i - ] + ta[i]) % mod;
return calcn(m + , ta, n);
}
};
int main()
{
int t;
scanf("%d",&t);
while(t--){
ll a[maxn],n,m;
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
lagrange ri;
ri.init(maxn+);
while(m--){
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",(ri.polysum(n,a,r)-ri.polysum(n,a,l-)+mod)%mod);
}
}
}
H题 FWT+线段树
题意 一个n代表A,B数组的长度,A,B两个数组中的数两两或(二进制运算)一下 ,得到一个不去重C数组(显然C的长度为n*n)。接下来一个m代表操作次数,每次输入两个数L,R
如果L等于0,表示询问C数组中第R个数,否则表示C数组中第L个数到第R个数 开根号。
解析 用FWT求出来 or 之后 每个数的个数,然后建立权值线段树,或者前缀和+二分,都可以log时间复杂度求出第k个数是几。只需要知道这个数开了几次根号,L,R会很大,
但是数量只有那么多,离散化一下就可以解决了,1e5开根号大于5次就是1了,小于5次暴力开就好了。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> Pii;
const int maxn = 3e5+; ll a[maxn],b[maxn],c[maxn];
void FWT_or(ll *a,int N,int opt)
{
for(int i=;i<=N;i<<=)
for(int p=i<<,j=;j<=N;j+=p)
for(int k=;k<i;++k)
if(opt==)a[i+j+k]=a[j+k]+a[i+j+k];
else a[i+j+k]=a[i+j+k]-a[j+k];
}
ll C[maxn];
int lowbit(int x)
{
return x&(-x);
}
ll bitgetsum(int x)
{
ll ans=;
for(int i=x;i>;i-=lowbit(i))
ans+=C[i];
return ans;
}
void bitupdate(int x,int z)
{
for(int i=x;i<=3e5;i+=lowbit(i))
C[i]+=z;
}
struct ndoe
{
ll l,r;
}q[maxn];
vector<ll> v;
int getid(ll x){
return lower_bound(all(v),x)-v.begin()+;
}
ll sum[maxn*];
void pushUp(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void build(int l,int r,int rt)
{
if(l==r){
sum[rt]=c[l];
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
pushUp(rt);
}
int query(ll val,int l,int r,int rt)
{
if(l==r){
return l;
}
int mid=(l+r)>>;
if(sum[rt<<]>=val)
return query(val,l,mid,rt<<);
else
return query(val-sum[rt<<],mid+,r,rt<<|);
}
int main()
{
int n,x,m;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&x);a[x]++;
}
for(int i=;i<n;i++){
scanf("%d",&x);b[x]++;
}
n=2e5;
FWT_or(a,n,);FWT_or(b,n,);
for(int i=;i<=n;i++) c[i]=1ll*a[i]*b[i];
FWT_or(c,n,-);build(,n,);
scanf("%d",&m);
for(int i=;i<m;i++){
scanf("%lld%lld",&q[i].l,&q[i].r);
v.pb(q[i].r);
if(q[i].l!=)
v.pb(q[i].l);
}
sort(all(v));
v.erase(unique(all(v)),v.end());
for(int i=;i<m;i++){
if(q[i].l!=){
bitupdate(getid(q[i].l),);
bitupdate(getid(q[i].r)+,-);
}
else{
int ans,times = bitgetsum(getid(q[i].r));
if(times>=){
ans=;
}
else{
ans = query(q[i].r,,n,);
while(times--){
ans=floor(sqrt(ans));
}
}
printf("%d\n",ans);
}
}
return ;
}
The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H的更多相关文章
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
目录 Contest Info Solutions A. Attack B. Polynomial E. Interesting Trip F. Sequence G. Winner H. Anoth ...
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)
题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...
- The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
打网络赛 比赛前的准备工作要做好 确保 c++/java/python的编译器能用 打好模板,放在桌面 A. PERFECT NUMBER PROBLEM #include <cstdio> ...
- 2019The Preliminary Contest for ICPC China Nanchang National Invitational
The Preliminary Contest for ICPC China Nanchang National Invitational 题目一览表 考察知识点 I. Max answer 单调栈+ ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- 2019 The Preliminary Contest for ICPC China Nanchang National Invitational(A 、H 、I 、K 、M)
A. PERFECT NUMBER PROBLEM 题目链接:https://nanti.jisuanke.com/t/38220 题意: 输出前五个完美数 分析: 签到.直接百度完美数输出即可 #i ...
- ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)
题目链接:https://nanti.jisuanke.com/t/38223 题意:有一堆火柴构成了一个加减法式子,你可以把火柴重新组合,要求数字个数和原来一样多,每个数字的位数和对应原数字位数一样 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I题
Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values ...
随机推荐
- Nginx 路由重写
很多时候我们的真实路由是隐藏的,都经过重写后展现到前台,下面简单写两个我经常用到的几个: 一般在配置*.host(在http里面引入的server配置)的时候会用到每个不同网址的路由重写,每一个rew ...
- 使用jdk8 stream简化集合操作
使用stream的前提是对lambda表达式和函数式接口有一定的了解,同时对方法引用和普通传参的区别有一定的认识. stream的三大特性:1.不存储数据2.不改变源数据3.延时执行. stream优 ...
- optparser模块 与 ZIP爆破(Python)
optparser模块: 为脚本传递命令参数. 初始化: 带 Usage 选项(-h 的显示内容 Usage:): >>> from optparse import OptionPa ...
- nodejs入门API之net模块
net常用API解析以及应用 手动解析HTTP请求头 基于网络模块net与文件模块fs搭建简易的node服务 net模块部分API参数详细解析 一.net常用API解析以及简单的应用 net模块的组成 ...
- Linux Centos7配置mysql8.0数据库
本文转至:672530440 在此感谢博主,撒花!!! 本文主要从以下几个方面对自己在centos7 下安装mysql8过程做如下总结: CentOS7 安装mysql8 步骤: window下的Na ...
- 百度定位SDK 返回error code : 162 latitude : 4.9E-324 lontitude : 4.9E-324
Android应用使用百度定位SDK 返回error code : 162 latitude : 4.9E-324 lontitude : 4.9E-324 在使用百度定位SDK时遇到一个非常郁闷的问 ...
- Java基础加强-泛型
/*泛型*/ (泛型是给编译器看的) 泛型是提供给 /*javac编译器使用的*/,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型带类型说明的集合时,会去掉 "类 ...
- 为什么说Java程序员必须掌握 Spring Boot ?
Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,那么, Spring Boot 诞生的背景是什么?Spring 企业又是基于什么样的考虑创建 Spring Boot ...
- ZZNUOJ-2157: 水滴来袭-【干扰阅读-卡模糊精度1e-8的问题】
ZZNUOJ-2157: 水滴来袭 那是一个冷雨霏霏的秋天的下午,当罗辑拿着枪威胁三体文明的时候,如果过了三十秒三体人还没有同他展开谈判,罗辑就会扣动扳机即刻结束自己的生命,随后他身上的核弹控制器就会 ...
- JavaScript002,验证输入
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...