首页 > 其他分享 >构造数组

构造数组

时间:2022-11-12 15:36:24浏览次数:72  
标签:geq dist int head 构造 数组

构造数组

请你构造一个长度为 $n$ 的正整数数组 $a_1,a_2, \ldots ,a_n$。

我们会给出一个长度为 $n−1$ 的由 $<$、$>$、$=$ 组成的字符串 $s_1s_2 \ldots s_{n−1}$ 用于约束你的构造:

  • 如果 $s_i$ 为 $<$,则表示你构造的数组需满足 $a_i < a_{i+1}$。
  • 如果 $s_i$ 为 $>$,则表示你构造的数组需满足 $a_i > a_{i+1}$。
  • 如果 $s_i$ 为 $=$,则表示你构造的数组需满足 $a_i = a_{i+1}$。

你构造的正整数数组需满足上述约束的同时,保证 $a_1+a_2+ \ldots +a_n$ 的值尽可能小。

请你输出满足条件的正整数数组。数据保证一定有解

输入格式

第一行包含整数 $n$。

第二行包含字符串 $s_1s_2 \ldots s_{n−1}$。

输出格式

共一行,输出 $a_1,a_2, \ldots ,a_n$。

数据范围

前 $3$ 个测试点满足 $2 \leq n \leq 6$。
所有测试点满足 $2 \leq n \leq 1000$。

输入样例1:

5
><><

输出样例1:

2 1 2 1 2

输入样例2:

5
=<<<

输出样例2:

1 1 2 3 4

 

解题思路

  这是一道很经典的差分约束题,不过因为我不怎么熟悉所以比赛时没写出来。

  因为要求最小值,所以应该是建图跑最长路。为什么是求最长路呢,这是因为求最短路时有三角不等式,例如如果有$a \to b$,那么求完最短路就会有$d_b \leq d_a + w_{ab}$。因此求最长路的话只需要把不等符号反过来,就会得到$d_b \geq d_a + w_{ab}$。因此我们只要把原问题给的约束条件都转换为$a \geq b + c$这种形式,然后建图($b$到$a$连一条边,权值为$c$),跑最长路就可以了。

  • $a = b \Longleftrightarrow a \geq b + 0 \, \And \, b \geq a + 0$。
  • $a > b \Longleftrightarrow a \geq b + 1$。
  • $a < b \Longleftrightarrow b \geq a + 1$。

  另外,又因为每一个数都满足$a > 0$,等价于$a \geq 0 + 1$,因此我们可以规定$0$号点为超级原点,$d_0 = 0$。最后还需要建从$0$到所有点的权值为$1$的边。

  AC代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1010, M = N * 3;
 5 
 6 int head[N], e[M], wts[M], ne[M], idx;
 7 int dist[N];
 8 int vis[N];
 9 
10 void add(int v, int w, int wt) {
11     e[idx] = w, wts[idx] = wt, ne[idx] = head[v], head[v] = idx++;
12 }
13 
14 void spfa() {
15     queue<int> q({0});
16     while (!q.empty()) {
17         int t = q.front();
18         q.pop();
19         vis[t] = false;
20         
21         for (int i = head[t]; i != -1; i = ne[i]) {
22             if (dist[e[i]] < dist[t] + wts[i]) {
23                 dist[e[i]] = dist[t] + wts[i];
24                 if (!vis[e[i]]) q.push(e[i]), vis[e[i]] = true;
25             }
26         }
27     }
28 }
29 
30 int main() {
31     int n;
32     cin >> n;
33     memset(head, -1, sizeof(head));
34     for (int i = 1; i < n; i++) {
35         char c;
36         cin >> c;
37         if (c == '>') add(i + 1, i, 1);         // a > b <-> a >= b + 1
38         else if (c == '<') add(i, i + 1, 1);    // a < b <-> b >= a + 1
39         else add(i, i + 1, 0), add(i + 1, i, 0);// a = b <-> a >= b + 0 and b >= a + 0
40     }
41     for (int i = 1; i <= n; i++) {  // a > 0 <-> a >= 0 + 1
42         add(0, i, 1);
43     }
44     
45     spfa();
46     
47     for (int i = 1; i <= n; i++) {
48         cout << dist[i] << ' ';
49     }
50     
51     return 0;
52 }

 

参考资料

  AcWing 4715. 构造数组(AcWing杯 - 周赛):https://www.acwing.com/video/4525/

标签:geq,dist,int,head,构造,数组
From: https://www.cnblogs.com/onlyblues/p/16883838.html

相关文章

  • (在构造函数中)调用 super(props)的目的是什么?(必会)
    (在构造函数中)调用super(props)的目的是什么?(必会)点击查看代码在super()被调用之前,子类是不能使用this的,在ES2015中,子类必须在constructor中调用super()。传......
  • 除了在构造函数中绑定 this,还有其它方式吗?(必会)
    除了在构造函数中绑定this,还有其它方式吗?(必会)点击查看代码你可以使用属性初始值设定项(propertyinitializers)来正确绑定回调,create-react-app也是默认支持的。在回......
  • I/O多路复用器,数组、链表、红黑树
    IO多路复用指的是单个进程或者线程能同时处理多个IO请求,select,epoll,poll是LinuxAPI提供的复用方式。本质上由操作系统内核缓冲IO数据,使得单个进程线程能监视多个文件描述符......
  • 数组的复制、排序,查找
    一、数组的复制int[]re=Arrays.copyOf(nums,len)一、数组的排序,不用返回值接收,默认升序Arrays.sort(nums)二、数组查找参考:https://blog.csdn.net/weixin_386267......
  • 自定义函数二分法查找,数组问题
    intfind(intarr1[],intx,inty){intleft=0;intright=y-1;while(right>=left){if(x>arr1[(left+right)/2])left=(left+right)/2+1;elseif(x<arr1[(l......
  • 19. 数组的排序方式
    1.使用sort函数 格式:arr.sort((a,b)=>{a-b})2.封装函数,使用冒泡排序;vararr=[123,203,23,13,34,65,65,45,89,13,1];for(vari=0;i<arr.length......
  • C语言数组指针遍历二维数组
    #include<stdio.h>#include<stdlib.h>#include<string.h>intmain(void){inta[3][2]={{1,2},{3,4},{5,6}};int(......
  • 数组中只出现一次的两个数字
     import java.util.*;public class Solution {    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可     *......
  • 冒泡排序(数组中的问题)
    问题:使用冒泡排序的方法,将数组中的元素按照升序的方式将其排列。冒泡排序核心思想:两两相邻元素进行比较,满足条件则交换;     ①先确认趟数;     ②写下一趟冒泡......
  • 那些年被误解的指针和数组
    误解1:&运算符返回一个地址解释:  &叫做取址运算符,运算的结果是返回一个指向某个数据类型对象的指针。    inta=1; int*p=&a;       &a不是地址,&a是......