bzoj 3671 贪心

 

想到了从小到大依次填,但想到可能有重复元素,那是就会有分支,就不知怎样办了,最后才发现它是用随机数来调整排列,所以没有重复元素,唉。。。。。

 

 1 /**************************************************************
 2     Problem: 3671
 3     User: idy002
 4     Language: C++
 5     Result: Accepted
 6     Time:39644 ms
 7     Memory:196984 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <algorithm>
12 #define N 5010
13 using namespace std;
14  
15 typedef long long dnt;
16 struct Pair {
17     short x, y;
18     int v;
19     bool operator<( const Pair &o ) const { return v<o.v; }
20 };
21  
22 int n, m, tot, q ;
23 int rgt[N], lft[N];
24 Pair prs[N*N];
25 int stk[N+N], top;
26  
27 void prod_data() {
28     dnt x, a, b, c, d;
29     scanf( "%lld%lld%lld%lld%lld", &x, &a, &b, &c, &d );
30     scanf( "%d%d%d", &n, &m, &q );
31     tot = n*m;
32     for( int i=1; i<=tot; i++ )
33         prs[i].v = i;
34     for( int i=1; i<=tot; i++ ) {
35         x = (a*x*x+b*x+c) % d;
36         swap( prs[i].v, prs[x%i+1].v );
37     }
38     for( int i=1,l,r; i<=q; i++ ) {
39         scanf( "%d%d", &l, &r );
40         swap( prs[l].v, prs[r].v );
41     }
42     int cur = 1;
43     for( int i=1; i<=n; i++ ) {
44         for( int j=1; j<=m; j++ ) {
45             prs[cur].x = i;
46             prs[cur].y = j;
47             cur++;
48         }
49     }
50     sort( prs+1, prs+1+tot );
51 }
52 int main() {
53     prod_data();
54     for( int i=1; i<=n; i++ )
55         lft[i]=1, rgt[i]=m;
56     top = 0;
57     for( int t=1; top<n+m-1; t++ ) {
58         int x=prs[t].x, y=prs[t].y;
59         if( y<lft[x] || y>rgt[x] ) continue;
60         for( int i=1; i<x; i++ )
61             rgt[i] = min( rgt[i], y );
62         for( int i=x+1; i<=n; i++ )
63             lft[i] = max( lft[i], y );
64         stk[++top] = prs[t].v;
65     }
66     sort( stk+1, stk+1+top );
67     for( int i=1; i<=top; i++ )
68         printf( "%d%s", stk[i], i==top ? "" : " " );
69 }
View Code

 

posted @ 2015-05-14 11:30  idy002  阅读(155)  评论(0编辑  收藏  举报