hdu 4000 Fruit Ninja

来源:互联网 发布:linux 迅雷 编辑:程序博客网 时间:2024/06/02 13:10

求得XYZ,XZY 再求得XYZ,然后相减即答案 = =。。脑子笨死了,赛场卡在第5题了,这题没怎么想。

求XYZ,XZY只需求X后有多少个比它大的,求下C(n,2)

求XYZ求 Y前面有比它小的后面比它大的数,两个数乘下。

昨晚用线段树了,擦边过。。时间好长。今早试了下树状数组,才跑了100+MS。。。这差距。。


线段树

#include <set>#include <map>#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#include <string>#include <algorithm>#define MID(x,y) ( ( x + y ) >> 1 )#define L(x) ( x << 1 )#define R(x) ( x << 1 | 1 )#define FOR(i,s,t) for(int i=s; i<t; i++)#define BUG puts("here!!!")using namespace std;const int MAX = 100010;struct Tnode{// 一维线段树     int l,r,sum;    int len() { return r - l;}    int mid() { return MID(l,r);}    bool in(int ll,int rr) { return l >= ll && r <= rr; }    void lr(int ll,int rr){ l = ll; r = rr;}};Tnode node[MAX<<2];int a[MAX];void Updata_sum(int t){node[t].sum = node[L(t)].sum + node[R(t)].sum;}void Build(int t,int l,int r){node[t].lr(l,r);if( node[t].len() == 1 ){node[t].sum = 0;return ;}int mid = MID(l,r);Build(L(t),l,mid);Build(R(t),mid,r);Updata_sum(t);}void Updata(int t,int l,int r,int val){if( node[t].in(l,r) ){node[t].sum = val;return ;}if( node[t].len() == 1 ) return ;int mid = node[t].mid();if( l < mid ) Updata(L(t),l,r,val);if( r > mid ) Updata(R(t),l,r,val);Updata_sum(t);}int Query(int t,int l,int r){if( node[t].in(l,r) )return node[t].sum;if( node[t].len() == 1 ) return 0;int mid = node[t].mid();int ans = 0;if( l < mid ) ans += Query(L(t),l,r);if( r > mid ) ans += Query(R(t),l,r);return ans;}int main(){int ncases, n, ind = 1;scanf("%d", &ncases);while( ncases-- ){scanf("%d", &n);Build(1, 0, n+1);for(int i=0; i<n; i++)scanf("%d", &a[i]);__int64 ans = 0, sum = 0;Build(1, 0, n+1);for(int i=0; i<n; i++){int p = Query(1, 0, a[i]);sum += (n - i + p - a[i])*1ll*p;ans += (n - i + p - a[i])*1ll*(n - i + p - a[i] - 1)/2;Updata(1, a[i]-1, a[i], 1);}printf("Case #%d: %I64d\n", ind++, (ans - sum)%100000007);}return 0;}


树状数组

#include <set>#include <map>#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#include <string>#include <algorithm>#define MID(x,y) ( ( x + y ) >> 1 )#define L(x) ( x << 1 )#define R(x) ( x << 1 | 1 )#define FOR(i,s,t) for(int i=s; i<t; i++)#define BUG puts("here!!!")using namespace std;const int MAX = 100010;int c[MAX];int Lowbit(int x){return x & (-x);}void Updata(int x,int num)// num 可能都为1,具体问题具体分析 {int i;for(i=x; i<MAX; i+=Lowbit(i))c[i] += num;// 若num 为1,c[i]++ }int Getsum(int x)//sum的返回值的类型可能是long long ,根据题意判断 {int sum = 0,i;for(i=x; i>0; i-=Lowbit(i))sum += c[i];return sum;}int a[MAX];int main(){int ncases, n, ind = 1;scanf("%d", &ncases);while( ncases-- ){scanf("%d", &n);memset(c, 0, sizeof(c));for(int i=0; i<n; i++)scanf("%d", &a[i]);__int64 ans = 0, sum = 0;for(int i=0; i<n; i++){int p = Getsum(a[i]);sum += (n - i + p - a[i])*1ll*p;ans += (n - i + p - a[i])*1ll*(n - i + p - a[i] - 1)/2;Updata(a[i], 1);}printf("Case #%d: %I64d\n", ind++, (ans - sum)%100000007);}return 0;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做坏事被发现了怎么办 在阳台做被发现怎么办 有秘密被发现了怎么办 微店没有收到货怎么办 cf与主机连接不稳定怎么办 穿越火线与主机连接不稳定怎么办 word被锁定无法编辑怎么办 平衡车系统乱了怎么办 监控老是滴滴的响怎么办 磁盘已满 文件未保存怎么办 cocos只有代码没有项目怎么办 电脑系统管理员密码忘记了怎么办 魔兽小队不显示职业颜色怎么办 魔兽多余的橙装怎么办? f117-f6不读硬盘怎么办 中飞院飞行学生停飞了怎么办 军人对你敬礼时怎么办 小孩抱着就睡放下就醒怎么办 着火了怎么办 我的世界 生存战争2感冒了怎么办 生存战争2吐了怎么办 我的世界hqm重置怎么办 不小心打了110怎么办 我的世界皮肤有黑影怎么办 我的世界字体变大了怎么办 生锈的铁钉扎了怎么办 每天晚上窗纱上老有蝙蝠倒挂怎么办 我的世界没有痒怎么办 七日杀被ban了怎么办 吕框箱子上保护摸撕不掉怎么办 我的世界开光影卡怎么办 我的世界买不了怎么办 我的世界延迟高怎么办 我的世界过于昂贵怎么办 白色麻布染上别的颜色怎么办 印度老山檀香开裂了怎么办 专升本没过线怎么办 西安公租房小孩上学怎么办 全民k歌直播没人怎么办 在全民直播没人看怎么办 皮肤又黄又粗怎么办