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. WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选)

    原文:WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选) 前台代码 <DataGrid.Columns> <DataGridCheckB ...

  2. php WNMP(Windows+Nginx+Mysql+php)配置笔记

    下载安装 php 修改nginx 文件 参考云盘实例 eclipse php配置服务ip 127.0.0.1:999 以及项目路径(php解析路径)

  3. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  4. QT 遇到的问题

    遇到的问题: 1:在QT中使用opengl,发现一个很神奇的问题,个人感觉是qt的bug. 问题详情:在我添加了一个成员变量之后,使用opengl编写的窗口没有任何输出了,只有一个背景. 但是删除那个 ...

  5. ExtJs 编译

    前台使用Extjs加载源码的话是非常庞大的,编译之后就只加载一个app.js文件.这种技能如果不知道的话怕别人骂我不是个女程序员.哈哈哈哈哈. 打开cmd,进入程序Extjs的文件夹,如我的程序Ext ...

  6. restfull环境搭建-helloword(三)

    原文地址:http://only81.iteye.com/blog/1689537 This section creates a CRUD (Create, Read, Update, Delete) ...

  7. linux及安全第四周总结

    学习内容:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 一.用户态.内核态 权限分级——为了系统本身更稳定,使系统不宜崩溃.(并不是所有程序员缩写的代码都很健壮!!) x86 CP ...

  8. 《Linux内核设计与实现》读书笔记三

    Chapter 18 调 试 18.1 准备开始 1.准备工作: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2.执行foo就会让程序立即产生核心信息转储(dump core). ...

  9. 小学生四则运算APP核心代码公布

    Mainactivity类: package com.example.XXSCYS; import java.io.ByteArrayOutputStream; import java.io.File ...

  10. 作业6-COSPLAY孩子他家长

    为了我提高我女儿的数学能力,我以下我会根据我想要的功能做出相应的解决方案,为了孩子,父母也可以想的比老师周到.可怜天下父母心. 编号.          名称.                     ...