Wannafly挑战赛3 C.位数差【思维+离散化+二分+树状数组】
来源:互联网 发布:淘宝评价怎么看不到 编辑:程序博客网 时间:2024/06/05 04:23
题目描述
给一个数组{a},定义 h(a,b)为在十进制下 a + b 与 a 的位数差,求 ,0的位数为1。
输入描述:
第一行读入一个正整数 n (1 <= n <= 105)。
第二行读入 n 个非负整数,第 i 个表示a[i] (0 <= a[i] <= 108)。
输出描述:
一行表示答案。
示例1
输入
100 1 2 3 4 5 6 7 8 9
输出
20
考虑降低常数就行了。
问题很简单,我们只要考虑每个数后边有多少比他大的数而且能够进位即可,观察到数据范围,我们只要将10-a【i】,100-a【i】,1000-a【i】.....................依次进行计算,得到a【i】进位需要的最小的数值,然后树状数组随便搞搞就行了。
问题不难,一开始将太多数离散化导致了超时TAT。。。
Ac代码:
#include<bits/stdc++.h>using namespace std;/***********************************/int n;int tree[1000800];int lowbit(int x){ return x&(-x);}int sum(int x){ int sum=0; while(x>0) { sum+=tree[x]; x-=lowbit(x); } return sum;}void add(int x,int c){ while(x<=n) { tree[x]+=c; x+=lowbit(x); }}/***********************************/struct node{ int val,pos;}a[100050],b[100050];int pos[100050];int cmp(node a,node b){ return a.val<b.val;}int cmp2(node a,node b){ return a.pos<b.pos;}int main(){ while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&a[i].val); a[i].pos=i; b[i].val=a[i].val; b[i].pos=i; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++)pos[a[i].pos]=i; sort(a+1,a+1+n,cmp2); sort(b+1,b+1+n,cmp); memset(tree,0,sizeof(tree)); long long int ans=0; for(int i=n;i>=1;i--) { int Temp=1; for(int j=1;j<=9;j++) { Temp*=10; if(Temp<=a[i].val)continue; else { int p=-1; int l=1; int r=n; int flag=0; while(r-l>=0) { int mid=(l+r)/2; if(b[mid].val>=Temp-a[i].val) { r=mid-1; p=mid; } else l=mid+1; } if(p==-1)continue; ans+=(sum(n)-sum(pos[b[p].pos]-1)); } } add(pos[i],1); } printf("%lld\n",ans); }}
阅读全文
0 0
- Wannafly挑战赛3 C.位数差【思维+离散化+二分+树状数组】
- Wannafly挑战赛3 C.位数差(二分+树状数组)
- Wannafly挑战赛3 C.位数差(树状数组)
- Wannafly挑战赛3-C.位数差(思维)
- Wannafly挑战赛3-C-位数差(二分)
- 3.C位数差 离散化+树状数组
- Wannafly挑战赛1 B.Xorto【思维+二分】
- 【Wannafly挑战赛1 】B Xorto 【思维+二分】
- Wannafly挑战赛2 C 思维 + 线段树
- wannafly挑战赛4 C-割草机 思维
- wannafly挑战赛4C-水题&思维-割草机
- 【Wannafly挑战赛5】 A 【思维枚举】B C【排列组合 公式】
- Wannafly挑战赛6 C-逆序对【思维&组合数学】
- Wannafly挑战赛2-B-Travel(floyd+离散化)
- Wannafly挑战赛1 C
- Codeforces 652D Nested Segments【离散化+思维+树状数组】
- HDU-5792 World is Exploding(思维、树状数组+离散化)
- Wannafly挑战赛3
- C#解析JObject对象的一个键值
- mongodb 2dsphere 两种查寻附近坐标的方法
- Java 反射将配置文件数据加载到对象属性中Reflect与Properties使用
- Hrbust 菜鸟和大牛(递归做法)
- java中Map常见用法
- Wannafly挑战赛3 C.位数差【思维+离散化+二分+树状数组】
- Java 对国际化 (i18n) 的支持&资源包的调用
- java技术交流: 10个有趣的Javascript和CSS库
- PG数据库在一些平台上的安装注意事项
- 343. Integer Break
- 最大堆的初始化、插入和删除
- java开发必看|Spring基础知识汇总
- 挂钩可用于各种构建步骤、
- TCP三次握手四次挥手详解