这题显然需要莫队,然后我就想着用非旋转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相关推荐

  1. 【动态规划】简单背包问题II

    问题 J: [动态规划]简单背包问题II 时间限制: 1 Sec  内存限制: 64 MB 提交: 127  解决: 76 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼:& ...

  2. 【项目】小帽商城 II(一)

    小帽商城 II 第一章 分布式基础 一.项目简介 1. 项目背景 1.1 电商模式 市面上有 5 种常见的电商模式 B2B.B2C.C2B.C2C.O2O: 1.1.1 B2B 模式 B2B (Bus ...

  3. 【转载】基于Nios II的DMA传输总结(附源码)

    转载:http://blog.ednchina.com/chactor/185802/message.aspx#92932 最近练了一段时间的DMA传输,现做如下的总结,分享自己获得心得以及遇到的一些 ...

  4. 【Java】Fibonacci数列编程实现

    编程实现--递归/非递归 public class Fibonacci {private static int fibonacci1(int n) {if(n <= 1) {return 1;} ...

  5. 【codevs1250】Fibonacci数列,矩阵乘法入门

    Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2 ...

  6. 【原创】基于NIOS II的ADS1256 SPI驱动

    /*********************************说明**********************************/             在SOPC里面SPI设置如下: ...

  7. C++初阶习题(牛客)【4】Fibonacci数列

    题目描述 牛客网链接 Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数 ...

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

  9. 【Leetcode】213. 打家劫舍II(House Robber II)

    Leetcode - 213 House Robber II (Medium) 题目描述:一个小偷沿着一条环形的街偷窃,给定数组表示每家屋子的金额,如果偷窃连续的两间屋子就会触发警报,求在不触发警报的 ...

  10. 【LeetCode】Basic Calculator II

    Basic Calculator II 问题描述 Implement a basic calculator to evaluate a simple expression string. The ex ...

最新文章

  1. python3 socket shutdown 简介
  2. 图解matlab基本操作
  3. Cordova环境搭建
  4. X 039 0203 039 mysql_2020年寒假假期总结0203
  5. 计算机设备间使用面积,【IBE】综合布线设计中的常用计算公式
  6. oracle result_cache_max_size,oracle database 11g新特性之设置result cache-Oracle
  7. 独立主机如何,不要被人忽悠了
  8. 域名该怎样选_如何正确选择域名?应该考虑哪些因素?
  9. 【第二周】结对编程(宫丽君和林莉):四则运算
  10. gradle maven_Gradle vs Maven
  11. 听说……明天上线?!
  12. vmware vSAN 入门
  13. VM在使用过程中开机频繁黑屏(VM14版本问题导致的,频繁开机黑屏)
  14. 教你如何更好的用ubuntu
  15. Hacker(15)----嗅探原理
  16. 不属于项目管理常用计算机模块的事,管理信息系统题库及答案(4)
  17. 注销在html中怎么,关于注销页面
  18. 智力杂志智力杂志社智力编辑部2023年第6期目录
  19. java闭锁_Java闭锁—CountDownLatch
  20. Tuxera NTFS for Mac:验证密钥时出错及彻底删除Tuxera ntfs

热门文章

  1. 【转载】C++编码规范与指导
  2. 计算机英语阅读路线,计算机经典英语短文阅读
  3. 路由器第三方固件的刷入与调试
  4. 产品设计学习(一)——梁宁产品思维大纲
  5. Nginx负载均衡配置实例详解(转发学习)留给未来需要的自己
  6. 获取必应每日一图网址
  7. 五分钟看懂vue路由守卫
  8. 效果图渲染器详解,出图最快的竟然是它!
  9. python除法运算定律有哪些_小学数学最重要的7个运算定律,都在这里了
  10. 拉结尔微信开到多少服务器了,拉结尔微信渠道服