(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)
(建议您从上方链接进入我的个人网站查看此 Blog,在 Luogu 中图片会被墙掉,部分 Markdown 也会失效)
原题是 LOJ-535 「LibreOJ Round #6」花火 ,题意大概是一个序列,然后可以将其中任意两个值调换位置一次,然后再求逆序对个数。
只是求逆序对的话显然 
然后呢和我预料的差不多,25pts,小点里有一个 WA 了,不知道是哪里寄掉了。
Code:
xxxxxxxxxx81123
4using namespace std;5
6typedef long long ll;7typedef unsigned long long unll;8typedef long double ld;9typedef unsigned int uint;10
11121314
15template < typename T = int >16inline T read(void);17
18// struct Tree{19//     int arr[61000];20//     int lim;21//     int lowbit(int x){return x & (-x);}22//     void push(int v){while(x <= lim){arr[x] += x}}23// }24int N;25int a[610000];26int main(){27    freopen("swaq.in", "r", stdin);28    freopen("swaq.out", "w", stdout);29    N = read();30    for(int i = 1; i <= N; ++i)a[i] = read();31    if(N <= 500){32        // int times(0);33        // for(int i = 1; i <= N; ++i){34        //     for(int j = i + 1; j <= N; ++j){35        //         if(i > j)++times;36        //     }37        // }38        // int maxx(0);39        // for(int i = 1; i <= N; ++i){40        //     for(int j = 1; j <= N; ++j){41
42        //     }43        // }44        int minn = INT_MAX;45        for(int i = 1; i <= N; ++i){46            for(int j = i + 1; j <= N; ++j){47                swap(a[i], a[j]);48                int sum(0);49                for(int k = 1; k <= N; ++k){50                    for(int l = k + 1; l <= N; ++l){51                        if(a[l] < a[k])++sum;52                    }53                }54                // for(int i_ = 1; i_ <= N; ++i_)printf("%d ", a[i_]);55                // printf(" ans is %d\n", sum);56                swap(a[i], a[j]);57                minn = min(minn, sum);58            }59        }60        printf("%d\n", minn + 1);61    }62
63    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);64    return 0;65}66
67template < typename T >68inline T read(void){69    T ret(0);70    T flag(1);71    char c = getchar();72    while(!isdigit(c) && c != '-')c = getchar();73    if(c == '-'){flag = -1; c = getchar();}74    while(isdigit(c)){75        ret *= 10;76        ret += int(c - '0');77        c = getchar();78    }79    ret *= flag;80    return ret;81}原题是 HDU-7262 三角函数(为了方便就给个 vjudge 的链接吧),是一个欧几里得的题,或者说的更准确应该是个更相减损的题,有很多性质然后最后可以转化为更相减损,很考验思维。不过赛时雀食没推出来,用了一些乱搞的做法最终拿到了 10pts,(如果是 NOILinux 评测环境的话有可能会高一点,用到的 __float128 在 MinGW 里会失效)。
然后还有一个特别 sb 的错误,我用 __float128 来让精度极高,然后判等的时候 eps 我直接设置的 
回到我的乱搞做法,观察发现输入数据只有两个数,而且部分分范围很低,所以考虑数据库思想自动生成一个大表,用一些奇怪的 BFS,(这题的状态用宽搜确实难搜,我最后用队列里套 pair 套 __float128 和 枚举类型的 vector ),或者迭代加深 DFS 似乎也行???
xxxxxxxxxx159123
4using namespace std;5
6typedef long long ll;7typedef unsigned long long unll;8typedef long double ld;9typedef unsigned int uint;10typedef __float128 f128;11
12131415
16template < typename T = int >17inline T read(void);18
19
2021
22bool cmp(f128 a, f128 b){return fabs((double)a - (double)b) <= eps;}23f128 x;24f128 ans;25
2627
28enum func{sinn = 1, coss, atann, out_of_range__};29vf oper;30
31/*void bfs(int q__){32    double begT = (double)clock() / CLOCKS_PER_SEC;33    queue < pair < f128, vf > > q;34    vf empt;35    q.push(make_pair((f128)0.0, empt));36    while(!q.empty()){37        auto head = q.front(); q.pop();38        // if(cmp(head.first, ans)){39        //     oper = head.second;40        //     return;41        // }42        // if((double)clock() / CLOCKS_PER_SEC >= 0.90)return;43        for(func f = sinn; f <= atann; f = func(f + 1)){44
45            head.second.push_back(f);46            // printf("current: %.5lf\n", (double)head.first);47            f128 tmp(0.0);48            switch(f){49                case sinn:{50                    tmp = sinf128(head.first);51                    break;52                }53                case coss:{54                    tmp = cosf128(head.first);55                    break;56                }57                case atann:{58                    tmp = atanf128(head.first);59                    break;60                }61                default:{62                    printf("error\n");63                    break;64                }65            }66            if(cmp(tmp, ans)){67                oper = head.second;68                return;69            }70            if((int)head.second.size() > q__ * 2 + 1 || (double)clock() / CLOCKS_PER_SEC >= 0.80){71                printf("None");72                oper.clear();73                return;74            }75            // head.first = tmp;76            q.push(make_pair(tmp, head.second));77            head.second.pop_back();78        }79    }80}81
82
83void CAL(int p, int q){84    // fprintf(stderr, "caling p=%d, q=%d\n", p, q);85    oper.clear();86    ans = sqrtf128((f128)p / (f128)q);87    // printf("%.7lf\n%.7lf\n", (double)ans, (double)(sin(atan(cos(0.0)))));88    // printf("else if(p==%d&&q==%d)printf(\"", p, q);89    bfs(q);90    // reverse(oper.begin(), oper.end());91    for(auto i : oper){92        switch(i){93            case sinn:{94                printf("s");95                break;96            }97            case coss:{98                printf("c");99                break;100            }101            case atann:{102                printf("t");103                break;104            }105            default:{106                printf("error\n");107                break;108            }109        }110    }111    // printf("\\n\");\n");112    printf("\n");113    // if(p % 5 == 0 || q % 5 == 0){114    //     printf("\n");115    //     // fprintf(stderr, "Complete p=%d, q=%d\n", p, q);116    //     // fflush(stderr);117    // }118    // fflush(stdout);119}120*/121
122
123//这里因为测评用的MinGW,所以我用的__float128会CE,所以只能注释掉了124
125int main(){126    freopen("luckysct.in", "r", stdin);127    freopen("luckysct.out", "w", stdout);128    int p = read(), q = read();129    if(p==1&&q==1)printf("c\n");130    else if(p==1&&q==2)printf("cts\n");131    else if(p==2&&q==2)printf("c\n");132    else if(p==1&&q==3)printf("ctsts\n");133    else if(p==2&&q==3)printf("ctstc\n");134    else if(p==3&&q==3)printf("c\n");135    else if(p==1&&q==4)printf("ctststs\n");136    else if(p==2&&q==4)printf("cts\n");137    //......138    //剩下的就先删掉了,一大片表139
140else ;//CAL(p, q);141    // fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);142    return 0;143}144
145template < typename T >146inline T read(void){147    T ret(0);148    T flag(1);149    char c = getchar();150    while(!isdigit(c) && c != '-')c = getchar();151    if(c == '-'){flag = -1; c = getchar();}152    while(isdigit(c)){153        ret *= 10;154        ret += int(c - '0');155        c = getchar();156    }157    ret *= flag;158    return ret;159}Build Code: (生成表用的程序)
xxxxxxxxxx158123
4
5using namespace std;6
7typedef long long ll;8typedef unsigned long long unll;9typedef long double ld;10typedef unsigned int uint;11typedef __float128 f128;12
13141516
1718
19template < typename T = int >20inline T read(void);21
22bool cmp(f128 a, f128 b){return fabsf128(a - b) <= eps;}23f128 x;24f128 ans;25
2627
28enum func{sinn = 1, coss, atann, out_of_range__};29vf oper;30
31void bfs(int q__){32    double begT = (double)clock() / CLOCKS_PER_SEC;33    queue < pair < f128, vf > > q;34    vf empt;35    q.push(make_pair((f128)0.0, empt));36    while(!q.empty()){37        auto head = q.front(); q.pop();38        // if(cmp(head.first, ans)){39        //     oper = head.second;40        //     return;41        // }42        // if((double)clock() / CLOCKS_PER_SEC >= 0.90)return;43        for(func f = sinn; f <= atann; f = func(f + 1)){44
45            head.second.push_back(f);46            // printf("current: %.5lf\n", (double)head.first);47            f128 tmp(0.0);48            switch(f){49                case sinn:{50                    tmp = sinf128(head.first);51                    break;52                }53                case coss:{54                    tmp = cosf128(head.first);55                    break;56                }57                case atann:{58                    tmp = atanf128(head.first);59                    break;60                }61                default:{62                    printf("error\n");63                    break;64                }65            }66            if(cmp(tmp, ans)){67                oper = head.second;68                return;69            }70            if((int)head.second.size() > q__ * 2 + 1 || (double)clock() / CLOCKS_PER_SEC - begT >= 5.00){71                printf("None");72                oper.clear();73                return;74            }75            // head.first = tmp;76            q.push(make_pair(tmp, head.second));77            head.second.pop_back();78        }79    }80}81
82
83void CAL(int p, int q){84    fprintf(stderr, "caling p=%d, q=%d\n", p, q);85    oper.clear();86    ans = sqrtf128((f128)p / (f128)q);87    // printf("%.7lf\n%.7lf\n", (double)ans, (double)(sin(atan(cos(0.0)))));88    printf("else if(p==%d&&q==%d)printf(\"", p, q);89    bfs(q);90    // reverse(oper.begin(), oper.end());91    for(auto i : oper){92        switch(i){93            case sinn:{94                printf("s");95                break;96            }97            case coss:{98                printf("c");99                break;100            }101            case atann:{102                printf("t");103                break;104            }105            default:{106                printf("error\n");107                break;108            }109        }110    }111    printf("\\n\");\n");112    // if(p % 5 == 0 || q % 5 == 0){113    //     printf("\n");114    //     // fprintf(stderr, "Complete p=%d, q=%d\n", p, q);115    //     // fflush(stderr);116    // }117    fflush(stdout);118}119bool check(int p, int q){120    for(int i = 2; i * i <= min(p, q); ++i){121        if(p % i == 0 && q % i == 0)return false;122    }123    return true;124}125
126
127int main(){128    // int p = read(), q = read();129    130    // printf("\n");131    //     fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);132    freopen("/home/jdoi/cpp/OI/Exams/Monkey/luckysct/build.txt", "w", stdout);133    for(int q = 10; q <= 1000; ++q){134        for(int p = 1; p <= q; ++p){135            if(check(p, q))CAL(p, q);136        }137    }138
139
140
141    return 0;142}143
144template < typename T >145inline T read(void){146    T ret(0);147    T flag(1);148    char c = getchar();149    while(!isdigit(c) && c != '-')c = getchar();150    if(c == '-'){flag = -1; c = getchar();}151    while(isdigit(c)){152        ret *= 10;153        ret += int(c - '0');154        c = getchar();155    }156    ret *= flag;157    return ret;158}一个我感觉挺离谱的整体二分+树形 DP,思路奇奇怪怪,赛时我是没想出来,不过给的几个特殊性质点还是非常容易就能想到的。
然后考虑暴力我不会写不好写,所以想到了个很奇怪的贪心,大概就是考虑只删 dist 相同的一层,然后显然能删的数量和 dist 相同,排序之后找对应的第 dist 大的数,简而言之就是个很奇怪的乱搞(我都不知道怎么想到的),不过最后居然对了好几个点,直接 35pts。
Code:
xxxxxxxxxx103123
4using namespace std;5
6typedef long long ll;7typedef unsigned long long unll;8typedef long double ld;9typedef unsigned int uint;10
11121314
15
1617
18template < typename T = int >19inline T read(void);20
21
22
23int N;24
25struct Edge{26    Edge* nxt;27    // int val;28    int to;29    void* operator new(size_t);30    Edge(Edge* nxt, int to):nxt(nxt), to(to){;}31    Edge(void) = default;32}eData[210000];33void* Edge::operator new(size_t){static Edge* P = eData; return ++P;}34Edge* head[210000];35int deg[210000], val[210000];36int maxdeg(0);37const int root(1);38
39int dist[210000];40
41vector < int > nums[210000];42
43int maxdist(0);44void dfs_dist(int p){45    46    for(auto i = head[p]; i; i = i->nxt){47        dist[i->to] = dist[p] + 1;48        dfs_dist(i->to);49        nums[dist[i->to]].push_back(val[i->to]);50        maxdist = max(maxdist, dist[i->to]);51    }52}53
54signed main(){55    freopen("ssq.in", "r", stdin);56    freopen("ssq.out", "w", stdout);57    N = read();58    for(int i = 2; i <= N; ++i)val[i] = read();59    for(int i = 1; i <= N - 1; ++i){60        int f = read(), t = read();61        head[f] = new Edge(head[f], t);62        deg[f]++, deg[t]++;63        maxdeg = max(maxdeg, max(deg[f], deg[t]));64    }65    if(deg[1] == 1 && maxdeg <= 2){66        printf("0\n");67        return 0;68    }69    if(deg[1] <= 2 && maxdeg <= 2){70        int ans(0);71        for(auto i = head[1]; i; i = i->nxt){72            ans = max(ans, val[i->to]);73        }74        printf("%lld\n", ans);75        return 0;76    }77    int ans(0);78    dfs_dist(1);79    for(int i = 1; i <= maxdist; ++i){80        if(nums[i].size() <= i)continue;81        sort(nums[i].begin(), nums[i].end(), greater<int>());82        ans = max(ans, nums[i].at(i));83    }84    printf("%lld\n", ans);85    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);86    return 0;87}88
89template < typename T >90inline T read(void){91    T ret(0);92    T flag(1);93    char c = getchar();94    while(!isdigit(c) && c != '-')c = getchar();95    if(c == '-'){flag = -1; c = getchar();}96    while(isdigit(c)){97        ret *= 10;98        ret += int(c - '0');99        c = getchar();100    }101    ret *= flag;102    return ret;103}大概是做的最崩的一道题,首先写这题的时候人已经困傻了,大概梦游了 0.5~1.0h 然后开始写,最后开始写暴力,然后就是没写出来,感觉题意都没完全理解,所以最后无奈直接写了个输出 rand(),然后不出所料 0pts。
xxxxxxxxxx111123
4using namespace std;5
6typedef long long ll;7typedef unsigned long long unll;8typedef long double ld;9typedef unsigned int uint;10
11121314
1516
17
18template < typename T = int >19inline T read(void);20
21mt19937 _rnd(random_device{}());22int rnd(void){return _rnd() % INT_MAX;}23int rndd(int l, int r){return rnd() % (r - l + 1) + l;}24
25
26int N, M;27int atk[11000], def[11000];28int pos[11000], l[11000], r[11000];29
30int cnt(0);31
32vector < int > opt;33
34bool vis[110000];35bool used[110000];36
37void explode(int x, int w){38    if(!used[x] && w > def[x]){39        if(x != 1 && !used[x - 1]){40            used[x - 1] = true;41            vis[x - 1] = true;42            explode(x - 1, atk[x] - l[x]);43        }44        if(x != N && !used[x + 1]){45            used[x + 1] = true;46            vis[x + 1] = true;47            explode(x + 1, atk[x] - r[x]);48        }49    }50} 51bool check(){52    53    memset(vis, false, sizeof(vis));54    for(auto i : opt){55        memset(used, false, sizeof(used));56        explode(pos[i], INT_MAX);57    }58    for(int i = 1; i <= N; ++i){59        if(!vis[i])return false;60    }61    return true;62}63void dfs(int dep){64    if(dep > M){65        if(check())++cnt;66        return;67    }68    dfs(dep + 1);69    opt.push_back(dep);70    dfs(dep + 1);71    opt.pop_back();72}73
74
75
76
77
78int main(){79    freopen("dota.in", "r", stdin);80    freopen("dota.out", "w", stdout);81    int T = read();82    while(T--){83        cnt = 0;84        N = read(), M = read();85        for(int i = 1; i <= N; ++i)atk[i] = read(), def[i] = read();86        for(int i = 1; i <= M; ++i)pos[i] = read(), l[i] = read(), r[i] = read();87        // dfs(1);88        //  printf("%d\n", cnt);89        printf("%d\n", rndd(1, 315));90    }91   92
93    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);94    return 0;95}96
97template < typename T >98inline T read(void){99    T ret(0);100    T flag(1);101    char c = getchar();102    while(!isdigit(c) && c != '-')c = getchar();103    if(c == '-'){flag = -1; c = getchar();}104    while(isdigit(c)){105        ret *= 10;106        ret += int(c - '0');107        c = getchar();108    }109    ret *= flag;110    return ret;111}这题我挺喜欢,单独写一个 Blog 吧,戳此进入。
咕咕咕
咕咕咕
咕咕咕
update-2022_8_27 初稿