牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)

https://www.nowcoder.com/acm/contest/38/E

题意:

思路:

树状数组维护。从大佬那里学习了如何处理爆long long的方法。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn = 1000000+100;
 8
 9 int n;
10 int a[maxn],b[maxn];
11 ll c[maxn];
12
13 int lowbit(int x)
14 {
15     return x&(-x);
16 }
17
18 void add(int x ,int d)
19 {
20     while(x<maxn)
21     {
22         c[x] += d;
23         x += lowbit(x);
24     }
25 }
26
27 ll sum(int x)
28 {
29     ll ret = 0;
30     while(x>0)
31     {
32         ret += c[x];
33         x -= lowbit(x);
34     }
35     return ret;
36 }
37
38 int main()
39 {
40     //freopen("in.txt","r",stdin);
41     scanf("%d",&n);
42     for(int i=1;i<=n;i++)
43     {
44         scanf("%d",&a[i]);
45         b[i] = a[i];
46     }
47     sort(b+1,b+n+1);
48     int num = unique(b+1,b+n+1)-(b+1);
49     ll ans1 = 0, ans2 = 0;
50     ll mx = 1e18;
51     for(int i=1;i<=n;i++)
52     {
53         a[i] = lower_bound(b+1,b+n+1,a[i])-(b+1);
54         a[i]++;
55         ans1 += (ll)(n-i+1)*(sum(n)-sum(a[i]));
56         if(ans1>=mx)  ans2 += ans1/mx, ans1%=mx;
57         add(a[i],i);
58     }
59     if(ans2)  printf("%lld%018lld\n",ans2,ans1);
60     else printf("%lld\n",ans1);
61     return 0;
62 }
时间: 2024-08-30 00:30:06

牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)的相关文章

牛客练习赛9 F - 珂朵莉的约数

题目描述 珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 输入描述: 第一行两个正整数n,m第二行一个长为n的序列之后m行每行两个数l和r 输出描述: 对于每个询问,输出一个整数表示答案 示例1 输入 5 5 64 2 18 9 100 1 5 2 4 2 3 1 4 3 4 输出 165 15 9 45 10 备注: 对于100%的数据,有n , m <= 100000 , a[i] <= 100

牛客练习赛7E 珂朵莉的数列

题意:求所有子区间的逆序数对数之和 题解:线段树维护,对于每一对逆序数(l,r)属于l*(n-r+1)个区间,计算每一对对结果的贡献即可,可用树状数组维护,sum维护(n-r+1),按逆序数那样操作 这题最狗的地方是爆longlong,java又超时...,用了一个小技巧,避免爆longlong #include<bits/stdc++.h> #define fi first #define se second #define ll long long #define ull unsigned

AcWing:244. 谜一样的牛(树状数组 + 二分)

有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有AiAi头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整数n. 第2..n行:每行输入一个整数AiAi,第i行表示第i头牛前面有AiAi头牛比它低.(注意:因为第1头牛前面没有牛,所以并没有将它列出) 输出格式 输出包含n行,每行输出一个整数表示牛的身高. 第i行输出第i头牛的身高. 数据范围 1≤n≤1051≤n≤105 输入样例: 5 1 2 1 0 输出样例:

牛客练习赛11 B trie树+拓扑判环 E 分治求平面最近点对

牛客练习赛11 B  假的字符串题意:给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们. tags:好题 对于一个字符串, 1]如有其它字符串是它的前缀,那肯定不可能.这个直接用字典树处理就可以. 2]但如果以这个字符串为最小,怎么判定其它字符串不会矛盾呢? 其实矛盾的情况详细一点说是: 比如要以  abcd 为最小, 但又有另一个字符串 aba ,这就矛盾了. 对这种情况,在跑字典树的时候,我们对有相同父亲结点的多个儿

[SHOI2015]脑洞治疗仪(线段树?珂朵莉树)

题面 这道题超级可爱呢,珂朵莉最可爱了,不,小哀才是最可爱的呢 很好的题,可以考虑用线段树维护,hale表示线段树思路很难,而且难打,不如滚去写珂朵莉树哦 对于操作一:直接将set修改插入即可 对于操作三:最大连续子段和(线段树里面是这样叫的吧)维护即可 对于操作二:我们发现可以考虑先将这段区间里面的1 全部取出来,然后暴力合并区间为0,插入会set里面 之后枚举要修改的区间,从左端点开始搞起,一直后搜索,最后加一个判断,是否已经完全ok即可,具体可参见代码 好了,这道题就解决了 我的代码好像l

P2787 语文1(chin1)- 理理思维(珂朵莉树)

珂朵莉树模板,区间排序就暴力地取二十六个字母出来并且计数,然后重新从小到大插入即可 代码: #include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld %lld %lld"

模板—珂朵莉树

其实本质上是优化暴力. 网上都说构造的数据可以卡掉珂朵莉树,是因为在修改的时候要遍历set导致很容易卡掉,所以珂朵莉树可能比较有局限性. 但是如果用来维护区间用于求交求并,复杂度是严格的log的,常数好像稍大,但是还是非常有用的. 放个板子: 1 #include<iostream> 2 #include<cstdio> 3 #include<set> 4 #define re register 5 #define co const 6 #define cor co r

好Van的珂朵莉树

珂朵莉树 珂朵莉树的主要操作是区间覆盖,即将区间\([l,r]\)全部染色为\(c\). EXAMPLE EXAMPLE 1 给出一个长度为\(n\)的序列,一共\(q\)次询问,每次询问给出\(m\)个区间,求这些区间并集的权值和. \(n \leq 10^5,\sum m \leq 10^5\) SOLUTION 1 显然能用珂朵莉树做 珂朵莉树是一种基于std::set的暴力数据结构. 这个set维护若干区间,这些区间没有交集,且按左端点从小到大有序. struct node { int

CF896C Willem, Chtholly and Seniorious 珂朵莉树

问题描述 CF896C LG-CF896C 题解 我expect就是T飞,从这里跳下去,也不碰和珂朵莉相关的任何东西. 珂朵莉树真好使. 珂朵莉树模板. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #define int long long #define IT set<node>::iterator template <typename Tp> void read(Tp &x){