whu oj 1551 Pairs (莫队算法)
2015-12-20 08:38
381 查看
题目链接
题目大意:
给出的询问,求出这个区间的里 差小于等于 2 的数字的对数。
思路分析:
莫队算法。
然后分析一下。
假设添加了一个数字。那么就要加它旁边相差为2 的数字的和。
反之降低一个。就要降低相差为2 的数字的和。再减去自己这个1.。
题目大意:
给出的询问,求出这个区间的里 差小于等于 2 的数字的对数。
思路分析:
莫队算法。
然后分析一下。
假设添加了一个数字。那么就要加它旁边相差为2 的数字的和。
反之降低一个。就要降低相差为2 的数字的和。再减去自己这个1.。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #define maxn 100005 using namespace std; int app[maxn]; int save[maxn]; int pos[maxn]; struct foo { int l,r,index; int ans; bool operator < (const foo &cmp)const { if(pos[l] == pos[cmp.l]) return r<cmp.r; return pos[l]<pos[cmp.l]; } }Q[maxn]; bool cmp_id(const foo &a, const foo &b) { return a.index < b.index; } void debug() { for(int i=0;i<=7;i++) printf("%d ",app[i]); puts(""); } void modify(int p,int &ans,int add) { int tot=0; for(int i=max(save[p]-2,0);i<=save[p]+2;i++) { tot+=app[i]; } if(add>0)ans+=tot; else ans-=tot-1; app[save[p]]+=add; } int main() { int n,m; int cas=1; while(scanf("%d%d",&n,&m)!=EOF) { int SIZE=(int)sqrt(1.0*n); memset(app,0,sizeof app); for(int i=1;i<=n;i++) { scanf("%d",&save[i]); pos[i]=(i-1)/SIZE+1; } for(int i=0;i<m;i++) { scanf("%d%d",&Q[i].l,&Q[i].r); Q[i].index=i; } sort(Q,Q+m); int ans=0; for(int i=0,l=1,r=0;i<m;i++) { if(r<Q[i].r) { for(r=r+1;r<=Q[i].r;r++) modify(r,ans,1); r--; } if(r>Q[i].r) { for(;r>Q[i].r;r--) modify(r,ans,-1); } if(l<Q[i].l) { for(;l<Q[i].l;l++) modify(l,ans,-1); } if(l>Q[i].l) { for(l=l-1;l>=Q[i].l;l--) modify(l,ans,1); l++; } Q[i].ans=ans; } sort(Q,Q+m,cmp_id); printf("Case %d:\n",cas++); for(int i=0;i<m;i++) printf("%d\n",Q[i].ans); } return 0; }
相关文章推荐
- Develop--Training(五)Getting Started--Saving Data
- Viterbi training
- Daily Scrum NO.8
- 换行符‘\n’和回车符‘\r’ http://blog.csdn.net/silyvin/article/details/7275037
- rails use devise
- [leetcode]Climbing Stairs
- [leetcode] 319. Bulb Switcher
- RAID
- WARN SettingsFactory:140 - Could not obtain connection metadata
- Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,相似图片浏览器
- error=11, Resource temporarily unavailable
- 【LeetCode】172. Factorial Trailing Zeroes
- RAID
- Naive Bayesian(朴素贝叶斯)
- Organize Your Train part II【POJ--3007】【平衡二叉树】
- RabbitMQ消息队列1: Detailed Introduction 详细介绍
- POJ1671--Painer'sProblem
- Foxmail重复收取邮件解决方案
- foxmail重复收取邮件解决办法及删除重复邮件办法
- 线程同步(同步对象、同步访问对象)http://blog.csdn.net/akof1314/article/details/5764200