Atcoder abc 138

题解

视频

\(\color{red}A\)



题意?

输入一个数,如果这个数大于3200,那么就输出后面的字符串,否则输出red

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
 
using namespace std ;
 
int a ;
string s ;
 
int main () {
	cin >> a >> s ;
	if(a >= 3200) {
		cout << s << endl ;
	}else {
		puts("red") ;
	}
	return 0 ; 
}

\(\color{blue}B\)



题意

就是让你把读到的数取到数加起来,然后把这个和取到数输出

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 120
using namespace std ;
 
int a[maxn] , 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 ;
}

\(\color{green}C\)




题意

从小到大排个序,然后每次把前两小按照z=(x+y)/2的公式变成一个数,输出最后的唯一数

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define maxn 120
using namespace std ;
priority_queue<double,vector<double>,greater<double> >q ;
double a[maxn] ,  ans ;
int n ;
 
int main () {
	cin >> n ;
	for(int i = 1 ; i <= n ; i ++) {
		cin >> a[i] ;
		q.push(a[i]) ;
	}
	for(int i = 1 ; i < n ; i ++) {
		double x = q.top() ;
		q.pop() ;
		double y = q.top() ;
		q.pop() ;
		double c = (x+y)/2 ;
		q.push(c) ;
	}
	cout << q.top() <<endl ;
}

\(\color{blue}D\)




题意 :

一棵树,根节点为1号节点,有n各节点,m个操作,每次操作把i的子树增加x,最后问每个节点的大小

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int N=200005;
struct node
{
    int u,v,nxt;
}edge[2*N];
struct Tree
{
    int l,r,w,siz,f;
}T[2*N];
int n,m,cnt=0,num=1,root=1,a[N],b[N],head[N];
int deep[N],fa[N],son[N],tot[N],top[N],idx[N];
void AddEdge(int x,int y)
{
    edge[num].u=x;
    edge[num].v=y;
    edge[num].nxt=head[x];
    head[x]=num++;
}
int dfs1(int now,int f,int dep)
{
    deep[now]=dep;
    fa[now]=f;
    tot[now]=1;
    int maxson=-1;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(edge[i].v==f) continue;
        tot[now]+=dfs1(edge[i].v,now,dep+1);
        if(tot[edge[i].v]>maxson) maxson=tot[edge[i].v],son[now]=edge[i].v;
    }
    return tot[now];
}
void update(int k)
{
    T[k].w=T[ls].w+T[rs].w;
}
void Build(int k,int ll,int rr)
{
    T[k].l=ll;T[k].r=rr;T[k].siz=rr-ll+1;
    if(ll==rr)
    {
        T[k].w=a[ll];
        return;
    }
    int mid=(ll+rr)>>1;
    Build(ls,ll,mid);
    Build(rs,mid+1,rr);
    update(k);
}
void dfs2(int now,int topf)
{
    idx[now]=++cnt;
    a[cnt]=b[now];
    top[now]=topf;
    if(!son[now]) return;
    dfs2(son[now],topf);
    for(int i=head[now];i!=-1;i=edge[i].nxt)
      if(!idx[edge[i].v]) dfs2(edge[i].v,edge[i].v);
}
void pushdown(int k)
{
    if(!T[k].f) return ;
    T[ls].w=T[ls].w+T[ls].siz*T[k].f;
    T[rs].w=T[rs].w+T[rs].siz*T[k].f;
    T[ls].f=T[ls].f+T[k].f;
    T[rs].f=T[rs].f+T[k].f;
    T[k].f=0;
}
void IntervalAdd(int k,int ll,int rr,int val)
{
    if(ll<=T[k].l&&T[k].r<=rr)
    {
        T[k].w+=T[k].siz*val;
        T[k].f+=val;
        return;
    }
    pushdown(k);
    int mid=(T[k].l+T[k].r)>>1;
    if(ll<=mid) IntervalAdd(ls,ll,rr,val);
    if(rr>mid) IntervalAdd(rs,ll,rr,val);
    update(k);
}
int IntervalSum(int k,int ll,int rr)
{
    int ans=0;
    if(ll<=T[k].l&&T[k].r<=rr)
        return T[k].w;
    pushdown(k);
    int mid=(T[k].l+T[k].r)>>1;
    if(ll<=mid) ans=ans+IntervalSum(ls,ll,rr);
    if(rr>mid)  ans=ans+IntervalSum(rs,ll,rr);
    return ans;
}
void TreeSum(int x,int y)
{
    int ans=0;
    while(top[x]!=top[y])
    {
        if(deep[top[x]]<deep[top[y]]) swap(x,y);
        ans=ans+IntervalSum(1,idx[top[x]],idx[x]);
        x=fa[top[x]];
    }
    if(deep[x]>deep[y]) swap(x,y);
    ans=ans+IntervalSum(1,idx[x],idx[y]);
    cout<<ans<<" ";
}
int main()
{
    cin>>n>>m;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n-1;i++)
    {
    	int x,y;
    	cin>>x>>y;
        AddEdge(x,y);
		AddEdge(y,x);
    }
    dfs1(root,0,1);
    dfs2(root,root);
    Build(1,1,n);
    while(m--)
    {
    	int x,y;
    	cin>>x>>y;
        IntervalAdd(1,idx[x],idx[x]+tot[x]-1,y);
    }
    for(int i=1;i<=n;i++) TreeSum(i,i);
    cout<<endl;
    return 0;
}

\(\color{yellow}E\)



思路

暴力

非AC代码

#include <bits/stdc++.h>
 
using namespace std ;
string s , t ;
char vis[30] ;
int main () {
	cin >> s >> t ;
	for(int i = 0 ; i < s.size() ; i ++) {
		int c = s[i] - 'a' + 1 ;
		vis[c] ++ ; 
	}
	for(int i = 0 ; i < t.size() ; i ++) {
		int c = t[i] - 'a' + 1 ;
		if(!vis[c]) {
			puts("-1") ;
			return 0 ;
		}
	}
	int _t = 0 ,_s = 0 ,tot = 0 ;
	int n = s.size() ;
	while(_t != t.size()  ) {
		_s = _s%n ;
		tot ++ ;
	//	cout <<tot<< ":" << _s << " " << s[_s] << "*" << _t << " " << t[_t] <<endl ; 
		if(s[_s] == t[_t]) {
			_t ++ ;
			_s ++ ;
		}else {
			_s ++ ;
		}
	}
	cout << tot << endl ;
	return 0 ;
}

附赠图片

youtube 直播?



posted @ 2019-08-18 21:39  _L_Y_T  阅读(202)  评论(0编辑  收藏  举报