随机挑战总结 Part2

前言

随机挑战 Part1Part1算是放弃了,10天才写完题目。。。
这次和 WYCdalaoXXYdalao 又进行了一次随机挑战。
这次是每人在洛谷上随机跳3道蓝题。
结果两位大爷吊打我qwqqwq,比我早了8h8h完成。
还是太菜了。


题目

  1. P4231P4231 三步必杀
  2. P2841 A×B ProblemP2841\ A\times B\ Problem
  3. P5097 [USACO2004OPEN]Cave Cows 2P5097\ [USACO2004OPEN]Cave\ Cows\ 2 洞穴里的牛之二
    在这里插入图片描述

另外两位大爷的随机挑战总结:WYCdalaoXXYdalao

T1T1 差分好题,码量小的一批。
T2T2 傻逼bfsbfs+高精题,码量较小。
T3T3 **题,纯裸的线段树模板,还没有修改操作。居然被评蓝了。。。


题解

T1 P4231P4231 三步必杀

戳我:Link\color{blue}\texttt{戳我:Link}


T2 P2841 A×B ProblemP2841\ A\times B\ Problem

戳我:Link\color{green}\texttt{戳我:Link}


T3 P5097 [USACO2004OPEN]Cave Cows 2P5097\ [USACO2004OPEN]Cave\ Cows\ 2 洞穴里的牛之二

没有写题解。。。线段树模板有什么好写的。。。
或者就放一个线段树模板的链接?
戳我:Link\color{red}\texttt{戳我:Link}


代码

T1

#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;

const int N=1e7+10;
int n,m,l,r;
ll a[N],sum[N],add,x,y,ans1,ans2;

ll read()
{
    ll d=0;
    char ch=getchar();
    while (!isdigit(ch)) ch=getchar();
    while (isdigit(ch))
        d=(d<<3)+(d<<1)+ch-48,ch=getchar();
    return d;
}

int main()
{
    n=(int)read(); m=(int)read();
    for (int i=1;i<=m;i++)
    {
        l=(int)read(); r=(int)read(); x=read(); y=read();
        add=(y-x)/(ll)(r-l);
        a[l]+=x;
        a[l+1]+=add-x;
        a[r+1]-=add+y;
        a[r+2]+=y;
    }
    for (int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+a[i];
        a[i]=a[i-1]+sum[i];
        ans1^=a[i];
        ans2=max(ans2,a[i]);
    }
    printf("%lld %lld\n",ans1,ans2);
    return 0;
}

T2

#include <queue>
#include <cstdio>
using namespace std;

const int N=10010,M=200;
int n,a[N];
bool hash[N],flag;

struct node
{
    int a[M+1],p,len;
}ans1,ans2;
queue<node> q;

node xx;
void bfs()
{
    xx.len=1; xx.a[1]=1; xx.p=1; q.push(xx);
    hash[1]=1;
    while (q.size())
    {
        node u=q.front();
        q.pop();
        if (!u.p)
        {
            ans1=ans2=u;
            return;
        }
        for (int i=0;i<=1;i++)
        {
            int p=(u.p*10+i)%n;
            if (!hash[p])
            {
                hash[p]=1;
                node v=u;
                v.len++;
                v.a[v.len]=i;
                v.p=p;
                q.push(v);
            }	
        }
    }
}

int main()
{
    scanf("%d",&n);
    if (n==1) return !printf("1 1\n");
    bfs();
    for (int i=1;i<=ans1.len;i++)
    {
        a[i]=ans1.a[i]/n;
        ans1.a[i+1]+=ans1.a[i]%n*10;
    }
    int i=1;
    while (!a[i]) i++;
    for (;i<=ans2.len;i++) printf("%d",a[i]);
    putchar(32);
    for (i=1;i<=ans2.len;i++) printf("%d",ans2.a[i]);
    return 0;
}

T3

#include <cstdio>
#include <algorithm>
using namespace std;

const int N=25010;
int n,m,a[N],l,r;

struct Tree
{
    int l,r,minn;
}tree[N*4];

void build(int x)
{
    if (tree[x].l==tree[x].r)
    {
        tree[x].minn=a[tree[x].l];
        return;
    }
    int mid=(tree[x].l+tree[x].r)/2;
    tree[x*2].l=tree[x].l;
    tree[x*2].r=mid;
    tree[x*2+1].l=mid+1;
    tree[x*2+1].r=tree[x].r;
    build(x*2); build(x*2+1);
    tree[x].minn=min(tree[x*2].minn,tree[x*2+1].minn);
}

int ask(int x,int l,int r)
{
    if (l==tree[x].l && r==tree[x].r)
        return tree[x].minn;
    int mid=(tree[x].l+tree[x].r)/2;
    if (r<=mid) return ask(x*2,l,r);
    if (l>mid) return ask(x*2+1,l,r);
    return min(ask(x*2,l,mid),ask(x*2+1,mid+1,r));
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    tree[1].l=1; tree[1].r=n;
    build(1);
    while (m--)
    {
        scanf("%d%d",&l,&r);
 		printf("%d\n",ask(1,l,r));
    }
    return 0;
}
posted @ 2019-07-05 16:56  全OI最菜  阅读(151)  评论(0编辑  收藏  举报