比赛链接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的更多相关文章

  1. 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 ...

  2. 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+ ...

  3. The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest

    打网络赛 比赛前的准备工作要做好 确保 c++/java/python的编译器能用 打好模板,放在桌面 A. PERFECT NUMBER PROBLEM #include <cstdio> ...

  4. 2019The Preliminary Contest for ICPC China Nanchang National Invitational

    The Preliminary Contest for ICPC China Nanchang National Invitational 题目一览表 考察知识点 I. Max answer 单调栈+ ...

  5. 计蒜客 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 ...

  6. 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 ...

  7. ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)

    题目链接:https://nanti.jisuanke.com/t/38223 题意:有一堆火柴构成了一个加减法式子,你可以把火柴重新组合,要求数字个数和原来一样多,每个数字的位数和对应原数字位数一样 ...

  8. The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...

  9. 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 ...

随机推荐

  1. Nginx 路由重写

    很多时候我们的真实路由是隐藏的,都经过重写后展现到前台,下面简单写两个我经常用到的几个: 一般在配置*.host(在http里面引入的server配置)的时候会用到每个不同网址的路由重写,每一个rew ...

  2. 使用jdk8 stream简化集合操作

    使用stream的前提是对lambda表达式和函数式接口有一定的了解,同时对方法引用和普通传参的区别有一定的认识. stream的三大特性:1.不存储数据2.不改变源数据3.延时执行. stream优 ...

  3. optparser模块 与 ZIP爆破(Python)

    optparser模块: 为脚本传递命令参数. 初始化: 带 Usage 选项(-h 的显示内容 Usage:): >>> from optparse import OptionPa ...

  4. nodejs入门API之net模块

    net常用API解析以及应用 手动解析HTTP请求头 基于网络模块net与文件模块fs搭建简易的node服务 net模块部分API参数详细解析 一.net常用API解析以及简单的应用 net模块的组成 ...

  5. Linux Centos7配置mysql8.0数据库

    本文转至:672530440 在此感谢博主,撒花!!! 本文主要从以下几个方面对自己在centos7 下安装mysql8过程做如下总结: CentOS7 安装mysql8 步骤: window下的Na ...

  6. 百度定位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时遇到一个非常郁闷的问 ...

  7. Java基础加强-泛型

    /*泛型*/ (泛型是给编译器看的) 泛型是提供给 /*javac编译器使用的*/,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型带类型说明的集合时,会去掉 "类 ...

  8. 为什么说Java程序员必须掌握 Spring Boot ?

    Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,那么, Spring Boot 诞生的背景是什么?Spring 企业又是基于什么样的考虑创建 Spring Boot ...

  9. ZZNUOJ-2157: 水滴来袭-【干扰阅读-卡模糊精度1e-8的问题】

    ZZNUOJ-2157: 水滴来袭 那是一个冷雨霏霏的秋天的下午,当罗辑拿着枪威胁三体文明的时候,如果过了三十秒三体人还没有同他展开谈判,罗辑就会扣动扳机即刻结束自己的生命,随后他身上的核弹控制器就会 ...

  10. JavaScript002,验证输入

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...