Gym 101911F “Tickets”
题意:
给你一个由六位数字组成的门票编码x,并定义F(x) = | 前三位加和 - 后三位加和|;
求出给定的门票编码 x 之前并且 F(i) < F(x) 的 i 的总个数。
题解:
为方便描述,先定义一个虚拟的数组 a[ i ][ j ] : 表示前 i 个数中,经过 F() 函数映射成数 j 的整数的总个数;
首先,我先将门票编码转化成整数,然后按升序排列。
从 0 开始便利所有的整数 num,对于某个整数 num ,判断当前的 num 是否 == 某一门票编码x,如果等于,
那么在x之前并且经F()映射后值小于F(x)的整数的总个数为 Σ(a[ i ][ 0 ] + a[ i ][ 1 ] + a[ i ][ F(x)-1 ]),其中 0 ≤ i < x ;
当然,为了提高求和效率,我使用了树状数组来存储答案,具体细节看代码;
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define lowbit(x) (x&-x)
const int maxn=2e5+; int n;
struct Date
{
int val;
int id;
int ans;
}_date[maxn];
struct BIT
{
int bit[];
void Add(int t)
{
while(t < )
{
bit[t]++;
t += lowbit(t);
}
}
int Sum(int t)
{
int sum=;
while(t > )
{
sum += bit[t];
t -= lowbit(t);
}
return sum;
}
}_bit;
int Trans(char *s)
{
return (s[]-'')*+(s[]-'')*+
(s[]-'')*+(s[]-'')*+
(s[]-'')*+(s[]-'');
}
int F(int val)
{
int sum=;
int index=;
while(index <= && val)
{
sum += val%;
val /= ;
index++;
}
while(val)
{
sum -= val%;
val /= ;
}
return abs(sum);
} bool cmp1(Date _a,Date _b)
{
return _a.val < _b.val;
}
bool cmp2(Date _a,Date _b)
{
return _a.id < _b.id;
} void Solve()
{
sort(_date+,_date+n+,cmp1);
int index=;
int zero=; for(int i=;index <= n;++i)
{
int x=F(i);
int val=_date[index].val; //处理某一门票编码出现多次的情况
while(val == i && index <= n)
{
int t=F(val);//将val映射为F(val)
_date[index].ans=_bit.Sum(t-)+(t > ? zero:);
index++;
val=_date[index].val;
} //因为树状数组不能处理0,所以0单独用变量zero记录
if(x == )
zero++;
else
_bit.Add(x);
}
sort(_date+,_date+n+,cmp2); for(int i=;i <= n;++i)
printf("%d\n",_date[i].ans);
}
int main()
{
scanf("%d",&n);
for(int i=;i <= n;++i)
{
char s[];
scanf("%s",s);
_date[i].val=Trans(s);//将字符串 s 转化为整数
_date[i].id=i; }
Solve(); return ;
}
Gym 101911F “Tickets”的更多相关文章
- Codeforces Gym 100418J Lucky tickets 数位DP
Lucky ticketsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...
- Gym 100418J Lucky tickets(数位dp)
题意:给定一个n.求区间[1, n]之间的全部的a的个数.a满足: a能整除 把a表示自身二进制以后1的个数 思路:题意非常绕.... 数位dp,对于全部可能的1的个数我们都dfs一次 对于某一个可 ...
- Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset
Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- Codeforces Gym 100342J Problem J. Triatrip bitset 求三元环的数量
Problem J. TriatripTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/att ...
- Gym 102056L - Eventual … Journey - [分类讨论][The 2018 ICPC Asia-East Continent Final Problem L]
题目链接:https://codeforces.com/gym/102056/problem/L LCR is really an incredible being. Thinking so, sit ...
- ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力
Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS Memory Limit:65536KB 64bit IO Fo ...
- ACM: Gym 101047K Training with Phuket's larvae - 思维题
Gym 101047K Training with Phuket's larvae Time Limit:2000MS Memory Limit:65536KB 64bit IO F ...
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- ACM: Gym 101047B Renzo and the palindromic decoration - 手速题
Gym 101047B Renzo and the palindromic decoration Time Limit:2000MS Memory Limit:65536KB 64 ...
随机推荐
- 插件 DataTable 创建列表 render参数的详解与如何传递本行数据id
1.首先 导入DataTable 的插件 2.定义表结构: HTML: <table> <thead> <tr> <th>id</th> & ...
- List接口方法
package cn.zhou.com; /* * List?-------是啥? Collection 的一个子接口! * * 集合?容器? * * 区分容器,每个容器的数据结构不一样! * 集合, ...
- mvc学习过程碰到问题
Fluent API配置 单例模式+Autofac 批量注入
- React 学习(三) ---- state 和 事件处理函数
在上两节中,我们讲述了props, 组件使用props进行渲染,但是这是一次性的, props渲染完成之后就不做任何事情了,但是现实中却不是这样的,当我们点击购物车上的加减按钮时,数量会自动加1或减1 ...
- hdu-2222(ac自动机模板)
题意:给你一个长度为n的单词表,一个文本串,问你这个文本串中出现了单词表中多少个单词: 解题思路:ac自动机的模板题,可以直接当模板用: 代码: #include<iostream> #i ...
- Codeforces Round #445 Div. 1
A:每次看是否有能走回去的房间,显然最多只会存在一个,如果有走过去即可,否则开辟新房间并记录访问时间. #include<iostream> #include<cstdio> ...
- Git——入门操作加创建账号【三】
创建账号 GitHub https://github.com/ 码云 https://gitee.com/ 无论是github还是码云,创建账号都是非常简单快捷的,大家可以自行选择创建下,不过建议最好 ...
- CDQ题目套路总结 [未完成]
CDQ学习资料 day1cdq分治相关 CDQ的IOI论文 1.优化斜率dp 左边对右边影响维护一个凸包解决 需要知识:①凸包②斜率dp 题目:√ HDU3842 Machine Works HY ...
- P1880 [NOI1995]石子合并 区间dp+拆环成链
思路 :一道经典的区间dp 唯一不同的时候 终点和起点相连 所以要拆环成链 只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...
- POJ 1966 Cable TV Network (算竞进阶习题)
拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...