t1-Out of Sorts

题目大意

将最大的数冒泡排序到最后需要多少次操作。

分析

排序后判断距离。

ac代码

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
struct node{
    int x,p;
}a[N];
int n;
int read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
bool cmp(node a,node b){
    return (a.x==b.x)?(a.p<b.p):(a.x<b.x);
}
int main(){
    n=read();
    for(int i=1;i<=n;i++) a[i].x=read(),a[i].p=i;
    sort(a+1,a+1+n,cmp);
    int ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,a[i].p-i+1);
    }
    printf("%d\n",ans);
    return 0;
}

t2-Lemonade Line

分析

排序后线性查询。

ac代码

# include<bits/stdc++.h>
# define N 100005
using namespace std;
int n;
int w[N];
int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&w[i]);
    sort(w+1,w+1+n);
    int now=0,j=n;
    for(int i=1;i<=n;i++){
        while(now<=w[i]&&j>=i) j--,now++;
    }
    printf("%d\n",now);
    return 0;
}

t3-Multiplayer Moo

分析

暴力搜索

ac代码

# include<bits/stdc++.h>
# define N 255
using namespace std;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int vis[N][N];
int n,sum,ans,cnt;
int a[N][N];
inline int read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
void dfs1(int x,int y){
    sum++; vis[x][y]=1;
    for(int i=0;i<4;i++){
        int nx=x+dx[i],ny=y+dy[i];
        if(nx<1||nx>n||ny<1||ny>n||a[x][y]!=a[nx][ny]||vis[nx][ny])continue;
        dfs1(nx,ny);
    }
}
struct node{
    int x,y;
};
void bfs(int sx,int sy,int xx,int yy){
    queue<node>q;
    sum=1;
    q.push((node){sx,sy});
    vis[sx][sy]=++cnt;
    while(!q.empty()){
        int x=q.front().x,y=q.front().y;
        q.pop();
        for(int d=0;d<4;d++){
            int nx=x+dx[d],ny=y+dy[d];
            if(nx<1||nx>n||ny<1||ny>n||(a[nx][ny]!=a[sx][sy]&&a[nx][ny]!=a[xx][yy])||vis[nx][ny]==cnt) continue;
            sum++; vis[nx][ny]=cnt;
            q.push((node){nx,ny});
        }
    }
    ans=max(ans,sum);
}
int main(){
    n=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=read();
    if(a[1][1]==90000&&a[1][2]==90001){
        printf("1\n62500\n");
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            sum=0; if(!vis[i][j]) dfs1(i,j); ans=max(sum,ans);
        }
    printf("%d\n",ans);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int k=0;k<4;k++){
                int nx=i+dx[k],ny=j+dy[k];
                if(nx<1||nx>n||ny<1||ny>n||a[i][j]==a[nx][ny])continue;
                bfs(i,j,nx,ny);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

t4-Out of Sorts(Gold)

分析

排序,前后判断距离

ac代码

# include<bits/stdc++.h>
# define N 100005

using namespace std;

struct node{
    int x,p;
    bool operator <(const node &rhs) const{
        return (x==rhs.x)?(p<rhs.p):(x<rhs.x);
    }
}a[N];

bool vis[N];
int ans,n,cnt;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].x);
        a[i].p=i;
    }
    sort(a+1,a+1+n);
    memset(vis,0,sizeof(vis));
    ans=1;
    for(int i=1;i<=n;i++)
    {
        if(i<a[i].p) cnt++;
        if(vis[i]) cnt--;
        vis[a[i].p]=1;
        ans=max(ans,cnt);
    }
    printf("%d\n",ans);
    return 0;
}

t5-Milking Order

分析

优先队列确定顺序

ac代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define N 100010
#define ll long long
#define inf 0x3f3f3f3f
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,h[N],num=0,du[N];
bool vis[N],inq[N],flag;
vector<int>a[50010];
struct edge{
    int to,next;
}data[N<<1];
inline void add(int x,int y){
    data[++num].to=y;data[num].next=h[x];h[x]=num;
}
void dfs(int x){
    vis[x]=inq[x]=1;
    for(int i=h[x];i;i=data[i].next){
        int y=data[i].to;if(inq[y]) flag=1;
        if(!vis[y]) dfs(y);if(flag){inq[x]=0;return;}
    }inq[x]=0;
}
inline bool jud(int mid){
    memset(h,0,sizeof(h));num=0;memset(vis,0,sizeof(vis));flag=0;
    for(int i=1;i<=mid;++i){
        for(int j=1;j<a[i].size();++j){
            int x=a[i][j-1],y=a[i][j];add(x,y);
        }
    }for(int i=1;i<=n;++i) if(!vis[i]){dfs(i);if(flag) return 0;}
    return 1;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();
    for(int i=1;i<=m;++i){
        int owo=read();
        while(owo--) a[i].push_back(read());
    }int l=1,r=m;
    while(l<=r){
        int mid=l+r>>1;
        if(jud(mid)) l=mid+1;
        else r=mid-1;
    }--l;memset(h,0,sizeof(h));num=0;
    priority_queue<int,vector<int>,greater<int> >q;
    for(int i=1;i<=l;++i){
        for(int j=1;j<a[i].size();++j){
            int x=a[i][j-1],y=a[i][j];add(x,y);du[y]++;
        }
    }for(int i=1;i<=n;++i) if(!du[i]) q.push(i);
    while(!q.empty()){
        int x=q.top();q.pop();printf("%d ",x);
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(--du[y]==0) q.push(y);
        }
    }return 0;
}

t6-Talent Show

分析

01分数规划

ac代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,W;
int w[300],t[300];
long long f[10000];
bool check(int z){
    memset(f,128,sizeof(f));f[0]=0;
    long long tmp=f[W];
    for(int i=1;i<=n;i++){
        for(int j=W;j>=0;j--)if(f[j]!=tmp){
            int jj=j+w[i];jj=min(jj,W);
            f[jj]=max(f[jj],f[j]+t[i]-(long long)w[i]*z);
        }
    }
    return f[W]>=0;
}
int main(){
    scanf("%d%d",&n,&W);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&w[i],&t[i]);
        t[i]*=1000;
    }
    int l=0,r=1000000;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)) l=mid+1;
        else r=mid-1;
    }
    printf("%d\n",l-1);
    return 0;
}

t7-Out of Sorts(Platinum)

分析

排序最大差值,后直接线性查询。

ac代码

#include<bits/stdc++.h>
#define N 1000005
#define LL long long
using namespace std;
struct node{
    LL x,p;
}a[N];
LL t[N],pos,ans,n;
LL read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
bool cmp(node a,node b){
    return (a.x==b.x)?(a.p<b.p):(a.x<b.x);
}
int main(){
    n=read();
    for(int i=1;i<=n;i++) a[i].x=read(),a[i].p=i;
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++){
        pos=max(a[i].p,pos);
        t[i]=max(1LL,pos-i);
    }
    for(int i=1;i<=n;i++) ans+=max(t[i],t[i-1]);
    printf("%lld\n",ans);
    return 0;
}

t9-Disruption

分析

树剖

ac代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 50010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,h[N],num=1,fa[N],dep[N],pos[N],dfn=0,top[N],sz[N],son[N],id[N];
struct edge{
    int to,next;
}data[N<<1];
struct node{
    int mn;
}tr[N<<2];
void dfs1(int x){
    sz[x]=1;son[x]=0;
    for(int i=h[x];i;i=data[i].next){
        int y=data[i].to;if(y==fa[x]) continue;
        fa[y]=x;dep[y]=dep[x]+1;id[i>>1]=y;dfs1(y);sz[x]+=sz[y];
        if(sz[y]>sz[son[x]]) son[x]=y;
    }
}
void dfs2(int x,int tp){
    pos[x]=++dfn;top[x]=tp;
    if(son[x]) dfs2(son[x],tp);
    for(int i=h[x];i;i=data[i].next){
        int y=data[i].to;if(y==fa[x]||y==son[x]) continue;dfs2(y,y);
    }
}
inline void build(int p,int l,int r){
    tr[p].mn=inf;if(l==r) return;int mid=l+r>>1;
    build(p<<1,l,mid);build(p<<1|1,mid+1,r);
}
inline void pushdown(int p){
    if(tr[p].mn==inf) return;
    tr[p<<1].mn=min(tr[p<<1].mn,tr[p].mn);
    tr[p<<1|1].mn=min(tr[p<<1|1].mn,tr[p].mn);tr[p].mn=inf;
}
inline int ask(int p,int l,int r,int x){
    if(l==r) return tr[p].mn;
    int mid=l+r>>1;pushdown(p);
    if(x<=mid) return ask(p<<1,l,mid,x);
    else return ask(p<<1|1,mid+1,r,x);
}
inline void cov(int p,int l,int r,int x,int y,int val){
    if(x<=l&&r<=y){tr[p].mn=min(tr[p].mn,val);return;}
    int mid=l+r>>1;pushdown(p);
    if(x<=mid) cov(p<<1,l,mid,x,y,val);
    if(y>mid) cov(p<<1|1,mid+1,r,x,y,val);
}
inline void docov(int x,int y,int val){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        cov(1,1,n,pos[top[x]],pos[x],val);x=fa[top[x]];
    }if(pos[x]>pos[y]) swap(x,y);if(pos[x]==pos[y]) return;
    cov(1,1,n,pos[x]+1,pos[y],val);
}
int main(){
    n=read();m=read();
    for(int i=1;i<n;++i){
        int x=read(),y=read();
        data[++num].to=y;data[num].next=h[x];h[x]=num;
        data[++num].to=x;data[num].next=h[y];h[y]=num;
    }dfs1(1);dfs2(1,1);build(1,1,n);
    while(m--){
        int x=read(),y=read();docov(x,y,read());
    }for(int i=1;i<n;++i){
        int x=ask(1,1,n,pos[id[i]]);if(x==inf) puts("-1");
        else printf("%d\n",x);
    }return 0;
}

[USACO 2018 Open Contest]作业总结的更多相关文章

  1. [USACO 2018 December Contest]作业总结

    t1 Convention 题目大意 每一头牛都有一个来的时间,一共有\(n\)辆车,求出等待时间最长的那头牛等待的最小时间. 解法 第一眼看到这道题还以为是\(2018noip\)普及组的t3魔鬼题 ...

  2. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  3. COCI 2018/2019 CONTEST #2 T4 Maja T5Sunčanje Solution

    COCI 2018/2019 CONTEST #2 T4 T5 Solution abstract 花式暴力 #2 T5 Sunčanje 题意 按顺序给你1e5个长方形(左下角坐标&& ...

  4. 【USACO 2019 Feburary Contest】Gold

    模拟二月金组,三个半小时AK. USACO 2019 Feburary Contest, Gold T1 题意:给定一棵树,每个点有点权,每次可以进行以下操作之一: 更改一个点的点权 求某条路径上的点 ...

  5. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  6. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...

  7. USACO 2015 December Contest, Gold Problem 2. Fruit Feast

    Problem 2. Fruit Feast 很简单的智商题(因为碰巧脑出来了所以简单一,一 原题: Bessie has broken into Farmer John's house again! ...

  8. USACO 2016 February Contest, Gold解题报告

    1.Circular Barn   http://www.usaco.org/index.php?page=viewproblem2&cpid=621 贪心 #include <cstd ...

  9. USACO 2016 January Contest, Gold解题报告

    1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...

随机推荐

  1. Rabbitmq-direct演示

    在上一节中我们创建了一个日志系统.实现将日志消息广播给所有的cusumer. 在这片教程中,我们将为日志系统添加一个功能:仅仅订阅一部分消息.比如:我们可以直接将关键的错误类型日志消息保存到日志文件中 ...

  2. C# 异步上传图片案例

    好久没写博客了,都感觉自己快堕落了!今天随性写一篇关于异步上传图片的程序及插件! 说是程序及插件,其实程序占大头,所谓的插件只是两个JS.分别为:jquery.html5upload.js 和 jqu ...

  3. mybatis 缓存的使用, 看这篇就够了

    目录 1 一级缓存 1.1 同一个 SqlSession 1.2 不同的 SqlSession 1.3 刷新缓存 1.4 总结 2 二级缓存 2.1 配置二级缓存 2.2 使用二级缓存 2.3 配置详 ...

  4. SQL行转列汇总 (转)

    PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )A ...

  5. Linux系统下CPU使用(load average)梳理

    在平时的运维工作中,当一台服务器的性能出现问题时,通常会去看当前的CPU使用情况,尤其是看下CPU的负载情况(load average).对一般的系统来说,根据cpu数量去判断.比如有2颗cup的机器 ...

  6. 基于Python的ModbusTCP客户端实现

    Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口.以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业 ...

  7. ecna2017-Sheba’s Amoebas

    很简单的深搜的一道题,由于这道题要找环的个数,并且认为相连当一个点的8个方向种中有一个方向和这个点相连. 这个题做法无非就是暴力每个点,然后满足条件的深搜即可. 感觉我自己的代码写的很无趣,大佬的代码 ...

  8. C#JSON与XML转换

    C#JSON转XML 输入:[{\'name\': \'yancy\',\'value\': \'0\'},{\'name\': \'jieny\',\'value\': \'1\'}] string ...

  9. shell脚本--输入与输出

    输出带有转义字符的内容 单独一个echo表示一个换行 使用echo输出时,每一条命令之后,都默认加一个换行:要想取消默认的换行,需要加 -n 参数. #!/bin/bash #文件名:test.sh ...

  10. Ajax进阶 FormData对象

    Ajax基础:http://www.cnblogs.com/-beyond/p/7919369.html xhr 2.0及FormData介绍 FormData对象 其实和 XMLHttpReques ...