Atcoder ABC138
Atcoder ABC138
A .Red or Not
一道网速题。
大于3200输出原字符串,否则就输出red。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
int a;
string ch;
int main() {
scanf("%d",&a);
cin>>ch;
if(a >= 3200) cout<<ch;
else puts("red");
//system("pause");
return 0;
}
B. Resistors in Parallel
这不是网速题了,是一道手速题。(滑稽.jpg)
直接暴力求所有数的倒数和,再对所有数的倒数和取倒数就行了,不用考虑精度问题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 120
using namespace std;
int a[N],n;
double s;
int main() {
cin >> n;
for(int i = 1 ; i <= n ; i++) {
double x ;
cin>>x ;
x = 1 / x ;
s += x ;
}
cout<<1 / s<<endl;
system("pause");
return 0;
}
C. Alchemist
比之前的两道题要略难一点。
考虑对数组从小到大进行一次排序,然后每次贪心的取两个最小的值。
答案就是最后修改的值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define N 1010
int a[N],n;
double b[N];
int main() {
scanf("%d",&n);
for(int i = 1 ; i <= n ; i++)
scanf("%d",&a[i]);
sort(a + 1,a + n + 1);
int p1 = 2,p2 = 3;
b[p1] = ((double)a[1] + (double)a[2]) / 2;
while(p2 <= n) {
//printf("%d %d\n",&a[p1],&a[p2]);
b[p2] = ((double)b[p1] + (double)a[p2]) / 2;
// printf("%lf \n",b[p2]);
p1++,p2++;
//printf("%d %d \n",p1,p2);
}
//for(int i = 1 ; i <= n ; i++) printf("%d ",a[i]);
printf("%lf \n",b[n]);
//system("pause");
return 0;
}
D.Strings of Impurity
数据只有2e6,所以就是一道树链剖分ZZ题。
只需要写子树修改和链查询就可以。
题目中要求的单点查询可以看作查询自己到自己这条链的权值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define N 1000010
struct Edge {
int to,from;
}e[N*2+10];
struct Tree {
int sum,tag;
int lson,rson;
}tree[N*2];
int deep[N],Top[N],idx[N],siz[N];
int n,m,p,root,son[N],tot = 1,cnt;
int head[N],fa[N],val[N],w[N],t;
inline void add_edge(int x,int y) {
e[++cnt].from = y;
e[cnt].to = head[x];
head[x] = cnt;
}
inline void pushup(int x) {
tree[x].sum = (tree[tree[x].lson].sum + tree[tree[x].rson].sum);
}
void pushdown(int x,int l,int r) {
int mid = (l + r) >> 1;
tree[tree[x].lson].sum = (tree[tree[x].lson].sum + tree[x].tag * (mid - l + 1));
tree[tree[x].rson].sum = (tree[tree[x].rson].sum + tree[x].tag * (r - mid));
tree[tree[x].lson].tag = (tree[tree[x].lson].tag + tree[x].tag);
tree[tree[x].rson].tag = (tree[tree[x].rson].tag + tree[x].tag);
tree[x].tag = 0;
}
void build(int x,int l,int r) {
if(l == r) {
tree[x].sum = w[l];
return;
}
int mid = (l + r) >> 1;
tree[x].lson = ++tot;
build(tree[x].lson,l,mid);
tree[x].rson = ++tot;
build(tree[x].rson,mid+1,r);
pushup(x);
}
void update(int x,int l,int r,int ll,int rr,int v) {
if(l == ll && r == rr) {
tree[x].sum = (tree[x].sum + (r - l + 1) * v);
tree[x].tag = (tree[x].tag + v);
return;
}
int mid = (l + r) >> 1;
pushdown(x,l,r);
if(rr <= mid) update(tree[x].lson,l,mid,ll,rr,v);
else if(ll > mid) update(tree[x].rson,mid+1,r,ll,rr,v);
else {
update(tree[x].lson,l,mid,ll,mid,v);
update(tree[x].rson,mid+1,r,mid+1,rr,v);
}
pushup(x);
}
inline int query(int x,int l,int r,int ll,int rr) {
if(l == ll && r == rr) return tree[x].sum;
int mid = (l + r) >> 1;
pushdown(x,l,r);
if(rr <= mid) return query(tree[x].lson,l,mid,ll,rr);
else if(ll > mid) return query(tree[x].rson,mid + 1,r,ll,rr);
else return (query(tree[x].lson,l,mid,ll,mid) + query(tree[x].rson,mid + 1,r,mid + 1,rr));
}
void dfs1(int x,int f,int depth) {
fa[x] = f;
siz[x] = 1;
deep[x] = depth;
int maxs = -1;
for(int i = head[x] ; i ; i = e[i].to) {
int u = e[i].from;
if(u == f) continue;
dfs1(u,x,depth + 1);
siz[x] += siz[u];
if(siz[u] > maxs) {
son[x] = u;
maxs = siz[u];
}
}
}
void dfs2(int x,int topf) {
idx[x] = ++t;
w[t] = val[x];
Top[x] = topf;
if(!son[x]) return;
dfs2(son[x],topf);
for(int i = head[x] ; i ; i = e[i].to) {
int u = e[i].from;
if(u == son[x] || u == fa[x]) continue;
dfs2(u,u);
}
}
inline int query_link(int x,int y) {
int ans = 0;
while(Top[x] != Top[y]) {
if(deep[Top[x]] < deep[Top[y]]) swap(x,y);
ans += query(1,1,n,idx[Top[x]],idx[x]);
ans %= p;
x = fa[Top[x]];
}
if(deep[x] > deep[y]) swap(x,y);
ans = (ans + query(1,1,n,idx[x],idx[y]));
return ans;
}
inline void update_link(int x,int y,int val) {
while(Top[x] != Top[y]) {
if(deep[Top[x]] < deep[Top[y]]) swap(x,y);
update(1,1,n,idx[Top[x]],idx[x],val);
x = fa[Top[x]];
}
if(deep[x] > deep[y]) swap(x,y);
update(1,1,n,idx[x],idx[y],val);
}
inline int query_tree(int x) {
return query(1,1,n,idx[x],idx[x] + siz[x] - 1);
}
inline void update_tree(int x,int val) {
update(1,1,n,idx[x],idx[x] + siz[x] - 1,val);
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1 ; i < n ; i++) {
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
dfs1(1,0,1);
dfs2(1,1);
build(1,1,n);
while(m--) {
int x,z;
scanf("%d%d",&x,&z);
update_tree(x,z);
}
for(int i = 1 ; i <= n ; i++)
printf("%d ",query_link(i,i));
//system("pause");
return 0;
}
E.Strings of Impurity
一道字符串题。
我们考虑在s串中查询t串中的每个字符出现的位置,统计出现了多少次,即统计需要循环s串多少次。
那么答案就是 $ cnt * s.length() + pos $ 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
#define LL long long
string s,t;
LL pos,cnt;
int main() {
cin>>s>>t;
for(int i = 0 ; i < t.length() ; i++) {
pos = s.find(t[i],pos);
if(pos == -1) {
pos = s.find(t[i],0);
if(pos == -1) {
puts("-1");
return 0;
}
cnt++;
}
pos++;
}
LL ans = cnt * s.length() + pos;
printf("%lld \n",ans);
//system("pause");
return 0;
}
F.Coincidence
一道极端恶心的DP题。
设 $ dp[i][0/1][0/1] $ 表示考虑到当前位置i,满足 $ x \geq L $ , 并且满足 $ y \leq R $ 的方案数。
因为数据上界为 $ 10^{18} $ ,不能直接存,所以我们考虑利用2进制,数组的第一维代表到 $ 2^i $ 的位置。
此时数组只需要开 $ dp[65][2][2] $ ,第一维只有65是因为 $ 2^{60} \geq 10^{18}$ 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int mod = 1e9 + 7;
LL dp[66][2][2],L, R;
LL dfs(int x, bool Left, bool Right, bool zero) {
if(x < 0) return 1;
if(dp[x][Left][Right] >= 0 && !zero)
return dp[x][Left][Right];
LL ans = 0;
int l = 0, r = 1;
if(Left) l = L >> x & 1;
if(Right) r = R >> x & 1;
for(int i = l ; i <= 1 ; i++) {
for (int j = i ; j <= r ; j++) {
if (j == 1 && zero) {
if(i == 1) ans += dfs(x-1, Left && i == l, Right && j == r, zero && j == 0);
}
else ans += dfs(x-1, Left && i == l, Right && j == r, zero && j == 0);
}
}
ans %= mod;
if(!zero) dp[x][Left][Right] = ans;
return ans;
}
int main() {
scanf("%lld%lld", & L, & R);
memset(dp, -1, sizeof(dp));
printf("%lld \n", dfs(60, 1, 1, 1));
//system("pause");
return 0;
}
Atcoder ABC138的更多相关文章
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识
链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...
- AtCoder Regular Contest 082
我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...
- AtCoder Regular Contest 069 D
D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...
- AtCoder Regular Contest 076
在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...
- AtCoder Grand Contest 016
在雅礼和衡水的dalao们打了一场atcoder 然而窝好菜啊…… A - Shrinking 题意:定义一次操作为将长度为n的字符串变成长度n-1的字符串,且变化后第i个字母为变化前第i 或 i+1 ...
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle
https://beta.atcoder.jp/contests/abc075/tasks/abc075_d 题意: 给出坐标平面上n个点的坐标,要求找到一个面积最小的矩形使得这个矩形的边界加上内部的 ...
- AtCoder Beginner Contest 073
D - joisino's travel Time Limit: 2 sec / Memory Limit: 256 MB Score : 400400 points Problem Statemen ...
随机推荐
- php 处理数字为金钱格式
number_format(需要转换的数字,保留小数个数,小数点符号,每三位的分隔符) echo number_format("1000000")."<br> ...
- C# enum枚举知识总结
C#中除了简单的变量类型外,还提供了三种较为复杂的变量类型,包括枚举.结构和数组.本文主要讲述枚举相关的知识. 枚举类型(也称为枚举),提供了一种有效的方式,来定义可能分配给变量的一组已命名的整数常量 ...
- [转载]SSD原理与实现
[转载]SSD原理与实现 这里只mark一下,对原论文讲解的很好的博文 https://zhuanlan.zhihu.com/p/33544892 这里有一个关于SSD的很好的程序实现,readme里 ...
- Js-带进度条的轮播图
带进度条的轮播图--原生JS实现 实现了图片自动轮播,左右按钮实现图片左右转换,下方原点或者缩小图点击选择其中的某一张图片,然后有红条实现图片的进度. <div class="cont ...
- 利用axis调用webservice接口
一.首先把wsdl文件放入eclipse中某个项目中的src目录下 二.右键弹出webservice,然后点击webservice菜单,选中genernator client ,选择axis生成Jav ...
- 第一章、接口规范之Restful规范
阅读目录 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源 2.5 资源操作由请求方式决定 3.1 正常响应 3.2 重定向响应 3.3 客户端异常 3.4 ...
- Mysql(八):ORM框架SQLAlchemy
一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- Java抽象类 详解
一.抽象类的基本概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法.普通方法.static方法.常量和变量等内容.而抽象类是指在普通类的结构里面增加抽象方法的组成 ...
- 通过自动回复机器人学Mybatis---加强版
第2章 接口式编程 介绍 Mybatis 的接口式编程,并说明为什么要采用这种形式,以及 Mybatis 是如何实现的