比赛链接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. 列表初始化(list initialization)

    列表初始化啊就是大括号来初始化: 列表初始化的好处:

  2. 时间格式_java

    @Test public void testDate(){ Date date=new Date(); System.out.println(date); /*日期格式*/ DateFormat df ...

  3. dockerfile相关命令

    官方dockerfile:https://github.com/play-with-docker/play-with-docker 可以根据一直的镜像,学习dockerfile的编写 dockerfi ...

  4. 日志(log4j)

    log4j测试代码如下: package com.learn.test; import org.apache.log4j.Logger; public class Test { public stat ...

  5. web.xml 转 学习!http://www.cnblogs.com/wkrbky/p/5929943.html

    1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在web.xml配置监听器ContextLoaderListener(l ...

  6. 关于微信小程序使用watch监听数据变化的方法

    众所周知,Vue中,可以使用监听属性 watch来观察和响应 Vue 实例上的数据变化,那么小程序能不能实现这一点呢? 监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一个方法 ...

  7. 数组的新API

    话不多数,直接上代码: 第一个输出1,2,3,4,5 在函数体中第一个console依次输出1,2,3,4,5 然后再将里面的内容逐个+1,所以第二个输出值为:2,3,4,5,6 但是这都不会改变原数 ...

  8. JoinableQueue类与线程

    生产者消费者的问题及其解决办法 问题 在之前的生产者消费者模型中,生产者和消费者只有一个, 那么生产者往队列里put几次,消费者就get几次,但是存在一个问题, 生产者不一定只有一个,消费者也不一定只 ...

  9. vue学习(4)-组件的创建,父子组件传值,$refs

    模块化:代码逻辑 组件化:UI 组件的创建:1.

  10. jvm系列(七):jvm调优

    转自:https://www.cnblogs.com/ityouknow/p/6437037.html 16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其 ...