CodeForces 659F Polycarp and Hay

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-6;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c=getchar(); x=0;
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) {x=x*10+c-‘0‘; c=getchar();}
}

const int maxn=1010;
int n,m,sz,c; LL k;
struct X { int r,c; LL v; }s[maxn*maxn];
int fa[maxn*maxn],a[maxn][maxn],cnt[maxn*maxn]; LL ans[maxn][maxn];
bool f[maxn][maxn],q;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int Find(int x)
{
    if(x!=fa[x]) fa[x]=Find(fa[x]);
    return fa[x];
}

bool cmp(X a,X b) { return a.v<b.v; }

void work(int a,int b)
{
    if(b<0||b>=n*m) return;

    int fx=Find(a),fy=Find(b);

    if(f[b/m][b%m]==0) return;

    if(fx==fy) return;
    fa[fy]=fx;
    cnt[fx]=cnt[fx]+cnt[fy]; cnt[fy]=0;
}

bool check(int a,int b)
{
    if(a>=0&&a<n&&b>=0&&b<m) return 1;
    return 0;
}

void dfs(int x,int y,LL v,int f)
{
    c++; ans[x][y]=v; if(c>=f) return;
    for(int i=0;i<4;i++)
    {
        int tx=x+dir[i][0],ty=y+dir[i][1];
        if(!check(tx,ty)) continue;
        if(a[tx][ty]<v) continue;
        if(ans[tx][ty]!=0) continue;
        dfs(tx,ty,v,f); if(c>=f) return;
    }
}

int main()
{
    scanf("%d%d%lld",&n,&m,&k);
    for(int i=0;i<n*m;i++) fa[i]=i,cnt[i]=1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%lld",&a[i][j]);
            s[sz].r=i; s[sz].c=j; s[sz].v=a[i][j]; sz++;
        }
    }
    sort(s,s+sz,cmp);

    for(int j=sz-1; j>=0; j--)
    {
        int id1=s[j].r*m+s[j].c,id2;
        if(check(s[j].r-1,s[j].c))
        {
            id2=(s[j].r-1)*m+s[j].c;
            work(id1,id2);
        }
        if(check(s[j].r+1,s[j].c))
        {
            id2=(s[j].r+1)*m+s[j].c;
            work(id1,id2);
        }
        if(check(s[j].r,s[j].c-1))
        {
            id2=s[j].r*m+s[j].c-1;
            work(id1,id2);
        }
        if(check(s[j].r,s[j].c+1))
        {
            id2=s[j].r*m+s[j].c+1;
            work(id1,id2);
        }
        f[s[j].r][s[j].c]=1;

        int d=Find(id1);
        if(k%s[j].v==0&&(LL)cnt[d]>=k/s[j].v)
        {
            dfs(s[j].r,s[j].c,s[j].v,(int)(k/s[j].v));
            q=1; break;
        }
        if(q) break;
    }

    if(!q) { printf("NO\n"); return 0;}
    printf("YES\n");
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            printf("%lld",ans[i][j]);
            printf(" ");
        }
       printf("\n");
    }
    return 0;
}
时间: 2024-10-06 18:42:53

CodeForces 659F Polycarp and Hay的相关文章

Codeforces 861D - Polycarp&#39;s phone book

861D - Polycarp's phone book 思路:用map做的话,只能出现一次循环,否则会超时. 代码: #include<bits/stdc++.h> using namespace std; #define f first #define s second #define pb push_back #define mp make_pair map<string,int> ma; string ans[70005]; int main(){ int n; strin

CodeForces 1005D Polycarp and Div 3(思维、贪心、dp)

http://codeforces.com/problemset/problem/1005/D  题意: 给一个仅包含数字的字符串,将字符串分割成多个片段(无前导0),求这些片段里最多有多少是3的倍数 思路一(贪心): from:https://blog.csdn.net/islittlehappy/article/details/81006849 一个数是3的倍数,则各位的和能被3整除. 对于单独的一个数字,如果是3的倍数,则ans++ 否则,考虑连续的两个数字,如果是,则ans++ 如果第三

CodeForces 723C Polycarp at the Radio (题意题+暴力)

题意:给定 n 个数,让把某一些变成 1-m之间的数,要改变最少,使得1-m中每个数中出现次数最少的尽量大. 析:这个题差不多读了一个小时吧,实在看不懂什么意思,其实并不难,直接暴力就好,n m不大.很明显最后1-m中次数最长的应该是n/m, 所以我们把大于n/m的都变成小于等于的,把这 n 个数中大于 m 的也变成,但是并不需要都变,只要满足每个数都是大于等于n/m就好了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&

CodeForces 723C Polycarp at the Radio

构造. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #incl

CodeForces - 864B Polycarp and Letters

题意:已知长度为n的字符串,求最大的位置集合,使集合内的每个位置所对应的都是小写字母且各不相同,而且相邻位置间无大写字母. #include<bits/stdc++.h> #define Min(a, b) ((a < b) ? a : b) #define Max(a, b) ((a < b) ? b : a) typedef long long LL; typedef unsigned long long ULL; const int INT_INF = 0x3f3f3f3f;

【CF659F】Polycarp and Hay(并查集,bfs)

题意: 构造一个矩阵,使得: 矩阵所有格子中数字都小于等于原矩阵,并且至少有一个元素和原矩阵相等, 构造的矩阵除了0以外的数字必须联通并且相等,矩阵中元素之和为K. n,m<=1e3,1<=K<=1e18 思路: From https://blog.csdn.net/morejarphone/article/details/51037918 对每个格子的数字进行排序,那么一个格子的数字最多能够填的格子数就是他上下左右格子能够填的格子 数的和,这个可以用并查集来维护 然后枚举每个格子,如果

Codeforces VK Cup 2015 Wild Card Round 1 (AB)

比赛链接:http://codeforces.com/contest/522 A. Reposts time limit per test:1 second memory limit per test:256 megabytes One day Polycarp published a funny picture in a social network making a poll about the color of his handle. Many of his friends started

Codeforces Round #434 (Div. 2)

Codeforces Round #434 (Div. 2) codeforces 858A. k-rounding[水] 题意:已知n和k,求n的最小倍数x,要求x后缀至少有k个0. 题解:答案就是10^k和n的最小公倍数. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 typedef long

Codeforces Round #346 (Div. 2)

前三题水 A #include <bits/stdc++.h> typedef long long ll; const int N = 1e5 + 5; int main() { int n, a, b; std::cin >> n >> a >> b; int bb = b; if (b < 0) bb = -b; while (bb--) { if (b < 0) { a--; } else { a++; } if (a == 0) { a