tsinsen-A1206 小Z的袜子(莫队算法)
来源:互联网 发布:软件企业认定条件 编辑:程序博客网 时间:2024/06/03 02:27
题目:
http://www.tsinsen.com/A1206题意:
有许多袜子,每个有自己的颜色,排成一排。给出许多区间询问,求每个区间中任取两个袜子的颜色相同的概率,分数表示。
思路:
区间问题,按理说此类问题大多是应该是线段树,这道题是莫队算法的模版例题。
先说莫队算法就是把所有的区间状态转换成二维坐标系上的点,然后通过求曼哈顿距离最小生成树完成所有状态之间的转移路径,从而求出所有询问。
对于所有可以通过(x,y)直接求出(x,y+1) (x,y-1) (x+1,y) (x-1,y)四种状态的区间问题都可以通过这种方法找到理论最快的求解顺序,其实还是暴力求解所有询问,但是顺序不同速度就快了。
但真要写最小生成树求解实在是麻烦了些:点击打开链接
所以在网上找到了神犇写的分块的写法: 点击打开链接
把所有询问按照l坐标分块成sqrt(n)份再排序求解,因为有序并且分块时间复杂度就是O(n*sqrt(n))。
计算时间复杂度时是x,y分别计算加在一起的,所以是O(n*sqrt(n))
在转移上比最小生成树的写法慢,但是不需要建图求树,所以总复杂度是一样的。
总的来说莫队算法这种区间问题抽象成点按序求解的思想很神,适用于大量区间不更新的问题。
代码:
//kopyh#include <bits/stdc++.h>#define INF 0x3f3f3f3f3f3f3f3f#define MOD 1000000007#define N 112345using namespace std;long long n,m,sum,res,flag;long long num[N],a[N],b[N],col[N];struct node{ long long l,r,id,pl; friend bool operator < (node a, node b) { if(a.pl == b.pl) return a.r < b.r; return a.pl < b.pl; }}q[N];long long gcd(long long x,long long y){ return y?gcd(y,x%y):x; }void updata(long long pos, int flag){ res-=num[col[pos]]*num[col[pos]]; num[col[pos]]+=flag; res+=num[col[pos]]*num[col[pos]];}int main(){ long long i,j,k,cas,T,t,x,y,z,l,r; while(scanf("%I64d%I64d",&n,&m)!=EOF) { memset(num,0,sizeof(num)); for(i=1;i<=n;i++) scanf("%I64d",&col[i]); for(i=0;i<m;i++) { scanf("%I64d%I64d",&q[i].l,&q[i].r); q[i].id=i; q[i].pl=(q[i].l-1)/(ceil(sqrt(1.0*n))); } sort(q,q+m); l=1;r=res=0; for(i=0;i<m;i++) { if(q[i].l == q[i].r) { a[q[i].id] = 0; b[q[i].id] = 1; continue; } for(j=min(l,q[i].l);j<max(l,q[i].l);j++) updata(j,(l>q[i].l?1:-1)); for(j=max(r,q[i].r);j>min(r,q[i].r);j--) updata(j,(r>q[i].r?-1:1)); r = q[i].r; l = q[i].l; x = res-(q[i].r-q[i].l+1); y = (q[i].r-q[i].l+1)*(q[i].r-q[i].l); z = gcd(x,y); a[q[i].id] = x/z; b[q[i].id] = y/z; } for(i=0;i<m;i++) printf("%I64d/%I64d\n",a[i],b[i]); } return 0;}
0 0
- tsinsen-A1206 小Z的袜子(莫队算法)
- 清橙A1206 小Z的袜子(莫队算法)
- 【清橙 A1206】小Z的袜子(莫队算法)
- 清橙A1206 小Z的袜子(莫队算法模板)
- 清橙 A1206 小Z的袜子(莫队算法)
- [bzoj 2038 OR 清橙A1206 小Z的袜子]莫队算法
- 莫队学习总结(一) :清橙A1206.小Z的袜子 && CF 86D
- 【莫队算法】小z的袜子
- 小Z的袜子(莫队算法)
- 小Z的袜子【莫队算法】
- 小Z的袜子【莫队算法】
- 莫队算法 小Z的袜子
- 【BZOJ2038】小Z的袜子,第一次的莫队算法
- 【BZOJ】【P2038】【小Z的袜子】【题解】【莫队算法】
- 小Z的袜子 (莫队算法)
- [2009国家集训队]小Z的袜子--莫队算法
- 线性莫队算法 BZOJ 2038 小Z的袜子
- [BZOJ2038]2009集训队 小Z的袜子|莫队算法
- 项目的复习(一)
- 剑指offer-面试题24.二叉搜索树的后序遍历序列
- 各种常见排序函数的C++代码
- cocos2d-x 文本标签的用法
- 点击Back按钮删除Fragment
- tsinsen-A1206 小Z的袜子(莫队算法)
- 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult
- 剑指offer-面试题25.二叉树中和为某一值的路径
- 栈
- 记一次失败的kaggle比赛(2):构造新特征、特征筛选
- C#中的序列化
- DBeaver数据库管理工具使用体验
- [疯狂Java]SQL-select:查询列改名、查询常量、去重、升/降序排列
- iOS开发- NSNumber处理