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的更多相关文章

  1. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  2. AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识

    链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...

  3. AtCoder Regular Contest 082

    我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...

  4. AtCoder Regular Contest 069 D

    D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

  5. AtCoder Regular Contest 076

    在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...

  6. AtCoder Grand Contest 016

    在雅礼和衡水的dalao们打了一场atcoder 然而窝好菜啊…… A - Shrinking 题意:定义一次操作为将长度为n的字符串变成长度n-1的字符串,且变化后第i个字母为变化前第i 或 i+1 ...

  7. 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, ...

  8. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle

    https://beta.atcoder.jp/contests/abc075/tasks/abc075_d 题意: 给出坐标平面上n个点的坐标,要求找到一个面积最小的矩形使得这个矩形的边界加上内部的 ...

  9. AtCoder Beginner Contest 073

    D - joisino's travel Time Limit: 2 sec / Memory Limit: 256 MB Score : 400400 points Problem Statemen ...

随机推荐

  1. php 处理数字为金钱格式

    number_format(需要转换的数字,保留小数个数,小数点符号,每三位的分隔符) echo number_format("1000000")."<br> ...

  2. C# enum枚举知识总结

    C#中除了简单的变量类型外,还提供了三种较为复杂的变量类型,包括枚举.结构和数组.本文主要讲述枚举相关的知识. 枚举类型(也称为枚举),提供了一种有效的方式,来定义可能分配给变量的一组已命名的整数常量 ...

  3. [转载]SSD原理与实现

    [转载]SSD原理与实现 这里只mark一下,对原论文讲解的很好的博文 https://zhuanlan.zhihu.com/p/33544892 这里有一个关于SSD的很好的程序实现,readme里 ...

  4. Js-带进度条的轮播图

    带进度条的轮播图--原生JS实现 实现了图片自动轮播,左右按钮实现图片左右转换,下方原点或者缩小图点击选择其中的某一张图片,然后有红条实现图片的进度. <div class="cont ...

  5. 利用axis调用webservice接口

    一.首先把wsdl文件放入eclipse中某个项目中的src目录下 二.右键弹出webservice,然后点击webservice菜单,选中genernator client ,选择axis生成Jav ...

  6. 第一章、接口规范之Restful规范

    阅读目录 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源 2.5 资源操作由请求方式决定 3.1 正常响应 3.2 重定向响应 3.3 客户端异常 3.4 ...

  7. Mysql(八):ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  8. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  9. Java抽象类 详解

    一.抽象类的基本概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法.普通方法.static方法.常量和变量等内容.而抽象类是指在普通类的结构里面增加抽象方法的组成 ...

  10. 通过自动回复机器人学Mybatis---加强版

    第2章 接口式编程 介绍 Mybatis 的接口式编程,并说明为什么要采用这种形式,以及 Mybatis 是如何实现的