比赛链接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. vuex 理解

    为什么要用vuex?页面由多个视图组成,用户操作会引视图的状态变化. 多个视图依赖于同一状态(例如:菜单导航) 来自不同视图的行为需要变更同一状态(例如:评论弹幕) vuex 的作用 为vue.js开 ...

  2. 此项目与Visual Studio的当前版本不兼容的报错

    问题再现:程序是用visual studio 2013开发的,放在本地运行报此项目与Visual Studio的当前版本不兼容.本地是visual studio 2010. 解决办法: <1&g ...

  3. (二十)SpringBoot之集成mybatis:使用mybatis注解

    一.使用mybatis注解的集成 1.1 引入maven依赖 <dependencies> <dependency> <groupId>org.springfram ...

  4. (八)SpringBoot之freeMarker基本使用

    一.案例 1.1 pom.xml <dependencies> <!-- 除去logback支持 --> <dependency> <groupId>o ...

  5. winform PictureBox图片上动态添加Label或其他控件

    效果图: 代码: //分页或者多次加载时,需要删除之前产生的lable等控件 ; tabID < ; tabID++) { foreach (Control control in this.ta ...

  6. Apache Flink 任意jar包上传漏洞

    目前受影响版本:version 1.9.1(最新),官方未发布补丁. Apache Flink仪表板- >上传恶意的JAR- >提交新工作- >getshell 生成jar包,用nc ...

  7. secureCRT 在本地和远程传输文件方式

    securecrt 按下ALT+P就开启新的会话 进行ftp操作.输入:help命令,显示该FTP提供所有的命令          pwd:  查询linux主机所在目录(也就是远程主机目录)     ...

  8. iOS开发 iOS10推送必看(基础篇)-转

    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...

  9. Array+DP leetcode-11.装更多的水

    11. Container With Most Water 题面 Given n non-negative integers a1, a2, ..., an , where each represen ...

  10. shell取消键盘回显

    使用下面这个命令取消回显 stty -echo   使用下面这个命令打开回显   stty echo