日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CF1090F - How to Learn You Score(构造)

發(fā)布時(shí)間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1090F - How to Learn You Score(构造) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CF1090F - How to Learn You Score

Solution

很不戳的構(gòu)造題。

首先觀察數(shù)據(jù)范圍:n∈[5,1000]n\in[5,1000]n[5,1000],這啟發(fā)我們什么?n=5n=5n=5的時(shí)候解是唯一的,因此我們可以把nnn切成若干段長(zhǎng)度為555的段,每一段分別求答案,最后拼起來(lái)。

然后我們考慮長(zhǎng)度為555的段,顯然4n4n4n的詢(xún)問(wèn)上界允許我們把十種三元組都詢(xún)問(wèn)出來(lái)。

我們先確定這些數(shù)的值,而不考慮位置,設(shè)這五個(gè)值從小到大依次為a1...a5a_1...a_5a1?...a5?,十種三元組:123,124,134,125,135,145,234,235,245,345123,124,134,125,135,145,234,235,245,345123,124,134,125,135,145,234,235,245,345

因此十種三元組的值為13,14,14,15,15,15,24,25,25,3513,14,14,15,15,15,24,25,25,3513,14,14,15,15,15,24,25,25,35,且其中的排序關(guān)系基本可以知道了,為13<14<15?24<25<3513<14<15\;?\;24<25<3513<14<15?24<25<35,到這里我們已經(jīng)可以通過(guò)詢(xún)問(wèn)值的加減求出每個(gè)數(shù)的值了(詳見(jiàn)CodeCodeCode)。

接下來(lái)就是確定每個(gè)值的位置,因?yàn)槲覀円呀?jīng)證明 了555的時(shí)候解唯一,因此直接5!5!5!枚舉全排列即可。

時(shí)間復(fù)雜度O(n)O(n)O(n),詢(xún)問(wèn)次數(shù)2n2n2n

Code

#include <bits/stdc++.h>using namespace std;template<typename T> inline bool upmin(T &x, T y) { return y < x ? x = y, 1 : 0; } template<typename T> inline bool upmax(T &x, T y) { return x < y ? x = y, 1 : 0; }#define MP(A,B) make_pair(A,B) #define PB(A) push_back(A) #define SIZE(A) ((int)A.size()) #define LEN(A) ((int)A.length()) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define fi first #define se secondtypedef long long ll; typedef unsigned long long ull; typedef long double lod; typedef pair<int, int> PR; typedef vector<int> VI; const lod eps = 1e-9; const lod pi = acos(-1); const int oo = 1 << 30; const ll loo = 1ll << 60; const int mods = 998244353; const int MAXN = 600005; const int INF = 0x3f3f3f3f; //1061109567 /*--------------------------------------------------------------------*/#define int llstruct Anode{ int x, y, z, s; } A[20]; int Ans[MAXN], n;int min(int x, int y, int z) { return min(x, min(y, z)); } int max(int x, int y, int z) { return max(x, max(y, z)); } void solve(int l, int r) {int num = 0;for (int i = l; i <= r ; ++ i)for (int j = i + 1; j <= r ; ++ j)for (int k = j + 1; k <= r ; ++ k) {cout << "? " << i << " " << j << " " << k << endl;cin >> A[++ num].s;A[num].x = i, A[num].y = j, A[num].z = k;}sort(A + 1, A + num + 1, [&](Anode a, Anode b) { return a.s < b.s; });int s13 = A[1].s;int s25 = A[9].s;int s35 = A[10].s;int s15 = (A[4].s == A[5].s ? A[4].s : (A[5].s == A[6].s ? A[5].s : A[4].s));int s24 = A[4].s + A[5].s + A[6].s + A[7].s - s15 * 3;int s135 = (s13 + s15 + s35) / 2;Ans[l] = s135 - s35;Ans[l + 2] = s135 - s15;Ans[l + 4] = s135 - s13;Ans[l + 1] = s25 - Ans[l + 4];Ans[l + 3] = s24 - Ans[l + 1];sort(Ans + l, Ans + l + 5);for (;;) {int flag = 1;for (int i = 1; i <= num ; ++ i)if (min(Ans[A[i].x], Ans[A[i].y], Ans[A[i].z]) + max(Ans[A[i].x], Ans[A[i].y], Ans[A[i].z]) != A[i].s) { flag = 0; break; }if (flag) return;next_permutation(Ans + l, Ans + l + 5);} } signed main() {cin >> n;for (int i = 1; i + 4 < n ; i += 5) solve(i, i + 4);solve(n - 4, n);cout << "! ";for (int i = 1; i <= n ; ++ i) cout << Ans[i] << " "; cout << endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的CF1090F - How to Learn You Score(构造)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。