AtCoder Beginner Contest 200
前言:果然自己连\(ABC\)都打不好了吗。
没看清题目,卡了巨久,排名一直跌,笔记本键盘坏了,心态崩了。
冷静。
——————————————————————————————————————————————————————
\(A\)
判断一个年份处于几世纪。
A
// code by fhq_treap
#include<bits/stdc++.h>
#define ll long long
#define N 300005
inline ll read(){
    char C=getchar();
    ll A=0 , F=1;
    while(('0' > C || C > '9') && (C != '-')) C=getchar();
    if(C == '-') F=-1 , C=getchar();
    while('0' <= C && C <= '9') A=(A << 1)+(A << 3)+(C - 48) , C=getchar();
    return A*F;
}
struct P{
	int to,next;
};
struct Map{
	P e[N << 1];
	int head[N],cnt;
	Map(){
		std::memset(head,0,sizeof(head));
		cnt = 0;
	}
	inline void add(int x,int y){
		e[++cnt].to = y;
		e[cnt].next = head[x];
		head[x] = cnt;
	}
};
ll a;
ll ans = 0;
int main(){
	scanf("%lld",&a);
	ans = (a / 100) + (a % 100 != 0);
	std::cout<<ans<<std::endl;
}
\(B\)
按题意模拟就行。
B
// code by fhq_treap
#include<bits/stdc++.h>
#define ll long long
#define N 300005
inline ll read(){
    char C=getchar();
    ll A=0 , F=1;
    while(('0' > C || C > '9') && (C != '-')) C=getchar();
    if(C == '-') F=-1 , C=getchar();
    while('0' <= C && C <= '9') A=(A << 1)+(A << 3)+(C - 48) , C=getchar();
    return A*F;
}
struct P{
	int to,next;
};
struct Map{
	P e[N << 1];
	int head[N],cnt;
	Map(){
		std::memset(head,0,sizeof(head));
		cnt = 0;
	}
	inline void add(int x,int y){
		e[++cnt].to = y;
		e[cnt].next = head[x];
		head[x] = cnt;
	}
};
ll a,k;
int main(){
	a = read(),k = read();
	for(int i = 1;i <= k;++i){
		if(a % 200 == 0)
		a /= 200;
		else
		a = a * 1000 + 200;
	}
	std::cout<<a<<std::endl;
}
\(C\)
从左往右扫,按前缀和的膜分类一下就能统计了。
C
// code by fhq_treap
#include<bits/stdc++.h>
#define ll long long
#define N 300005
inline ll read(){
    char C=getchar();
    ll A=0 , F=1;
    while(('0' > C || C > '9') && (C != '-')) C=getchar();
    if(C == '-') F=-1 , C=getchar();
    while('0' <= C && C <= '9') A=(A << 1)+(A << 3)+(C - 48) , C=getchar();
    return A*F;
}
struct P{
	int to,next;
};
struct Map{
	P e[N << 1];
	int head[N],cnt;
	Map(){
		std::memset(head,0,sizeof(head));
		cnt = 0;
	}
	inline void add(int x,int y){
		e[++cnt].to = y;
		e[cnt].next = head[x];
		head[x] = cnt;
	}
};
ll mod[300];
ll n,a[500005];
ll ans = 0;
int main(){
	scanf("%lld",&n);
	for(int i = 1;i <= n;++i){
		a[i] = read();
		ans += mod[a[i] % 200];
		mod[a[i] % 200] ++;
	}
	std::cout<<ans<<std::endl;
}
\(D\)
五分钟写完三题,感觉良好。
这题一眼看错了题意,以为不能有相同元素,于是乎写了正确算法交了三发\(WA\)然后就不想打了。
认真看题,不然人没。
一眼看出鸽笼原理,所以只要枚举一群数量大于\(200\),复杂度在接受范围里的就行。
D
#include<iostream>
#include<cstdio>
#define ll long long
#define N 500
ll n,a[N];
inline ll read(){
	ll ans = 0,f = 1;
	char a = getchar();
	while(a < '0' || a > '9' && a != '-')a = getchar();
	if(a == '-')
	f = -1,a = getchar();
	while(a <= '9' && a >= '0')
	ans = (ans << 3) + (ans << 1) + (a - '0'),a = getchar();
	return ans;
}
ll mod[N];
inline void print(ll a,ll b){
	puts("Yes");
	ll x = 0;
	for(int i = 0;i <= std::min(n - 1,(ll)10);++i)
	if((a >> i) & 1)
	x ++ ;
	std::cout<<x<<" ";
	for(int i = 0;i <= std::min(n - 1,(ll)10);++i)
	if((a >> i) & 1)
	std::cout<<(i + 1)<<" ";
	a = b,x = 0;
	puts("");
	for(int i = 0;i <= std::min(n - 1,(ll)10);++i)
	if((a >> i) & 1)
	x ++ ;
	std::cout<<x<<" ";
	for(int i = 0;i <= std::min(n - 1,(ll)10);++i)
	if((a >> i) & 1)
	std::cout<<(i + 1)<<" ";
}
int main(){
	n = read();
	for(int i = 1;i <= n;++i)
	a[i] = read() % 200;
	for(int i = 1;i <= (1 << std::min(n - 1,(ll)10));++i){
		ll s = 0;
		for(int j = 0;j <= std::min(n - 1,(ll)10);++j)
		if((i >> j) & 1)
		s = (s + a[j + 1]) % 200;
		if(mod[s]){
			print(mod[s],i);
			return 0;
		}else{
			mod[s] = i;
		}
	}
	puts("No");
}
\(E\)
这题的关键点在于,如何快速求出三元组和为\(s\)的数量。
找到答案所在的块内后,完全可以枚举第一,第二个数求解。
考虑找规律,规律见程序。
很抱歉这里说不清。
E
#include <cstdio>
#include <algorithm>
using namespace std;
long long dp[4][3000005];
int ans[4];
int main()
{
    int n,st;
    long long k,sum,now;
    int all;
    scanf("%d%lld",&n,&k);
    dp[0][0]=1;
    for(int i=1;i<=3;i++)
    {
        sum=0;
        for(int j=0;j<=i*n;j++)
        {
            dp[i][j]=sum;
            sum+=dp[i-1][j];
            if(j>=n)
                sum-=dp[i-1][j-n];
        }
    }
    now=0;
    for(int i=0;i<=3*n;i++)
    {
        now+=dp[3][i];
        if(now>=k)
        {
            all=i;
            k-=now-dp[3][i];
            break;
        }
    }
    now=0;
    for(int i=1;i<=n;i++)
    {
        now+=dp[2][all-i];
        if(now>=k)
        {
            ans[1]=i;
            for(int j=1;j<=n;j++)
                if(all-ans[1]-j>=1&&all-ans[1]-j<=n)
                {
                    ans[2]=j;
                    ans[3]=all-ans[1]-ans[2];
                    break;
                }
            for(int j=0;j<k-(now-dp[2][all-i])-1;j++)
            {
                ans[2]++;
                ans[3]--;
            }
            printf("%d %d %d\n",ans[1],ans[2],ans[3]);
            break;
        }
    }
    return 0;
}
F找时间补上。
AtCoder Beginner Contest 200的更多相关文章
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
		KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ... 
- Atcoder Beginner Contest 200 E. Minflip Summation(概率数论)
		题面 一个字符串 T T T 是由一个包含 0.1.? 的字符串 S S S 循环连接 K K K 次获得的. 字符串 T T T 中的每个 ? 都可以换成 0 或 1 ,假设 T T T 中一共有 ... 
- AtCoder Beginner Contest 100 2018/06/16
		A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ... 
- AtCoder Beginner Contest 053 ABCD题
		A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ... 
- AtCoder Beginner Contest 076
		A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ... 
- AtCoder Beginner Contest 068 ABCD题
		A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ... 
- AtCoder Beginner Contest 052
		没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ... 
- AtCoder Beginner Contest 136
		AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ... 
- AtCoder Beginner Contest 137 F
		AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ... 
随机推荐
- bash反弹shell
			part1:不求甚解的本地复现 攻击端Debian 10.x: 192.168.208.134 受害端Ubuntu : 192.168.208.135 攻击端打开(监听)某端口: 键入命令:[nc ... 
- HTTP标签
			系统的http状态码知识,我是在<图解http里学习的>. 状态码的职责是告知从服务器端返回的请求结果. 分类如下: 2XX --> 成功 200 OK(一般情况) 204 No C ... 
- Flink sql 之 join 与 StreamPhysicalJoinRule (源码解析)
			源码分析基于flink1.14 Join是flink中最常用的操作之一,但是如果滥用的话会有很多的性能问题,了解一下Flink源码的实现原理是非常有必要的 本文的join主要是指flink sql的R ... 
- abstract使用方式
			springMVC中的 LocalContextHolder是一个 abstract类.里边方法都是static 的. 不能被继承.不能实例化.只能调用其定义的static 方法.这种 abstrac ... 
- Sharding-JDBC自定义复合分片算法
			Sharding-JDBC自定义复合分片算法 一.背景 二.需求 1.对于客户端操作而言 2.对于运营端操作而言 三.分片算法 1.客户id和订单id的生成规则 2. 确定数据落在那个表中 3.举例说 ... 
- SDIO总线协议
			SDIO采用HOST-DEVICE模式,所有通信都由HOST端发命令,DEVICE设备只要解析HOST命令就可与HOST进行通信. SDIO总线的几根线: 1. CLK信号:HOST给DEVICE的 ... 
- hdu 2200 Eddy's AC难题(简单数学。。)
			题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. ... 
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
			/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ... 
- ffmpeg第7篇:数据流选择神器-map指令
			自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ... 
- VulnHub-[DC-8-9]-系列通关手册
			DC8-通关手册 DC-8是另一个专门构建的易受攻击的实验室,目的是在渗透测试领域积累经验. 这个挑战有点复杂,既是实际挑战,又是关于在Linux上安装和配置的两因素身份验证是否可以阻止Linux服务 ... 
