A

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll LLmaxn = 2e18;
string a;
int K;
string str[];
int pop = ;
map<string, int> mp;
int main()
{
cin >> a;
cin >> K;
for (int i = ; i <= && pop < K; i++)
{
for (int j = ; j < a.size(); j++)
{
if (a[j] == 'a' + i)
{
string now = "";
for (int k = j; k < min((int)a.size(), j + K); k++)
{
now += a[k];
if (!mp[now])
{
str[++pop] = now;
//cout<<now<<endl;
mp[now]++;
}
}
}
}
}
sort(str + , str + pop + );
cout << str[K] << endl;
return ;
}

B

给1-N的一个排列 再给你M个Xi,Yi表示Xi与Yi位置的数可以无限次交换

解:

并查集 因为交换次数是无线的所以在一个集内的数字可以到其他任何一个位置

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll LLmaxn = 2e18;
const int N = ;
int par[N];
void init(int n)
{
for (int i = ; i <= n; i++)
{
par[i] = i;
}
}
int find(int x)
{
return par[x] == x ? x : par[x] = find(par[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x != y)
{
par[x] = y;
}
}
int num[N];
int where[N];
int a, b;
int main()
{
int n;
int m;
cin >> n;
cin >> m;
init(n);
int anser = ;
for (int i = ; i <= n; i++)
{
cin >> num[i];
where[num[i]] = i;
}
for (int i = ; i <= m; i++)
{
cin >> a >> b;
unite(a,b);
}
for (int i = ; i <= n; i++)
{
if (find(where[i]) == find(i))
{
anser++;
}
}
cout << anser << endl;
return ;
}

C

有2N个球 一半是白的 一半是黑的 每个白球和黑球上都有一个数字 分别都可以组成1-N

在一次操作内你可以交换相邻的两个球 问你最少需要多少次操作使得从左到右 白球和黑球各自都是递增序

解:

dp[i][j]表示现在在(i+j)的位置有1-i白球且1-j黑球正确排序所需要的最少操作数

pre[kind][i][j]表示第kind种的球在第i个位置及之前标号不小于j的有几个

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll LLmaxn = 2e18;
const int N = 2e3 + ;
int n;
int s;
int dp[N][N];
int pos[][N];
int pre[][N * ][N];
void init()
{
for (int kind = ; kind <= ; kind++)
{
for (int i = ; i < s; i++)
{
for (int j = n - ; j >= ; j--)
{
pre[kind][i][j - ] += pre[kind][i][j];
}
}
for (int i = ; i < s - ; i++)
{
for (int j = ; j < n; j++)
{
pre[kind][i + ][j] += pre[kind][i][j];
}
}
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
dp[i][j] = INT_MAX;
}
}
dp[][] = ;
}
int main()
{
cin >> n;
s = n * ;
for (int i = ; i < s; i++)
{
string ch;
cin >> ch;
int kind = ;
int x;
cin >> x;
x--;
if (ch[] == 'W')
{
kind = ;
}
pos[kind][x] = i;
pre[kind][i][x]++;
}
init();
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (i < n)
{
int p = pos[][i];
dp[i + ][j] = min(dp[i + ][j], dp[i][j] + pre[][p][i + ] + pre[][p][j]);
}
if (j < n)
{
int p = pos[][j];
dp[i][j + ] = min(dp[i][j + ], dp[i][j] + pre[][p][i] + pre[][p][j + ]);
}
}
}
cout << dp[n][n] << endl;
return ;
}

Atcoder Regular 097 相邻球交换目的递增DP的更多相关文章

  1. AtCoder Regular Contest 096 D - Static Sushi(线性dp)

    Problem Statement "Teishi-zushi", a Japanese restaurant, is a plain restaurant with only o ...

  2. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

  3. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  4. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  5. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  6. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  7. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  8. AtCoder Regular Contest 099

    AtCoder Regular Contest 099 C - Minimization 题意 题意:给出一个n的排列.每次操作可以使一段长度为K的连续子序列变成该序列的最小数.求最少几次使得整个数列 ...

  9. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

随机推荐

  1. IPython4_Notebook

    目录 目录 前言 系统软件 Setup IPython Setup IPython Setup Notebook 临时指定镜像源 Install pyreadline Install pyzmq In ...

  2. 【DVWA】Command Injection(命令注入)通关教程

    日期:2019-08-01 16:05:34 更新: 作者:Bay0net 介绍:利用命令注入,来复习了一下绕过过滤的方法,还可以写一个字典来 fuzz 命令注入的点. 0x01. 漏洞介绍 仅仅需要 ...

  3. runoob_Java 序列化

    Java 序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据.有关对象的类型的信息和存储在对象中数据的类型. 将序列化对象写入文件之后 ...

  4. java:struts框架3(自定义拦截器,token令牌,文件上传和下载(单/多))

    1.自定义拦截器: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  5. centos中切换图形与命令行界面

    1.在命令行的centos中安装图形化 配置本地源 [root@localhost yum.repos.d]# yum clean all [root@localhost yum.repos.d]# ...

  6. cocos2dx[3.2](6) 节点类Node

    与2.x相比,节点类Node的属性和功能做了大幅度的修改与增加. Node类是绝大部分类的父类(并不是所有的类,例如Director类是直接继承Ref类的),如Scene.Layer.Sprite以及 ...

  7. Libra的思考

    这几年关注了很多的新技术,近期让我觉得值得一讲的是blockchain,刚巧6.18号就发布了Libra 他是这么介绍自己的 libra https://developers.libra.org/bl ...

  8. c++自定义时间输出

    #include <time.h> time_t timep; struct tm *p; time(&timep); p=localtime(&timep); int l ...

  9. C++中的自定义内存管理

    1,问题: 1,new 关键字创建出来的对象位于什么地方? 1,位于堆空间: 2,有没有可能位于其它地方? 1,有: 2,通过一些方式可以使动态创建的对象位于静态存储区: 3,这个存储区在程序结束后释 ...

  10. 安装VUE教程

    这段时间公司要准备开始用VUE,安装的过程中就遇到各种奇葩问题 1.Node.js安装 https://nodejs.org/en/download/ 安装好noedeJS然后继续安装下一步 3.执行 ...