Codeforces Round #567 (Div. 2)D. Irrigation(思维+二分)

简介: 【6月更文挑战第11天】

链接

题意:

给定 $M$ 个城市,每年会选出一个城市举办比赛,现给出前 $N$年城市举办比赛的情况。在接下来的年份中,每年的比赛会在举办比赛次数最小的城市举办,如果有很多城市举办次数均为最小值,则在编号最小的城市举办比赛。现给出 $Q$ 个询问,每次询问第 $K$ 年在哪个城市举办比赛。 $N+1 \le K \le 1e18, 1\le M,N,Q \le 5e5$

分析:

首先我们能想到将其前n个填充到一个这$m$个里面,找到最高点然后高度乘以m,如果超过这个数答案就是,(k-1)%m+1,那如果在这个数之内那?

我们知道我们填充数的时候,先找最矮的,就是出现次数最少的,之后,一样找编号小的,那么我们可以先那前n个提取出来,然后将其前空的个数算出来,之后就可以直接算了。

ll n,m,q;
ll a[maxn],c[maxn];
void solve()
{
   
   
    scanf("%lld%lld%lld",&n,&m,&q);
    for(int i=1;i<=n;i++){
   
   
        ll k;
        scanf("%lld",&k);
        a[i]=(c[k]++)*m+k;
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++) a[i]-=i;
    while(q--){
   
   
        ll k;
        scanf("%lld",&k);
        k+=lower_bound(a+1,a+n+1,k-n)-a-1-n;
        printf("%lld\n",(k-1)%m+1);
    }    
}

A - Blood Pressure

正常求即可

B - Cycle Hit

两层for判断有没有重复的

C - chokudai

动态转移:出现第一个字符++,后面没出现一个字符加上前一字符的数量。 别忘了$mod\ 1e9+7$

D - Number of Shortest paths

最短路来做,遇到等于当前最短路的 加上有这条路径来的最短路径。
1-2 1-3 1-4 2-5 3-5 4-5 5-6 5- 7 5-8 6-9 7-9 8-9
在这里插入图片描述
成这样形状,可知到达5的最短路径的种数一共3种 5-6那也是3种同理5-7 三种 5-8 三种
那么从6 ,7,8到9,路径长度都一样切都是最短的,那么把这三条路径上过来的种数求和即可,注意标记点走过的和已入队列的就不要在入队列了。

ll n,m;
vector <ll> v[maxn];
ll cnt[maxn],dis[maxn],vis[maxn];
void dfs(){
   
   
    queue<ll> q;
    q.push(1);
    cnt[1]=1;
    dis[1]=0;
    vis[1]=1;
    while(!q.empty()){
   
   
        ll top=q.front();
        q.pop();
        for(int i=0;i<(int)v[top].size();i++){
   
   
            ll u=v[top][i];
            if(dis[u]==dis[top]+1){
   
   
                cnt[u]=(cnt[u]+cnt[top])%mod;
                if(!vis[u])    q.push(u),vis[u]=1;
            }else if(dis[u]>dis[top]+1){
   
   
                dis[u]=dis[top]+1;
                cnt[u]=cnt[top];
                if(!vis[u])    q.push(u),vis[u]=1;
            }

        }
    }
}
void solve()
{
   
   
    memset(dis,0x3f,sizeof dis);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
   
   
        ll a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs();
    cout<<cnt[n]<<endl;    

}

E - Red Polyomino

注意数据范围为8*8所以我们可以直接暴搜,但是需要标记,我们可以用int128 ,当然也可以用组合string的方法,我记得好像也可以用vector来维护。上面说的这三种都是用map来标记。
性质还是都一样的。但是如果来个更大的__int128 可能就不能够维护了。这个其实是64位维护还行。蓝桥杯记得有一道map维护string 维护状态。

///string
map<string,bool>mp;
ll a[100];
ll ans,n,k;
ll dp[10][10];

void get(ll pos, ll &x, ll &y) {
   
   
    pos -= 1;
    x = pos / n + 1;
    y = pos % n + 1;
}
void dfs(ll cnt){
   
   
    if(cnt==k) {
   
   
        ans++;
        return ;
    }
    for(ll i=1;i<=n*n;i++){
   
   
        ll x,y;
        get(i,x,y);
        if(dp[x][y] == 2 ||dp[x][y]==1)continue;
        bool flag = false;
        for(ll j=1;j<=4;j++){
   
   
            ll fx=dx[j]+x;
            ll fy=dy[j]+y;
            if(fx>=1&&fx<=n&&fy>=1&&fy<=n&&dp[fx][fy]==2) flag=true;
        }
        if(flag || cnt ==0 ){
   
   
            ll b[100];
            for(int j=0;j<=64;j++){
   
   
                b[j]=a[j];
            }
            a[i] |= 1;
            string s="";
            for(int j=0;j<=64;j++){
   
   
                s+=char(a[j]);
            }
            if(mp[s]) {
   
   
                for(int j=0;j<=64;j++) a[j]=b[j];
            }
            else {
   
   
                mp[s]=1;
                dp[x][y]=2;
                dfs(cnt+1);
                dp[x][y]=0;
                for(int j=0;j<=64;j++) a[j]=b[j];
            }
        }        
    }
}

void solve()
{
   
   
    ios::sync_with_stdio(false);
    string s;
    cin >> n >> k;
    ans = 0;
    for (int i = 1; i <= n; i++) {
   
   
        cin >> s;
        for (int j = 0; j < n; j++) {
   
   
            if (s[j] == '#') {
   
   
                dp[i][j + 1] = 1;
            }
            if (s[j] == '.') {
   
   
                dp[i][j + 1] = 0;
            }
        }
    }

    dfs(0);
    cout<<ans<<endl;

}
///__int128
unordered_map<__int128,bool>mp;

ll ans,n,k;
ll dp[10][10];
void get(ll pos, ll &x, ll &y) {
   
   
    pos -= 1;
    x = pos / n + 1;
    y = pos % n + 1;
}
void dfs(ll cnt,__int128 num){
   
   
    if(cnt==k) {
   
   
        ans++;
        return ;
    }
    for(ll i=1;i<=n*n;i++){
   
   
        ll x,y;
        get(i,x,y);
        if(dp[x][y] == 2 ||dp[x][y]==1)continue;
        bool flag = false;
        for(ll j=1;j<=4;j++){
   
   
            ll fx=dx[j]+x;
            ll fy=dy[j]+y;
            if(fx>=1&&fx<=n&&fy>=1&&fy<=n&&dp[fx][fy]==2) flag=true;
        }
        if(flag || cnt ==0 ){
   
   
            __int128 num1=num;
            num1 |=((__int128)1<<i);
            if(mp[num1]) continue;
            mp[num1]=1;
            dp[x][y]=2;
            dfs(cnt+1,num1);
            dp[x][y]=0;
        }

    }
}

void solve()
{
   
   
    ios::sync_with_stdio(false);
    string s;
    cin >> n >> k;
    ans = 0;

    for (int i = 1; i <= n; i++) {
   
   
        cin >> s;
        for (int j = 0; j < n; j++) {
   
   
            if (s[j] == '#') {
   
   
                dp[i][j + 1] = 1;
            }
            if (s[j] == '.') {
   
   
                dp[i][j + 1] = 0;
            }
        }
    }

    dfs(0,(__int128)0);
    cout<<ans<<endl;

}
目录
相关文章
|
SQL 前端开发 数据可视化
MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南
MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库。有关 MySQL 远程管理软件,你可以选择 Windows 下的 HeidiSQL,MacOS 下的 Sequel Ace 或者 MySQL 官方推出的跨平台客户端 MySQL Workbench 。
11873 0
|
存储 安全 C语言
在C++ 中慎用setjmp和longjmp
在C++ 中慎用setjmp和longjmp
114 0
|
JSON 前端开发 JavaScript
前端老司机 70+ 实用工具网站分享(建议收藏!)🔥🔥(下)
前言 大家好,我是HoMeTown,好的工具,可以帮助我们大幅提高编程效率,今天给大家分享一下我平时收集到的一些工具,目录已经分好了。
180 0
|
机器学习/深度学习 弹性计算 人工智能
带你读《弹性计算—无处不在的算力》第三章:计算产品和技术3.4 异构计算云服务和AI 加速器(三)
《弹性计算—无处不在的算力》第三章:计算产品和技术3.4 异构计算云服务和AI 加速器(三)
1045 0
带你读《弹性计算—无处不在的算力》第三章:计算产品和技术3.4 异构计算云服务和AI 加速器(三)
|
编解码 数据挖掘 Go
Google Earth Engine ——数据全解析专辑(US NED Physiographic Diversity地貌多样性数据集)
Google Earth Engine ——数据全解析专辑(US NED Physiographic Diversity地貌多样性数据集)
172 0
Google Earth Engine ——数据全解析专辑(US NED Physiographic Diversity地貌多样性数据集)
|
Python
FastAPI 学习之路(二十三)用类作为依赖的注入
FastAPI 学习之路(二十三)用类作为依赖的注入
FastAPI 学习之路(二十三)用类作为依赖的注入
|
存储 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 23 章 本地化
第 23 章 本地化 目录 23.1. 区域支持 23.1.1. 概述 23.1.2. 行为 23.1.3. 问题 23.2. 排序规则支持 23.2.1. 概念 23.2.2. 管理排序规则 23.3. 字符集支持 23.3.1. 被支持的字符集 23.3.2. 设置字符集 23.3.3. 服务器和客户端之间的自动字符集转换 23.3.4. 进一步阅读 本章从管理员的角度描述可用的本地化特性。
1256 0