2016多校總結 hdu5821Ball

2021-07-16 13:43:53 字數 1846 閱讀 4411

新套路get ; 

首先要判斷a陣列可以不可以到達b陣列,如果是1-n那麼就是排序,然後看ab相不相等。。。

但是這個是部分。。

這裡有兩點關鍵點:

1.如果有三個1.,位置在b陣列中是pa < pb < pc ; 那麼。由a -> b如果可以到達,那麼一定存在一種方法:是在a中依次遞增的1分別到依次遞增的b陣列。

例如:1 1 0 0 1 0 0 

0 0 1 1 0 0 1

那麼一定是a中第乙個1到達b中第乙個1 , 第二個到第二個。

因為這個是最可能的方法。如果其他的可以到達,那麼這個一定可以到達。

這樣對於a中的資料。使用b中的位置重新編碼。這樣b陣列就是嚴格遞增的。

這樣,就可以做出了。

把每乙個區間排序。在比較b和a是否相等/因為這樣可以得到最小的a可以交換的字典序最小的序列。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker,"/stack:102400000,102400000")

using namespace std;

#define max 1000005

#define maxn 2000005

#define maxnode 500010

#define sigma_size 30

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define lrt rt<<1

#define rrt rt<<1|1

#define mid int m=(r+l)>>1

#define ll long long

#define ull unsigned long long

#define mem0(x) memset(x,0,sizeof(x))

#define mem1(x) memset(x,-1,sizeof(x))

#define meminf(x) memset(x,inf,sizeof(x))

#define lowbit(x) (x&-x)

#define s(n) scanf("%d",&n)

#define p(n) printf("%d ",n)

#define pn(n) printf("%d\n",n)

#define fp(k) freopen(k , "r" ,stdin)

#define rpti(s , n) for(int i=s;iq[1005] ;

int n , m; scanf("%d%d" , &n , &m) ;

for(int i=1;i<=n;i++) scanf("%d" , &a[i]) ;

for(int j=1;j<=n;j++)

bool ok = true ;

for(int i=1;i<=n;i++)

int tmp = a[i] ;

a[i] = q[a[i]].front() ;

q[tmp].pop() ;

}for(int i=0;i

hdu 5821 Ball 貪心(多校)

題目 題意 有n個盒子,每個盒子最多裝乙個球.球的顏色不一定相同.現在要進行m次區間操作 每次操作 l,r 後可以隨意將區間內的球重新分配回去.問經過上述操作後是否有可能達到給定的狀態.分析 官方題解 假設有4個紅球,初始時從左到右標為1,2,3,4。那麼肯定存在一種方案,使得最後結束時紅球的順序沒...

HDU5821 Ball 2016多校第八場01

大意 給兩串序列,不同數字表示不同的球,0表示沒有,例如 1 0 0 0 0 0 0 1 再給定一組區間,例如 1 3 3 4 依次對區間內球重新放置,問最後能否從第一行變換成第二行序列。假設有4個紅球,初始時從左到右標為1,2,3,4。那麼肯定存在一種方案,使得最後結束時紅球的順序沒有改變,也是1...

2016多校集訓 hdu5852

題目是乙個棋盤,給你k個棋子和k個目的地,每乙個棋子都是在1行,每乙個目的地都是在n行,要求找出讓k個棋子移動到k個目的地的路徑不交叉的方案數。這個其實也是個套路題目,知道乙個定理。就可以,但是我不知道定理的名字。但是考慮2個棋子的情況 a1 a2 b1 b2 其中使用a b表示 a到b的方案數 那...