給定乙個長度為n的數列,第i個數為\(a_i\),要求給數列劃分。
要求乙個塊內任意兩個數之和不在斐波那契數列上。
【樣例輸入】
51 5 2 6 1 5 2 6 7
【樣例輸出】
4【樣例說明】
最優分組的一種為: 最優分組的一種為: 最優分組的一種為: 最優分組的一種為: 最優分組的一種為: 最優分組的一種為: , , , 。
【資料範圍】
對於 10% 的資料,\(n ≤ 20\)。
對於 30% 的資料,\(n ≤ 300\)。
對於 60% 的資料,\(n ≤ 1000\)。
對於 100 % 的資料,\(n ≤ 100000, a_i ≤ 10^9\)。
\(2\times a_i\le 2*10^9\)別看這個範圍很大,但是斐波那契數列第47項就比這個數大了,打表!!
既然這麼小,用乙個桶記錄每乙個數是不是為斐波那契數列上的數就不划算了,我們直接暴力查詢(二分也行)就可以了。
我考場上的思路是dp,\(g[i]\)表示第i個點最遠向左擴充套件到\(g[i]\)位置不合法。
我們可以很容易預處理出這個,用乙個map(據說會被卡),或者set,或者手打雜湊表儲存前\(1~i-1\)個數,然後列舉每乙個\(fib[j]-i\),查詢是否存在,取最近的乙個位置。
然後再和\(g[i-1]\)求一下最大值就可以了。
然後考慮dp,\(f[i]\)表示\(1~i\)最小分多少組。
很明顯\(f[i]=min\)。
然後發現是\(o(n^2)\)的,過不去,可以用單調佇列優化,均攤乙個n,輕鬆能過。
不知道為什麼會被卡乙個點。
標算是貪心。
因為很明顯,位置越多分組肯定越多,我們不斷加入乙個數,判斷它跟最近的組是不是有衝突。
如果有衝突我們就新開一組,否則加入上一組。
用雜湊表可以做到\(o(1)\)查詢,這樣子我們就能\(o(n)\)解決問題了。
dp**(90pts)
#include #include #include #include #include #define ll long long
using namespace std;
const int maxn=100009;
ll read()
ll fib[maxn],a[maxn],g[maxn];
ll f[maxn],d[maxn],q[maxn],n,h=1,t=0;
mapm;
bool ask(ll a);
void init();
int main()
memset(f,0x3f,sizeof(f));
f[0]=0;q[++t]=f[0];d[t]=0;
}/* 對每乙隻兔子列舉它之前第乙個和他組成兔子數列的兔子
* 然後跑一遍dp,求出最小劃分數。
* g[i]表示從i開始,最大向左拓展的長度。
* 發現g[i]是遞增的,我們可以考慮單調佇列優化。
* 但是被預處理卡了。。
*/
貪心**(ac)#include #include #include #include #include #define ll long long
using namespace std;
const int mod=133531;
const int maxn=100009;
int read()
ll n,fib[maxn],a[maxn],ans=0;
ll head[mod+100],nxt[mod+100],val[mod+100],tot=1;
bool find(int x)
void clean()
void insert(int x)
int main()
ll k,r,p[109],now=1,ans=0,maxn;
void dfs(int d)
ll qwq=now;
while(1)
ll k,k1,k2,r,p[109],p1[109],p2[109],now=1,ans=0,maxn;
ll a1[14000005],a2[14000005],cnt1=0,cnt2=0;
void dfs1(int d,ll v)
//coutdfs1(d+1,v*res);
if(res>t1) break;
res=res*p1[d]; }}
void dfs2(int d,ll v)
//coutdfs2(d+1,v*res);
if(res>t1) break;
res=res*p2[d]; }}
bool cmp(ll a,ll b)if(!t2) break;
maxn = max(maxn,a1[t1] * a2[t2]);
ans += t2;
t1++;
} printf("%lld\n",maxn);
printf("%lld\n",ans);
return 0;
}
給定乙個序列,求在序列中中位數在\(l_1\)到\(r_1\)之間並且滿足長度在\(l_2~r_2\)之間的序列的個數。
我怎麼可能會寫啊。。
打了個暴力滾粗了。
正解好像是線段樹。。
40pts
#include #include #include #include #define ll long long
using namespace std;
const int maxn=100009;
int read()
int n,m,l1,l2,r1,r2,maxn,flag;
int a[maxn*2],f[maxn*2],len;
ll ans;
void ask();
int main()
return 0;
}void ask()
} printf("%lld\n",ans);
}
noip模擬賽(一)魔法樹
魔法樹 mahou.pas c cpp 問題描述 魔法使mored在研究一棵魔法樹。魔法樹顧名思義,這貨是一棵樹 奇葩的是魔法樹上的每一條邊都擁有乙個魔法屬性 如果不那麼奇葩就不是mored的魔法樹了。魔法使mored在研究這棵魔法樹的方法比較奇葩,每一次他會選擇一條路徑 施法。這個魔法是mored...
noip模擬賽(一)寵物之戰
寵物之戰 senso.pas c cpp 問題描述 眾所周知,mored的寵物已經被mored奴役得體無完膚。這只寵物實在忍無可忍,把自己每天走魔法樹的經歷告訴了自己的寵物。同時他還說明了自己爬樹是多麼地慢,以至於mored每天都殘酷地訓練他爬樹。幸運的是mored的寵物的寵物不是mored的寵物,...
學校初一模擬賽(2019 3 8)
rank name score t1t2 t3t4 1hky 250100 1005002 lyf240 10050 5040 3wjj 21090 705004 lth120 2050500 5fy9010 305006 tjh30010 2007cwh100 01008 whd1000 100題...