A - tokitsukaze and Counting

题目描述

给出3个整数L,R,x。tokitsukaze想知道,闭区间[L,R]中,x的倍数出现了几次。

输入描述:

第一行包括一个正整数T(T<=1000),表示T组数据。接下来T行,每行包括3个正整数L,R,x。1≤L≤R≤10^181≤x≤10^18

输出描述:

输出T行,每一行一个整数,表示答案。

示例1

输入

复制

1
2 5 3

输出

复制

1

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1const int INF=0x3f3f3f3f;
const int N=105;
int a[N];
int main(){int t;ll L,R,x;scanf("%d",&t);while(t--){scanf("%lld%lld%lld",&L,&R,&x);ll ans=R/x-(L-1)/x;printf("%lld\n",ans);}
}

B - tokitsukaze and RPG - 暴力+剪枝

题目描述

tokitsukaze最近沉迷一款RPG。
这个RPG一天有k分钟,每一天从第1分钟开始。
有n种怪物,第i种怪物每天第一次出现的时间为Xi分钟,第二次出现的时间为2*Xi分钟,第三次出现的时间为3*Xi分钟......同一时刻出现的怪物种类越多,打怪获得的经验也越高。
为了高效练级,tokitsukaze想知道在一天内出现怪物种类最多的时间点会出现多少种怪物,这样的时间点有多少个。

输入描述:

第一行包括2个正整数n,k(1≤n≤10^5,1≤k≤10^6),表示有n种怪物,一天有k分钟。
接下来一行包括n个正整数X(1≤Xi≤10^6),含义如题面所示。

输出描述:

输出一行,包括两个整数a,b。
a表示怪物种类数,b表示时间点的个数。

示例1

输入

复制

3 6
2 2 3

输出

复制

3 1

说明

在第6分钟时,3种怪物都出现了。

示例2

输入

复制

3 5
2 2 3

输出

复制

2 2

说明

在第2分钟和第4分钟时,第一种和第二种怪物出现了。

示例3

输入

复制

6 10
1 2 3 4 5 6

输出

复制

4 1

说明

在第6分钟时,出现了第一种、第二种、第三种、第六种怪物。

示例4

输入

复制

3 5
6 6 6

输出

复制

0 5

说明

在第1分钟、第2分钟、第3分钟、第4分钟、第5分钟,都没有出现怪物。

思路:

用类似埃氏筛素数的方法去求每个数的倍数,但是这样会超时,我们把每个数出现的次数计算出来,然后筛的时候直接加上次数就可以啦,这是一个剪枝的好方法啊,以后遇到超时的时候,就要考虑是不是我们重复计算了重复出现的数!

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1const int INF=0x3f3f3f3f;
const int N=1000005;
int bei[N],a[N],ci[N];
int num[N],vis[N];
int main(){int n,k,tmp,mm=0;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&tmp);if(vis[tmp]==0){a[mm++]=tmp;vis[tmp]=1;}ci[tmp]++;}for(int i=0;i<mm;i++){for(int j=a[i];j<=k;j+=a[i])bei[j]+=ci[a[i]];}int maxx=-1;for(int i=1;i<=k;i++){if(bei[i]>maxx){maxx=bei[i];}num[bei[i]]++;}printf("%d %d\n",maxx,num[maxx]);
}

C - tokitsukaze and Number Game - 模拟

题目描述

tokitsukaze又在玩3ds上的小游戏了,现在她遇到了难关。
tokitsukaze得到了一个整数x,并被要求使用x的每一位上的数字重新排列,组成一个能被8整除的数,并且这个数尽可能大。
聪明的你们请帮帮可爱的tokitsukaze,如果无法组成被8整除的数,请输出-1。
保证输入不含前导0,输出也不能含前导0。

输入描述:

第一行包括一个正整数T(T<=1000),表示T组数据。
接下来T行,每一行包括一个整数x,(0≤x≤10^100)。

输出描述:

请输出用这些数字组成出能被8整除的最大的数,如果无法组成出能被8整除的数,请输出-1。

示例1

输入

复制

2
666
1256

输出

复制

-1
6512

思路:

能被8整除的数字的特点是后三位能被8整除,然后对于只有1,2位的数字我们直接判断,对于3位及以上的数字,我们从0开始一直到992,(注意0看成是000,8看成是008,这样数字1000,1008,等就可以被判断到啦)判断后三位是这些数成立不成立,若是成立的话,我们再把剩余的数字从大到小排列组成一个最大的数字,最后找出组成数字里最大的那一个!

(其中判断最后三位也是有技巧的,具体见代码注释,刚开始写的绕来绕去,后来改了,这样还挺简洁qwq)

代码如下:

#include<iostream>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1const int INF=0x3f3f3f3f;
const int N=105;
int q=0,a[N],res[1000],num[15];void solve(int x){int y=(x%10)*10+x/10;int aa=max(x,y),bb=min(x,y);if(aa%8==0)printf("%d\n",aa);else if(bb%8==0)printf("%d\n",bb);else printf("-1\n");return ;
}int main(){int t;char ch;for(int i=0;i<1000;i++){if(i%8==0)res[q++]=i;}scanf("%d",&t);getchar();while(t--){memset(a,0,sizeof(a));memset(num,0,sizeof(num));int k=0;while((ch=getchar())!='\n'){a[k++]=ch-'0';num[ch-'0']++;}if(k==1){//判断只有一位的情况if(a[0]==8||a[0]==0)printf("%d\n",a[0]);else printf("-1\n");continue;}if(k==2){//判断只有两位的情况solve(a[0]*10+a[1]);continue;}string str="";for(int i=0;i<q;i++){//判断三位以上的情况int tmp=res[i];int t1=tmp%10;tmp/=10;int t2=tmp%10;tmp/=10;int t3=tmp;num[t1]--;num[t2]--;num[t3]--;string s1;s1+=t3+'0';s1+=t2+'0';s1+=t1+'0';if(num[t1]>=0&&num[t2]>=0&&num[t3]>=0){//如果能满足要求string s2;for(int i=9;i>=0;i--){//从9开始(因为9最大),加上每个数的个数for(int j=0;j<num[i];j++){s2+=i+'0';}}s2+=s1;//最后再加上后三位if(s2>str)str=s2;//选择最大的数}num[t1]++;num[t2]++;num[t3]++;}if(str=="")cout<<-1<<endl;else cout<<str<<endl;}
}

D - tokitsukaze and Inverse Number - 线代的概念or找规律

题目描述

tokitsukaze给你一个长度为n的序列,这个序列是1到n的一种排列。
然后她会进行q次操作。每次操作会给你L R k这三个数,表示区间[L,R]往右移动k次。
移动一次的定义是:一个数的位置是P(L≤P≤R-1),它往右移动后就会在P+1这个位置上;如果一个数在R这个位置,它会移动到L这个位置。
在每次操作结束后,tokitsukaze想让你算出现在这个序列的逆序数的多少,简单起见,你只需要告诉她现在这个序列的逆序数是奇数还是偶数就行了。
提示:序列的逆序数指的是:a[i]>a[j](i<j),满足条件的(i,j)的个数。

输入描述:

第一行包括一个正整数n(1≤n≤10^5)。
接下来一行,包括一个长度为n的序列,序列为1到n的一种排列。
第三行包括一个正整数q(1≤q≤10^5)。
接下来q行,每行包括三个正整数L,R,k(1≤L≤R≤n,1≤k≤10^9)。
所有变量的含义题面均有给出。

输出描述:

在每次操作后,逆序数如果是奇数,就输出1,如果是偶数,就输出0。

示例1

输入

复制

4
2 3 1 4
3
1 3 2
2 4 1
2 3 1

输出

复制

0
0
1

说明

原序列为:2 3 1 4
第一次操作后,序列变为:3 1 2 4,逆序数为2,所以答案为0。
第二次操作后,序列变为:3 4 1 2,逆序数为4,所以答案为0。
第三次操作后,序列变为:3 1 4 2,逆序数为3,所以答案为1。

思路:

结论:1 到 n 的排列,任意交换两个数,逆序数奇偶性发生

因此我们只需要知道,要经过多少次变换就可以啦

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1const int INF=0x3f3f3f3f;
const int N=100005;
ll ans=0;
int a[N],b[N];
void Merge(int s[],int t[],int b,int m,int e){int i=b,j=m+1,k=0;while(i<=m&&j<=e){if(s[i]>s[j]){ans+=m-i+1;t[k++]=s[j++];}else t[k++]=s[i++];}while(i<=m)t[k++]=s[i++];while(j<=e)t[k++]=s[j++];for(int q=0;q<k;q++)s[q+b]=t[q];
}void Msort(int s[],int t[],int b,int e){if(b<e){int m=(b+e)>>1;Msort(s,t,b,m);Msort(s,t,m+1,e);Merge(s,t,b,m,e);}
}int main(){int n,q,l,r,k;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}Msort(a,b,0,n-1);scanf("%d",&q);ans%=2;while(q--){scanf("%d%d%d",&l,&r,&k);k%=(r-l+1);ans=(ans+((r-l)%2*k)%2)%2;printf("%lld\n",ans%2);}
}

牛客练习赛33 - ABCD相关推荐

  1. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  2. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  3. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  4. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  5. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  6. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  7. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  8. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)

    牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...

  9. 妄想集合(牛客练习赛90)

    妄想集合(牛客练习赛90) 题意: 开始有 n 个可重集合,开始时每一个集合中都有一个数,有 m 个操作. Quant l r x\text{Quant l r x}Quant l r x:往编号在 ...

最新文章

  1. mysql实现pr曲线_ROC 曲线与 PR 曲线
  2. isa 2006 下发布 owa
  3. 服务器不响应Ajax,web前端:解决在IE11浏览器下,JQuery的AJAX方法不响应问题
  4. 有赞客户行为收集与实时处理系统设计
  5. android切换到上个页面,Android 返回上一个界面刷新数据
  6. MySQL自动建立集合自动分片_1.mongodb初步使用总结
  7. linux删除文件_Linux删除文件夹用什么命令
  8. 《Thinking in java》 读了个开头
  9. ctfshow-WEB-web1签到题
  10. Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
  11. python图像对比_python+PIL实现图片对比(一)
  12. (入门)keystonejs入门教程之环境搭建
  13. XTDRONE:ego_planner三维运动规划
  14. oracle的多个exclude,记录一下expdp exclude的用法
  15. java异常处理(Exception handing)机制
  16. Good Luck in CET-4 Everybody!(博弈)
  17. 国家旅游局发布厕所大数据报告,上厕所最容易的城市你一定想不到
  18. 程序员兼职网站(自由职业)
  19. 运营推广一款新的app到底需要哪些完整步骤?
  20. 积沙成塔,积水成渊是什么意思

热门文章

  1. 如何在Ubuntu下成功连接iPhone设备
  2. linux 删除path中部分目录,Linux环境变量PATH的增添和删除操作
  3. Kotlin学习(一):Kotlin基础知识
  4. python 爬虫(cookie)
  5. 腰椎间盘突出引起的马尾综合征
  6. nginx 拦截非法字符,nginx禁止url访问特定字符,nginx过滤url访问
  7. Object.assign() 方法的使用详解
  8. 福州大学计算机考研好考,福州大学数学考研好不好考,考研考哪些?福大数学考研考情分析。...
  9. 信息时代的两极:重数量的百度,重质量的知乎
  10. javadoc: 错误 - 非法的程序包名称: “UTF-8“ | javadoc: 警告 - 没有程序包encoding的源文件 | javadoc: 错误 - 不支持编码: utf8-charse