【POI1999】【BZOJ2936】降 水

Description
有这样一块土地,它可以被划分成N×M个正方形小块,每块面积是一平方英寸,第i行第j列的小块可以表示成P(i,j)。这块土地高低不平,每一小块地P(i,j)都有自己的高度H(i,j)(单位是英寸)。
一场倾盆大雨后,这块地由于地势高低不同,许多低洼地方都积存了不少降水。假如你已经知道这块土地的详细信息,你能求出它最多能积存多少立方英寸的降水么?

Input
输入文件第一行有两个数,N,M(1<=N, M <=100),表示土地的规模是N×M平方英寸。
以下有N行,每行有M个整数,表示每块地的高低(每个整数在[1,10000]内,以英寸为单位)。

Output
输出文件只有一行,一个数,表示土地中最多能积存多少立方英寸的水。

Sample Input
3 6
3 3 4 4 4 2
3 1 3 2 1 4
7 3 1 6 4 1

Sample Output
5
HINT

Source

把边界上的点插入一个以高度为关键字的大根堆然后扩展
Codevs上被卡内存了T_T

#include<iostream>
#include<cstdio>
#include<queue>
#define MAXN 102
#define GET (ch>='0'&&ch<='9')
using namespace std;
short n,m;
int ans;
short a[MAXN][MAXN],dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};
bool vis[MAXN][MAXN],Vis[MAXN][MAXN];
struct node
{
    short x,y,h;
    bool operator <(const node& a)const
    {return h>a.h;}
};
priority_queue<node>    heap;
void in(short &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
void dfs(short x,short y,short h)
{
    for (short i=1;i<=4;i++)
    {
        short X=x+dx[i],Y=y+dy[i];
        if (vis[X][Y])  continue;
        if (a[X][Y]<=h) ans+=h-a[X][Y],vis[X][Y]=1,dfs(X,Y,h);
        else
        if (!Vis[X][Y]) Vis[X][Y]=1,heap.push((node){X,Y,a[X][Y]});
    }
}
int main()
{
    in(n);in(m);
    for (short i=0;i<=n+1;i++)
        for (short j=0;j<=m+1;j++)  vis[i][j]=Vis[i][j]=1;
    for (short i=1;i<=n;i++)
        for (short j=1;j<=m;j++)
        {
            in(a[i][j]);vis[i][j]=0;Vis[i][j]=0;
            if (i==1||i==n||j==1||j==m) Vis[i][j]=1,heap.push((node){i,j,a[i][j]});
        }
    while (!heap.empty())
    {
        node t=heap.top();heap.pop();
        if (!vis[t.x][t.y]) vis[t.x][t.y]=1,dfs(t.x,t.y,t.h);
    }
    cout<<ans<<endl;
}
要在POI中为DOC文件添加印,可以使用以下步骤: 1. 创建一个带有文本的图片,作为印。可以使用Java的ImageIO类来创建一个图片,然后使用Graphics2D类在图片上绘制文本。 2. 打开要添加印的DOC文件。可以使用POI的HWPFDocument类来打开DOC文件。 3. 获取文档中的所有段落,并为每个段落添加印。可以使用POI的Range类来获取文档中的所有段落。 4. 对于每个段落,创建一个新的Run,并将印图片插入到Run中。可以使用POI的Picture类来创建一个图片,并将其插入到Run中。 5. 保存修改后的DOC文件。可以使用POI的HWPFDocument类将修改后的文档保存到磁盘中。 以下是使用POI为DOC文件添加印的示例代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Picture; import org.apache.poi.hwpf.usermodel.Range; public class AddWatermarkToDocFile { public static void main(String[] args) throws Exception { // Create watermark image BufferedImage watermarkImage = new BufferedImage(400, 100, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = watermarkImage.createGraphics(); g2d.setColor(Color.RED); g2d.fillRect(0, 0, 400, 100); g2d.setColor(Color.WHITE); g2d.setFont(new Font("Arial", Font.BOLD, 40)); g2d.drawString("CONFIDENTIAL", 50, 50); g2d.dispose(); // Open DOC file HWPFDocument doc = new HWPFDocument(new FileInputStream("input.doc")); // Add watermark to all paragraphs Range range = doc.getRange(); for (int i = 0; i < range.numParagraphs(); i++) { Picture watermark = new Picture(watermarkImage, Picture.PICTURE_TYPE_JPEG, "watermark", 400, 100); watermark.setDimensions(400, 100); range.getParagraph(i).insertNewRun(0).addPicture(watermark); } // Save modified DOC file doc.write(new FileOutputStream("output.doc")); doc.close(); } } ``` 在此示例中,我们创建了一个红色背景和白色文本的印图片,并将其添加到了所有段落中。修改后的文档将保存为“output.doc”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值