【Codeforces633H】Fibonacci-ish II
这题显然需要莫队,然后我就想着用非旋转treaptreap骗过去,然后光荣TLE了。(感觉我复杂度似乎也是错的可能)
#include <bits/stdc++.h>
#define gc getchar()
#define ll long long
#define N 30009
#define rd(x) ((rand()*23333+rand())%(x))
using namespace std;
int n,mod,a[N],f[N],Q,lim,pos[N],Ans[N],now[N];
map<int,int> mp;
struct qry
{int l,r,id;bool operator <(const qry &rhs) const{return pos[l]<pos[rhs.l]||pos[l]==pos[rhs.l]&&r<rhs.r;}
}q[N];
struct Treap
{struct node{node *lson,*rson;int key,val,sum1,sum2,add,num,size;node(int x,int y){add=0,num=y;sum2=(ll)x*f[y-1]%mod;val=x;sum1=(ll)x*f[y]%mod;key=rd(1000000000);lson=rson=NULL;size=1;}};typedef node * pnode;pnode root,L,R,rest;void init(){root=NULL;}void up(pnode now){now->sum1=(ll)now->val%mod*f[now->num]%mod;if (now->lson) now->sum1+=now->lson->sum1;now->sum1%=mod;if (now->rson) now->sum1+=now->rson->sum1;now->sum1%=mod;now->sum2=(ll)now->val%mod*f[now->num-1]%mod;if (now->lson) now->sum2+=now->lson->sum2;now->sum2%=mod;if (now->rson) now->sum2+=now->rson->sum2;now->sum2%=mod;now->size=1;if (now->lson) now->size+=now->lson->size;if (now->rson) now->size+=now->rson->size;}void down(pnode now){if (now->add>0){if (now->lson){now->lson->add+=now->add;now->lson->num+=now->add;int t1=now->lson->sum1,t2=now->lson->sum2;now->lson->sum1=((ll)f[now->add+1]*t1%mod+(ll)f[now->add]*t2%mod)%mod;now->lson->sum2=((ll)f[now->add]*t1%mod+(ll)f[now->add-1]*t2%mod)%mod;}if (now->rson){now->rson->add+=now->add;now->rson->num+=now->add;int t1=now->rson->sum1,t2=now->rson->sum2;now->rson->sum1=((ll)f[now->add+1]*t1%mod+(ll)f[now->add]*t2%mod)%mod;now->rson->sum2=((ll)f[now->add]*t1%mod+(ll)f[now->add-1]*t2%mod)%mod;}now->add=0;}if (now->add<0){if (now->lson){now->lson->add+=now->add;now->lson->num+=now->add;int t1=now->lson->sum1,t2=now->lson->sum2;now->lson->sum1=((ll)f[-now->add-1]*t1%mod-(ll)f[-now->add]*t2%mod+mod)%mod;if ((-now->add)&1) now->lson->sum1=(mod-now->lson->sum1)%mod;now->lson->sum2=((ll)f[-now->add+1]*t2%mod-(ll)f[-now->add]*t1%mod+mod)%mod;if ((-now->add)&1) now->lson->sum2=(mod-now->lson->sum2)%mod;}if (now->rson){now->rson->add+=now->add;now->rson->num+=now->add;int t1=now->rson->sum1,t2=now->rson->sum2;now->rson->sum1=((ll)f[-now->add-1]*t1%mod-(ll)f[-now->add]*t2%mod+mod)%mod;if ((-now->add)&1) now->rson->sum1=(mod-now->rson->sum1)%mod;now->rson->sum2=((ll)f[-now->add+1]*t2%mod-(ll)f[-now->add]*t1%mod+mod)%mod;if ((-now->add)&1) now->rson->sum2=(mod-now->rson->sum2)%mod;}now->add=0;}}pnode merge(pnode L,pnode R){if (!L) return R;if (!R) return L;if (L->key>R->key){down(L);L->rson=merge(L->rson,R);up(L);return L;}else{down(R);R->lson=merge(L,R->lson);up(R);return R;}}void split(pnode now,int val,pnode &L,pnode &R){if (!now){L=R=NULL;return;}down(now);if (val<=now->val){split(now->lson,val,L,now->lson);R=now;up(R);return;}else{split(now->rson,val,now->rson,R);L=now;up(L);return;}}void ins(int x){split(root,x,L,R);if (R){R->add++;R->num++;int t=(R->sum1+R->sum2)%mod;R->sum2=R->sum1;R->sum1=t;}root=merge(L,new node(x,L?(L->size+1):1));root=merge(root,R);}void del(int x){split(root,x,L,R);split(R,x+1,rest,R);if (R){R->add--;R->num--;int t=(R->sum1-R->sum2+mod)%mod;R->sum1=R->sum2;R->sum2=t;}root=merge(L,R);}
}tr;
int read()
{int x=1;char ch;while (ch=gc,ch<'0'||ch>'9') if (ch=='-') x=-1;int s=ch-'0';while (ch=gc,ch>='0'&&ch<='9') s=s*10+ch-'0';return s*x;
}
void Insert(int x)
{tr.ins(x);
}
void Delete(int x)
{tr.del(x);
}
void add(int x)
{if (!mp[x]) Insert(x);mp[x]++;
}
void del(int x)
{mp[x]--;if (!mp[x]) Delete(x);
}
int get_Ans()
{return tr.root->sum1;
}
int main()
{n=read(),mod=read();//n=30000,mod=30000;for (int i=1;i<=n;i++) a[i]=read();//a[i]=i;f[0]=0,f[1]=f[2]=1;for (int i=3;i<=n;i++) f[i]=(f[i-1]+f[i-2])%mod;Q=read();//Q=30000;for (int i=1;i<=Q;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;//q[i].l=rand()%n+1,q[i].r=q[i].l+(rand()%(n-q[i].l+1)),q[i].id=i;lim=(int)sqrt(n);for (int i=1;i<=n;i++) pos[i]=i/lim+1;sort(q+1,q+Q+1);tr.init();int l=1,r=0;for (int i=1;i<=Q;i++){while (r<q[i].r) add(a[++r]);while (l>q[i].l) add(a[--l]);while (r>q[i].r) del(a[r--]);while (l<q[i].l) del(a[l++]);Ans[q[i].id]=get_Ans();//cout<<Ans[q[i].id]<<" "<<Get_Ans()<<endl;}for (int i=1;i<=Q;i++) printf("%d\n",Ans[i]);return 0;
}
然后听说这道题可以线段树,,然后听说O(n2)O(n^2)就可以过???
所以果断水。
#include <bits/stdc++.h>
#define gc getchar()
#define ll long long
#define N 30009
#define rd(x) ((rand()*23333+rand())%(x))
using namespace std;
int n,mod,a[N],f[N],Q,lim,pos[N],Ans[N],now[N];
map<int,int> mp;
struct qry
{int l,r,id;bool operator <(const qry &rhs) const{return pos[l]<pos[rhs.l]||pos[l]==pos[rhs.l]&&r<rhs.r;}
}q[N];
struct Treap
{struct node{node *lson,*rson;int key,val,sum1,sum2,add,num,size;node(int x,int y){add=0,num=y;sum2=(ll)x*f[y-1]%mod;val=x;sum1=(ll)x*f[y]%mod;key=rd(1000000000);lson=rson=NULL;size=1;}};typedef node * pnode;pnode root,L,R,rest;void init(){root=NULL;}void up(pnode now){now->sum1=(ll)now->val%mod*f[now->num]%mod;if (now->lson) now->sum1+=now->lson->sum1;now->sum1%=mod;if (now->rson) now->sum1+=now->rson->sum1;now->sum1%=mod;now->sum2=(ll)now->val%mod*f[now->num-1]%mod;if (now->lson) now->sum2+=now->lson->sum2;now->sum2%=mod;if (now->rson) now->sum2+=now->rson->sum2;now->sum2%=mod;now->size=1;if (now->lson) now->size+=now->lson->size;if (now->rson) now->size+=now->rson->size;}void down(pnode now){if (now->add>0){if (now->lson){now->lson->add+=now->add;now->lson->num+=now->add;int t1=now->lson->sum1,t2=now->lson->sum2;now->lson->sum1=((ll)f[now->add+1]*t1%mod+(ll)f[now->add]*t2%mod)%mod;now->lson->sum2=((ll)f[now->add]*t1%mod+(ll)f[now->add-1]*t2%mod)%mod;}if (now->rson){now->rson->add+=now->add;now->rson->num+=now->add;int t1=now->rson->sum1,t2=now->rson->sum2;now->rson->sum1=((ll)f[now->add+1]*t1%mod+(ll)f[now->add]*t2%mod)%mod;now->rson->sum2=((ll)f[now->add]*t1%mod+(ll)f[now->add-1]*t2%mod)%mod;}now->add=0;}if (now->add<0){if (now->lson){now->lson->add+=now->add;now->lson->num+=now->add;int t1=now->lson->sum1,t2=now->lson->sum2;now->lson->sum1=((ll)f[-now->add-1]*t1%mod-(ll)f[-now->add]*t2%mod+mod)%mod;if ((-now->add)&1) now->lson->sum1=(mod-now->lson->sum1)%mod;now->lson->sum2=((ll)f[-now->add+1]*t2%mod-(ll)f[-now->add]*t1%mod+mod)%mod;if ((-now->add)&1) now->lson->sum2=(mod-now->lson->sum2)%mod;}if (now->rson){now->rson->add+=now->add;now->rson->num+=now->add;int t1=now->rson->sum1,t2=now->rson->sum2;now->rson->sum1=((ll)f[-now->add-1]*t1%mod-(ll)f[-now->add]*t2%mod+mod)%mod;if ((-now->add)&1) now->rson->sum1=(mod-now->rson->sum1)%mod;now->rson->sum2=((ll)f[-now->add+1]*t2%mod-(ll)f[-now->add]*t1%mod+mod)%mod;if ((-now->add)&1) now->rson->sum2=(mod-now->rson->sum2)%mod;}now->add=0;}}pnode merge(pnode L,pnode R){if (!L) return R;if (!R) return L;if (L->key>R->key){down(L);L->rson=merge(L->rson,R);up(L);return L;}else{down(R);R->lson=merge(L,R->lson);up(R);return R;}}void split(pnode now,int val,pnode &L,pnode &R){if (!now){L=R=NULL;return;}down(now);if (val<=now->val){split(now->lson,val,L,now->lson);R=now;up(R);return;}else{split(now->rson,val,now->rson,R);L=now;up(L);return;}}void ins(int x){split(root,x,L,R);if (R){R->add++;R->num++;int t=(R->sum1+R->sum2)%mod;R->sum2=R->sum1;R->sum1=t;}root=merge(L,new node(x,L?(L->size+1):1));root=merge(root,R);}void del(int x){split(root,x,L,R);split(R,x+1,rest,R);if (R){R->add--;R->num--;int t=(R->sum1-R->sum2+mod)%mod;R->sum1=R->sum2;R->sum2=t;}root=merge(L,R);}
}tr;
int read()
{int x=1;char ch;while (ch=gc,ch<'0'||ch>'9') if (ch=='-') x=-1;int s=ch-'0';while (ch=gc,ch>='0'&&ch<='9') s=s*10+ch-'0';return s*x;
}
void Insert(int x)
{tr.ins(x);
}
void Delete(int x)
{tr.del(x);
}
void add(int x)
{if (!mp[x]) Insert(x);mp[x]++;
}
void del(int x)
{mp[x]--;if (!mp[x]) Delete(x);
}
int get_Ans()
{return tr.root->sum1;
}
int main()
{n=read(),mod=read();//n=30000,mod=30000;for (int i=1;i<=n;i++) a[i]=read();//a[i]=i;f[0]=0,f[1]=f[2]=1;for (int i=3;i<=n;i++) f[i]=(f[i-1]+f[i-2])%mod;Q=read();//Q=30000;for (int i=1;i<=Q;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;//q[i].l=rand()%n+1,q[i].r=q[i].l+(rand()%(n-q[i].l+1)),q[i].id=i;lim=(int)sqrt(n);for (int i=1;i<=n;i++) pos[i]=i/lim+1;sort(q+1,q+Q+1);tr.init();int l=1,r=0;for (int i=1;i<=Q;i++){while (r<q[i].r) add(a[++r]);while (l>q[i].l) add(a[--l]);while (r>q[i].r) del(a[r--]);while (l<q[i].l) del(a[l++]);Ans[q[i].id]=get_Ans();//cout<<Ans[q[i].id]<<" "<<Get_Ans()<<endl;}for (int i=1;i<=Q;i++) printf("%d\n",Ans[i]);return 0;
}
【Codeforces633H】Fibonacci-ish II相关推荐
- 【动态规划】简单背包问题II
问题 J: [动态规划]简单背包问题II 时间限制: 1 Sec 内存限制: 64 MB 提交: 127 解决: 76 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼:& ...
- 【项目】小帽商城 II(一)
小帽商城 II 第一章 分布式基础 一.项目简介 1. 项目背景 1.1 电商模式 市面上有 5 种常见的电商模式 B2B.B2C.C2B.C2C.O2O: 1.1.1 B2B 模式 B2B (Bus ...
- 【转载】基于Nios II的DMA传输总结(附源码)
转载:http://blog.ednchina.com/chactor/185802/message.aspx#92932 最近练了一段时间的DMA传输,现做如下的总结,分享自己获得心得以及遇到的一些 ...
- 【Java】Fibonacci数列编程实现
编程实现--递归/非递归 public class Fibonacci {private static int fibonacci1(int n) {if(n <= 1) {return 1;} ...
- 【codevs1250】Fibonacci数列,矩阵乘法入门
Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2 ...
- 【原创】基于NIOS II的ADS1256 SPI驱动
/*********************************说明**********************************/ 在SOPC里面SPI设置如下: ...
- C++初阶习题(牛客)【4】Fibonacci数列
题目描述 牛客网链接 Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数 ...
- leetcode【51-52】N-Queens N-Queens II
问题描述: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two q ...
- 【Leetcode】213. 打家劫舍II(House Robber II)
Leetcode - 213 House Robber II (Medium) 题目描述:一个小偷沿着一条环形的街偷窃,给定数组表示每家屋子的金额,如果偷窃连续的两间屋子就会触发警报,求在不触发警报的 ...
- 【LeetCode】Basic Calculator II
Basic Calculator II 问题描述 Implement a basic calculator to evaluate a simple expression string. The ex ...
最新文章
- python3 socket shutdown 简介
- 图解matlab基本操作
- Cordova环境搭建
- X 039 0203 039 mysql_2020年寒假假期总结0203
- 计算机设备间使用面积,【IBE】综合布线设计中的常用计算公式
- oracle result_cache_max_size,oracle database 11g新特性之设置result cache-Oracle
- 独立主机如何,不要被人忽悠了
- 域名该怎样选_如何正确选择域名?应该考虑哪些因素?
- 【第二周】结对编程(宫丽君和林莉):四则运算
- gradle maven_Gradle vs Maven
- 听说……明天上线?!
- vmware vSAN 入门
- VM在使用过程中开机频繁黑屏(VM14版本问题导致的,频繁开机黑屏)
- 教你如何更好的用ubuntu
- Hacker(15)----嗅探原理
- 不属于项目管理常用计算机模块的事,管理信息系统题库及答案(4)
- 注销在html中怎么,关于注销页面
- 智力杂志智力杂志社智力编辑部2023年第6期目录
- java闭锁_Java闭锁—CountDownLatch
- Tuxera NTFS for Mac:验证密钥时出错及彻底删除Tuxera ntfs