(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)
(建议您从上方链接进入我的个人网站查看此 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 初稿