HDU5654 xiaoxin and his watermelon candy 莫队
2016-03-30 12:23
330 查看
作死一定要用莫队,优化到吐。QAQ
#include<iostream> #include<cstdio> #include<cstdlib> #include<vector> #include<cmath> #include<string> #include<algorithm> #include<set> #include<map> #include<cstring> #include<queue> #include<stack> #include<list> using namespace std; typedef long long ll; const int MAXN=200005; const ll INF=1e9; const ll mod=1e9+7; struct nod{ int x1,x2,x3; void se(int y1,int y2,int y3){ x1=y1;x2=y2;x3=y3; } bool const operator<(nod y)const{ if( x1==y.x1 && x2==y.x2 )return x3<y.x3; else if( x1==y.x1 ) return x2<y.x2; else return x1<y.x1; } }; map<nod,int> mp; struct Query{ int L,R,id,block; bool operator < (Query a) const { if(block == a.block) return R<a.R; return block<a.block; } }node[MAXN]; int ans[MAXN]; int m; int a[MAXN]; int n,unite; int num[MAXN]; int b[MAXN]; void work(){ int tmp=0; int L=1; int R=0; int tot=0;int cnt=0; memset(num,0,sizeof(num)); memset(b,0,sizeof(b)); for(int i=3;i<=n;i++){ if(a[i]>=a[i-1]&&a[i-1]>=a[i-2]){ if( mp[ nod{a[i-2],a[i-1],a[i]} ]==0 ){ mp[ nod{a[i-2],a[i-1],a[i]} ]=++cnt; } b[i]=mp[ nod{a[i-2],a[i-1],a[i]} ]; } } for(int i=0;i<m;i++){ if( node[i].L>node[i].R ){ ans[ node[i].id ]=0;continue; } while( R<node[i].R ){ R++;{ num[ b[R] ]++; if( num[ b[R] ]==1&&b[R] ){tmp++;}} } while( R>node[i].R ){ num[ b[R] ]--; if( b[R]&&num[b[R]]==0 )tmp--; R--; } while( L<node[i].L ){ num[ b[L] ]--; if(num[ b[L] ]==0&&b[L])tmp--; L++; } while( L>node[i].L ){ L--; num[ b[L] ]++; if( num[ b[L] ]==1&&b[L] )tmp++; } ans[ node[i].id ]=tmp; } } int getint(){ int t = 0 ; char c = getchar() ; while(c < '0' || c > '9') c = getchar() ; while('0' <= c && c <= '9'){ t = t*10 + c - '0' ; c = getchar() ; } return t ; } int main() { int t; scanf("%d",&t); while(t--){ mp.clear(); scanf("%d",&n); for(int i=1;i<=n;i++){ a[i]=getint(); } scanf("%d",&m); unite=(int ) sqrt(n); for(int i=0;i<m;i++){ node[i].id=i; node[i].L=getint();node[i].R=getint(); node[i].L+=2;node[i].R; node[i].block=node[i].L/unite; } sort( node,node+m ); work(); for(int i=0;i<m;i++){ printf("%d\n",ans[i]); } } return 0; }
相关文章推荐
- Oracle创建表空间、创建用户以及授权、查看权限
- Spark安装部署
- Java多线程编程基础之线程对象
- 相机拍照Camera
- java大数相乘
- LeetCode 130. Surrounded Regions
- 操作系统开发系列—1.HelloWorld ●
- hdoj2015/hdoj2016/hdoj2017
- go on
- Android AES加密算法及其实现
- Android: 解决GridView、ListView在ScrollView中出现冲突的问题
- 判断变量和常量是否存在
- JAVA中使用Scanner连续输入int和String错误的解决方案
- JSTL
- 数据挖掘之特征选择
- EL表达式隐式对象
- IOS开发之UIScrollViewDelegate详解
- 关于Class.getResource和ClassLoader.getResource的路径问题
- API基础开发学习网址
- android笔记之ListView的setEmptyView方法