11.08练习赛

11.08练习赛

T1 吃糖

这道题没有什么好说的,从100枚举到2,用\(N^2\)的搜索暴力\(Check\)即可。

然而我打爆了

最后发现是在dfs2里条件判断错误。

我真是个憨憨

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
char *p1,*p2,buf[1<<20];
//#define GC (p1==p2&&(p1=buf,p2=buf+fread(buf,1,1<<20,stdin),p1==p2)?0:(*(p1++)))
#define GC getchar()
#define ri register int
inline int in()
{
    int w=0,x=0;
    char ch=0;
    while(!isdigit(ch)){
        w|=ch=='-';
        ch=GC;
    }
    while(isdigit(ch)){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=GC;
    }
    return w? -x:x;
}
int r,c;
int a[110][110];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int _max;
int cut=0;
struct point{
    int x,y;
};
queue<point>q;
bool vis[110][110];
bool vis1[110][110];
void dfs(int x,int y,int k)
{
    vis[x][y]=1;
    cut+=1;
    int i;
    for(i=0;i<4;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if(vis[tx][ty])continue;
        if(tx==0||tx==r+1||ty==0||ty==c+1)continue;
        if(a[tx][ty]<k)continue;
        dfs(tx,ty,k);
    }
    return;
}
int dfs1(int x,int y)
{
    vis1[x][y]=1;
    int i;
    int k=1;
    for(i=0;i<4;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if(vis[tx][ty])continue;
        if(vis1[tx][ty])continue;
        if(tx==0||tx==r+1||ty==0||ty==c+1)continue;
        k+=dfs1(tx,ty);
    }
    return k;
}
bool check(int x)
{
    memset(vis,0,sizeof(vis));
    memset(vis1,0,sizeof(vis1));
    int i,j;
    cut=0;
    for(i=1;i<=c;i++){
        if(a[1][i]>=x)q.push((point){1,i});
        if(a[r][i]>=x)q.push((point){r,i});
    }
    for(i=1;i<=r;i++){
        if(a[i][1]>=x)q.push((point){i,1});
        if(a[i][c]>=x)q.push((point){i,c});
    }
    while(q.size()){
        int A=q.front().x,B=q.front().y;
        q.pop();
        if(vis[A][B])continue;
        dfs(A,B,x);
    }
    for(i=1;i<=r;i++)
    {
        for(j=1;j<=c;j++)
        {
            if(!vis[i][j]){
                int k=dfs1(i,j);
                if(k==r*c-cut){
                    return 0;
                }
                else return 1;
            }
        }
    }
    return 0;
}
bool inf[110];
int main()
{
//  freopen("candies.in","r",stdin);
//  freopen("candies.out","w",stdout);
    r=in();c=in();
    ri i,j;
    for(i=1;i<=r;i++)
    {
        for(j=1;j<=c;j++)
        {
            a[i][j]=in();
            inf[a[i][j]]=1;
            _max=max(_max,a[i][j]);
        }
    }
    for(i=_max;i>=2;i--)
    {
        if(check(i)){
            printf("%d\n",i);
            return 0;
        }
    }
    printf("-1\n");
    return 0;
}

T2 卡片

题面是真的长,而且大部分都没用

稍微描述一下题面:

其实就是一个三关键字排序,问最多能选出多少个连续的数集。

听liudl带佬说是三维偏序,于是我打了个二位数点(逃

首先膜一下Qhr带佬,他居然是(本人所知)全小机房唯一一个想出来可以用图论来搞这道题人。而这也是本题的正解(之一)。能拿20那种

(具体做法是把所有\(p_i<p_j\)的点连起来,然后跑最长路)

正解是用一个叫做CDQ分治的东西把三维转换成二维。然而我并不会

还有一个正解就是把20分做法和80分做法整合起来,就能A掉了。

注:在这种小规模的最短/长路中最好用SPFA,又短又好写而且小数据绝对卡不掉。(关于SPFA:他活了)

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
char *p1,*p2,buf[1<<20];
//#define GC (p1==p2&&(p1=buf,p2=buf+fread(buf,1,1<<20,stdin),p1==p2)?0:(*(p1++)))
#define GC getchar()
inline int in() {
    int x=0,w=0;
    char ch=0;
    while(!isdigit(ch)) {
        w|=ch=='-';
        ch=GC;
    }
    while(isdigit(ch)) {
        x=(x<<3)+(x<<1)+(ch^48);
        ch=GC;
    }
    return w? -x:x;
}
inline int lowbit(int x) {
    return x&(-x);
}
const int maxn= 1e6 + 5;
struct node {
    int x,y,z;
} g[maxn];
int _max;
int n;
namespace s1 {
    bool cmp(node a,node b) {
        if(a.x!=b.x)return a.x<b.x;
        else return a.y<b.y;
    }
    int sum[1000010];
    void ins(int x,int k) {

        for(; x<=maxn; x+=lowbit(x)) {
            sum[x]=max(sum[x],k);
            if(x==0)break;
        }
        return;
    }
    int gs(int x) {
        int res=0;
        for(;;x-=lowbit(x)) {
            res=max(res,sum[x]);
            if(x==0)break;
        }
        return res;
    }
    void s1() {
        sort(g+1,g+n+1,cmp);
        int ans=0;
        for(int i=1; i<=n; ++i) {
            int v=g[i].y;
            ins(v,gs(v)+1);
            ans=max(ans,gs(v));
        }
        printf("%d\n",ans);
        return;
    }
}
namespace s2 {
    struct edge {
        int to,next;
    } e[maxn*2];
    int head[maxn],cnt;
    void add(int from,int to) {
        e[++cnt].next=head[from];
        e[cnt].to=to;
        head[from]=cnt;
    }
    int ans=0;
    bool inq[maxn];
    int dis[maxn];
    queue<int>q;
    void spfa(int x)
    {
        for(int i=1;i<=n;i++)dis[i]=inq[i]=0;
        q.push(x);
        inq[x]=1;
        while(q.size()){
            int u=q.front();
            q.pop();
            inq[u]=0;
            for(int i=head[u];i;i=e[i].next){
                int v=e[i].to;
                if(dis[u]+1>dis[v]){
                    dis[v]=dis[u]+1;
                    if(!inq[v]){
                        q.push(v);
                        inq[v]=1;
                    }
                }
            }
        }
    }
    void s2() {
        int i,j;
        for(i=1; i<=n; i++) {
            for(j=1; j<=n; j++) {
                if(i==j)continue;
                if(g[i].x<=g[j].x&&g[i].y<=g[j].y&&g[i].z<=g[j].z){
                    add(i,j);
                }
            }
        }
        for(i=1; i<=n; i++) {
            spfa(i);
            for(j=1;j<=n;j++)
            {
                ans=max(ans,dis[j]+1);
            }
        }
        printf("%d\n",ans);
        return;
    }
}
int main() {
    bool if0=1;
    n=in();
    for(int i=1; i<=n; ++i) {
        g[i].x=in();
        g[i].y=in();
        g[i].z=in();
        if(g[i].z!=0)if0=0;
        _max=max(g[i].y,_max);
    }
    if(if0) {
        s1::s1();
        return 0;
    } else {
        s2::s2();
        return 0;
    }
}

这次想装一下B所以用了用namespace,好孩子不要学

原文地址:https://www.cnblogs.com/cooper233/p/11828758.html

时间: 2024-10-12 20:03:06

11.08练习赛的相关文章

使用 VS2013 Update 4 编译 NASM 2.11.08

1. 下载 nasm-2.11.08.zip (here/here) 解压至本地 2. 开始 -> Visual Studio 2013 -> Visual Studio 2013 Tools -> Developer Command Prompt for VS2013 cd 到 NASM 所在路径 参照 Mkfiles\README,执行 nmake /f Mkfiles/msvc.mak 3. 编译成功 完整编译包,如需减小exe大小,可在 makefile 中加上 compiler

&lt;转载&gt;C#与JAVA的区别 http://www.cnblogs.com/Asa-Zhu/archive/2012/11/08/2761114.html

C#(C-Sharp)是Microsoft的新编程语言,被誉为“C/C++家族中第一种面向组件的语言”.然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用来替代Java的产品.事实是否是这样的呢? 本文的比较结果表明,C#不止是Java的同胞那么简单.如果你是一个Java开发者,想要学习C#或者了解更多有关C#的知识,那么本文就是你必须把最初10分钟投入于其中的所在. 一.C#.C++和Java C#的语言规范由Microsoft的Anders He

我关注的一周技术动态 2015.11.08

分布式系统实践 1. 为什么大部分NoSQL不提供分布式事务? http://www.jdon.com/47671?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 要点: 市面上各种NoSQL数据库种类繁多, 但是大部分NoSQL数据库都不提供分布式事务, 我也经常听到有些同学评价某些NoSQL数据库的缺点时就是说不提供分布式事务. 分布式事务不是实现不了, 而是代价较高, 本文介绍了实现分布式事务需要做出的牺牲和取舍

爬虫基础学习 转【http://www.cnblogs.com/huangxincheng/archive/2012/11/08/2759752.html】

这一篇我们聊聊在页面抓取时应该注意到的几个问题. 一:网页更新 我们知道,一般网页中的信息是不断翻新的,这也要求我们定期的去抓这些新信息,但是这个“定期”该怎么理解,也就是多长时间需要 抓一次该页面,其实这个定期也就是页面缓存时间,在页面的缓存时间内我们再次抓取该网页是没有必要的,反而给人家服务器造成压力. 就比如说我要抓取博客园首页,首先清空页面缓存, 从Last-Modified到Expires,我们可以看到,博客园的缓存时间是2分钟,而且我还能看到当前的服务器时间Date,如果我再次 刷新

2017/11/08 胡策 T3

一个长为 n 的链,点权分别为 1 ~ n,最左边的点权为 n,最右边的点权为 1,每个点分别向左边和右边第一个比它大的点连长为 1 的无向边,问任意两点的最短路径.1 <= n <= 100000. 考虑连边的性质,两点的最短路径一定是点权递增或先增后减,所以相当于由点权小的向点权大的连有向边,每次询问时两点同时往上跳,跳到同一个点终止.设向左连的边构成左树,向右连的构成右树,则两点可能的终点只有三个:左树 lca.右树 lca.左树和右树到根路径的交点(即两点所夹区间最大值的位置). 考虑

11.05练习赛

手机码的,没用数学公式,可能阅读体验较差,见谅 1105练习赛 T1 斩杀计划 题目大意: 对一个数列有三种操作: 1.取出数列中一个小于等于2的数放入集合中,花费为1 2.取出数列中一个小于等于3的数放入集合中,花费为4 3.将数列中所有的数减去3,花费为1 现给出这个数列,要求在操作三最小的情况下,求出令集合中数大于等于m时最小的花费. 输出最小操作次数及此时的最小花费 给出的数列中所有数小于等于30000, m小于等于5000000,数列中数的个数在5000000以内. 没想到没想到没想到

2015.11.08

书写高效的CSS 一.使用高效是CSS ①:使用外联样式替代行间样式或内嵌样式. 不推荐使用内联样式:<style></style> 不推荐使用内嵌样式:<p style=""></p> 推荐使用外联样式:<link href=""> ②:为了兼容老版本的浏览器,建议使用link引入外部样式表的方式替代@import导入样式的方式.@import是css2.1提出来的,所以老的浏览器不支持. 不推荐@imp

11.08 轮换行值

select e.ename,e.sal,coalesce((select min(sal) from emp d where d.sal>e.sal),(select min(sal) from emp)) as forware,coalesce((select max(sal) from emp d where d.sal<e.sal),(select max(sal) from emp)) as rewindfrom emp eorder by 2;

周记 2014.11.08

1.GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统. 2.数据库中表比较大,查询比较慢时,可以考虑缓存.缓存包括缓存到内存和硬盘(文件). 3.学会思考,你的项目的关键点在哪,效率的关键点. 4.最终使用的jdk是看这个程序里面定义的JAVA_HOME,如果这个程序没有自己定义,默认使用用户的JAVA_HOME,用户再没定义,才使用系统的 JAVA_HOME,  因此,控制JAVA_HOME的地方多的是,方法多