給定乙個長度為n的序列,然後現在要在中間取出乙個區間,求最大值^次大值的最大值
n<=2*10^6
一開始完全在分析異或有什麼特點可以用在最大值次大值上的…一開始的想法是trie樹不過越往下想覺得第一題怎麼可能那麼麻煩。
然後就來看區間內最大值和次大值有什麼特點了。
其實關於這類問題做得應該不算少了。大概有兩種方法。
分治solve(l,r)表示解決區間[l,r]內最大值最小值的問題。
首先掃一遍找到最大值,假設位置位於m,值為mx。
那麼向左向右各掃一遍,求出mx為最大值的時候的次大值然後順便更新一下答案。
然後solve(l,m-1); solve(m+1,r);
單調棧struct aaa
mx1=a[mid+1]; res=max(res,mx^mx1);
for (i=mid+1; i<=r; i++)if (a[i]>mx1)
}void sol()
}pianfen;
字面意思直接把每一對最大值和次大值整出來就好了
沒有想到單調棧其實是很可惜的,因為寫分治的時候就覺得萬一出資料卡一卡就會被打回o(n^2)了然後整場比賽都挺擔心第一題。int main()
top=0;
for (i=n; i>=1; i--)
printf("%d",res);
return
0;}
好在沒有特地出資料卡。
用乙個n位數來表示乙個原子,每一位的數字大小∈[0,n],可以擁有前導0但是不能全是0。
現在乙個長度為n的數,裂變後第一位表示這個數有幾個1,第二位表示有幾個2,依次。
例如:1104
裂變後就變成2001 (2個1,0個2,0個3,1個4)
有t組資料。對於每一組資料
讀入乙個n位數,求有多少個n位數可以裂變成它。
n<=9;t=100。
p50首先是暴力。比如對於now(乙個n位數)來說。
cnt[i]表示第i位的數字是多大。
能變成他的必然滿足有cnt[i]個i。然後就變成求乙個排列。
寫的是bfs表示方案,dfs求排列。
p100//dfs
void dfs(string s,int last,int
sum)return;}
int i;
if (last>sum)
for (i=1; i<=len; i++)if (cnt[i])
}//bfs
void bfs()
}
可以把所有數分成兩類。
第一類是sum[cnt[i]]>n的,就當它為b類數,這類數字不能由其他的裂變而來。res=1
第二類是sum[cnt[i]]<=n的,就當它為a類數。res=所有可以一步變成它的res之和。
可以發現乙個數的裂變過程中是不會產生環的。
除了1後面跟(n-1)個0的情況下會有乙個自環,判掉就好了。
對於乙個a類數,如果有乙個b類數能轉化成它,那麼能轉化成它的就全都是b類數。這裡求個排列數就好了。
如果不是,那就強行求排列再往下遞迴就好了。
來自某同學的友情提供:即使是n=9的情況下,a類數的個數大約在40000左右。
其實這道題還是挺滿意的?水到了意料之外的75,一開始還以為只有50的,看來資料沒有出長度全是最大值還都是100…0的情況。#include
using
namespace
std;
int n;
int jiecheng[10];
int solve(int x)
if (k>n)return
1; if (l>n)
int id=n-k;
for (i=1; i<=n; i++)
int s;s=0;
for (i=0; i10+a[i];
if (s!=x)res+=solve(s);
for (; next_permutation(a,a+n);)
return res+1;
}char s[15];
int main()
return
0;
}
有n個旅遊團。每個團都有a[i]個人。巧克力一盒有p塊。吃完前不能開新的一盒。如果乙個團內所有的人吃的都是新開的巧克力的話,那他們就會很開心。
求怎麼分配能使開心的旅遊團數量最多。
p<=4,n<=10000,a[i]<=1e9
p好小σ
p==2 所有偶數的先吃
然後奇數一人乙個
p==3
所有三的倍數先吃
然後偶數乙個奇數乙個
最後奇數乙個乙個乙個
cnt3+min(cnt1,cnt2)+(max(cnt1,cnt2)-min(cnt1,cnt2)+2)/3;
p==4
怎麼覺得這題不算很難…?是我想錯了莫?
總之4倍數的先吃。
好 吃完了。
然後剩下餘數為1,2,3的
盡可能多把它們組成4的倍數。
首先22內銷,然後13搞。
搞完再1111,3333,1133,1333,1113(就是1,3混起來4個)
然後最後112,332(兩個1或3,加上乙個2)
如果還有剩餘就再res++
比賽的時候只敲到60,因為p==4的情況似乎弄錯了一點結果一分都沒有。#include
#include
#define m 10005
using namespace std;
void read(int &x)
int n,a[m];
struct aaa
}pianfen;
struct ccc
printf("%d\n",res+(cnt+1)/2);
}
}p30;
struct acc
printf("%d\n",res+min(cnt1,cnt2)+(max(cnt1,cnt2)-min(cnt1,cnt2)+2)/3);
}}p60;
struct aac
int num=min(cnt1,cnt3);
res+=num; cnt1-=num; cnt3-=num;
res+=cnt2/2; cnt2=cnt2&1;
ints=(cnt1+cnt3);
num=s/4;
res+=num; s&=3;
if (s>=2&&cnt2) res++,s-=2,cnt2--;
if (s||cnt2) res++;
printf("%d\n",res);
}
}p100;
int main()
return
0;}
有點可惜不過還算很滿意了。(因為題目好像不是很難)
其實。很滿意啦——沒了。
非要說的話這幾天也在寫深搜,像第二題這種把狀態分類來求的做法,還是挺有用的。能有效的減掉一層枝。
然後第三題的話沒水到所有分有點可惜不過也在意料之內。
20151006模擬賽總結
今天上午去一中,又考了個模擬賽。這次的題有點考思維。我感覺這個第一題難度稍微大了點。一般noip第一題要麼是簡單的模擬,要麼是裸的簡單演算法,這次的第一題要自己構造演算法,並且還是列舉和貪心套在一起。我開始想的是列舉 揹包,複雜度為n 3,但是資料範圍沒給出三次方的分。於是我就覺得不靠譜。然後發現列...
20151031模擬賽總結
今天去一中,考了個模擬賽,真是坑。本來在八中食堂愉快的享受我的早飯 週末早上的番茄雞蛋燙飯 韭菜肉餅簡直爽!然後geng4512就跑過來說要去一中考試,然後兩口喝完燙飯就和他一起狂跑過去了。這次第一題組合數取模,模的不是質數。想了好大半天,沒什麼想法,然後看了下後面的題,又回來做這道題,想起了階乘分...
20160521模擬賽總結
20160521模擬賽是程式設計實習課程安排的第一次模擬賽 比賽鏈結 備註 這個系列模擬賽屬於程式設計實習練習賽,題目有很大一部分事先練習過,做這些題目為了練習碼 熟練度,也為了進行模擬考試練習的機會,所以這個系列模擬賽我每一次都參加,作為練習 題目清單見下 已解決 01 浮點數求高精度冪 已解決 ...