新套路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的方案數 那...