2016多校第八场 hdu5821 Ball

http://acm.hdu.edu.cn/showproblem.php?pid=5821

水题的精华。。。。。

有n个球,给出目前的颜色序列a和目标颜色序列b,再给出m个可以重新安排球顺序的球区间,这m个区间是不得重新安排区间顺序,问能否达到目标的颜色序列

这题是那道给出一个字典,再给出某一个字符串S,S只要能经过重排得到字典中任意一个字符串T就输出yes的进化版。

这里是for b[i] a[i]==b[i],所以可以通过映射关系重新编号b为1~n,再重新编号a为1~n使得关系变成for i a[i]=i,这样就可以通过排序来达成位置的前后关系调整

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<stack>
#include<queue>
#include<set>
#include<sstream>
#include<map>
using namespace std;
#define For(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,k,n) for(int i=n;i>=k;i--)
#define Lson (u<<1)
#define Rson ((u<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define NEG(a) memset(a,-1,sizeof(a));
#define FILL(a) memset(a,0x3f,sizeof(a));
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+‘0‘;tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;}
#define printarr(i,a,f,b) {For(i,f,b) cout<<a[i]<<" "; printf("\n");}
#define ptf printf("fuck\n")
#define pt(a) cout<<a<<endl
#define flgprint(flg,a,b) {if(flg) printf("%s\n",a);else printf("%s\n",b);}
#define fp   freopen("in.txt","r",stdin)

#define maxn 3000
int a[maxn],b[maxn],n,m;
int vis[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&n,&m);
        For(i,1,n) scanf("%d",&a[i]);
        For(i,1,n) scanf("%d",&b[i]);
        int cnt=1;
        MEM(vis);
        For(i,1,n)
        {
            For(j,1,n)
            {
                if(!vis[j]&&a[j]==b[i])
                {
                    vis[j]=cnt++;
                    break;
                }
            }
        }
        For(i,1,m)
        {
            int l,r;
            scanf("%d %d",&l,&r);
            sort(vis+l,vis+r+1);
        }
        int flg=1;
        For(i,1,n) if(vis[i]!=i) flg=0;
        if(!flg) puts("No");
        else puts("Yes");
    }
    return 0;
}

时间: 2024-10-22 05:29:30

2016多校第八场 hdu5821 Ball的相关文章

多校第八场:图论出度

HDU 4948 这题比赛的时候遗憾了,我看了这道题,然后觉得挺简单的. 刚开始一看题上,想到的就是拓扑排序,然后脑子想啊想--感觉就是拓扑排序的逆序,然后发现挺水的-- 因为说了要想发展某个城市的话,就必须有另一个城市作为它发展的前提,即城市u->w这样连边,表示要想发展城市w,前提是u已经是发展过的城市了.那这样的话不是很简单嘛. 即统计出出度最多的就是第一个要发展的城市了,因为u->w这样连边可以看出算出出度最多的依次从大到小排序就行了. 哎呀,不过可惜了,因为看见没人交这题,然后也不敢

2014 HDU多校弟八场H题 【找规律把】

看了解题报告,发现看不懂 QAQ 比较简单的解释是这样的: 可以先暴力下达标,然后会发现当前数 和 上一个数 的差值是一个 固定值, 而且等于当前数与i(第i个数)的商, 于是没有规律的部分暴力解决,有规律的套公式 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <cstring&g

2016多校第六场1001-1003(hdu5793&amp;hdu5794&amp;hdu5795)

这场就做出一道题,怎么会有窝这么辣鸡的人呢? 1001 很复杂的公式,打表找的规律,最后是m^0+m^1+...+m^n,题解直接是(m^(n+1)-1)/(m-1),长姿势,原来还能化简……做出来的题不写题解了. 1002 一个棋盘,走棋的姿势要满足(x1-x2)^2+(y1-y2)^2==5,也就是以“日”字走,且只能向右下走. 其中有一些障碍不能经过,注意障碍有可能在终点,求从(1,1)走到(n,m)的路径数. 容斥+组合数 这题的简单版CF559C(对啊,我做过这题,我还是没做出来,wa

2016多校第4场 HDU 6076 Security Check DP,思维

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 题意:现要检查两条队伍,有两种方式,一种是从两条队伍中任选一条检查一个人,第二种是在每条队伍中同时各检查一个,前提是两条队伍中的两个人的序号大于k.然后询问检查最少需要的时间. 解法:根据题意很容易想到dp[i][j]表示第一个队伍已经检查完前i个人,第二个人已经检查完前j个人所需最小时间.但是这样是O(n^2)毫无疑问会tle.我们发现k很小,所以我们可以对于两种转移方式分开处理.对于差值小

HDU 5794 A Simple Nim 2016多校第六场1003

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给你n堆石子,每一堆有ai石头,每次有两种操作,第一种在任意一堆取出任意数量的石头但不能为0,第二种把一堆石头分成三堆任意数量的石头(不能为0),问是先手赢还是后手赢. 题解:这就是一个Nim游戏!那么Nim游戏一般跟SG函数有关,所以这道题打表找规律即可. 关于SG函数,在这里也说一下吧!毕竟第一次接触. Nim游戏与SG函数:http://baike.baidu.com/link?u

HDU 5754 Life Winner Bo 2016多校第三场1003

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754 题意:给你一个n*m大小的棋盘,分别以国际象棋的国王.战车.骑士和皇后的走法从(1,1)走到(n,m),而且只能向右或者向下走,问谁有必胜的策略或者是两者平局. 题解:无论是哪一种移动,都可以注意到,如果从起点到某一个点有必胜的策略,那么再以必胜点作为起点可以走到下一个必胜点,也就是以小见大. 一.对于王的走法,可以注意到3*3大小的棋盘,从(1,1)到(3,3)后手是有必胜的策略的,对于N和

2018湖南多校第八场 训练日志

solved 3 (7/22) 前缀和乱搞的题看成是模拟退火求最小费马点,很烦. C Permutations (子序列) D Travel Frog (dp + 公式) H Appositive Body (中心对称的结论) <qj> 题意:4维空间里n个点,是否能够中心对称. 首先利用所有点求出中心点的坐标,然后对于每个点,求出对应点的坐标,在set中查找是否存在. 所有的点都有对应点,那么存在. #include <cstdio> #include <iostream&

HDU暑假多校第八场J-Taotao Picks Apples

一.题意 给定一个序列,之后给出若干个修改,修改的内容为在原序列的基础上,将某一位元素的值改成给定的值<每次修改相互独立,不保存修改后的结果>.之后询问,在选择第一位元素的情况下,最长递增子序列的长度是多少. 二.题解 考虑不经修改的情况,应当设dp[i]为选取当前位情况下的最长递增子串的长度.则对于这道题,应当认为对于修改a为b,设l_pos为a左边最大的元素的位置,r_pos为a右边大于max(b,r_pos)的元素的位置.则有ans = dp[1] - dp[l_pos] + 1 + d

航电多校第八场-A-Character Encoding

题目描述 In computer science, a character is a letter, a digit, a punctuation mark or some other similar symbol. Since computers can only process numbers, number codes are used to represent characters, which is known as character encoding. A character en