『NOIP普及:數學推導組題訓練』
NOIP普及:數學推導組題訓練
T1 超級英雄的戰鬥
【 問題描述】
美國隊長和鋼鐵俠正在與很多外星人戰鬥。 這場戰鬥的持續時間是 t
分鐘, 每分鐘美國隊長和鋼鐵俠都可能消滅 0 個或 1 個外星人。 我們用一
個長度為 t 的字串 S 來描述這場戰鬥, 每個字元代表一分鐘內發生的情
況: M 表示只有美國隊長消滅了 1 個外星人, G 表示只有鋼鐵俠消滅了 1
個外星人, T 表示兩人同時消滅了 1 個外星人, 不存在某 1 分鐘兩人都沒
有消滅外星人。
鋼鐵俠知道一般情況下他們兩個的戰鬥能力比是 m:g, 表示在相同時
間內如果美國隊長消滅了 mk 個敵人, 鋼鐵俠應當能消滅 gk 個。 戰鬥之
後, 鋼鐵俠發現, 並不是所有連續時間段都符合一般情況的。 用 S 的一個
子串 S2=S[l…r]表示一個連續時間段, 我們稱 S2 是“好” 的, 當且僅當在
第 l 分鐘到第 r 分鐘( 兩端均包含) 美國隊長消滅的敵人數和鋼鐵俠消滅
的敵人數之比恰好等於 m:g。
鋼鐵俠需要計算最長的“好” 的 S 的非空子串, 最長的“ 好” 的子串
的數量, 以及 S 的所有“好” 的非空子串的數量。 如果字串一樣但位置
不同分開計算數量。
【 輸入格式(
輸入第一行包含 3 個非負整數: t,m 和 g。
第二行包含一個長度為 t 的字串 S, 含義如前所說。
【 輸出格式(fight.out)】
輸出兩行。 第一行包含 3 個整數 l,r 和 cnt, 表示 S 的子串 S[l…r]是最
長的“好” 子串( S 的編號從 1 開始) , 如果有多個輸出最左邊的子串,
以及與它等長的“ 好”的子串的數量。 第二行包含 1 個整數, 表示 S 的“好”
的非空子串數量。 如果不存在“好” 的非空子串, 只輸出”A weird fight”( 不
包含引號) 。
【 樣例輸入 1】
6 1 2
GTGGTT
【 樣例輸出 1】
1 6 1
6
【 樣例輸入 2】
2 3 2
TMG
【 樣例輸出 2】
A weird fight
【 解釋】
樣例 1 中, GT,TG,GGTT,TGGT,GTGGTT 都是“ 好” 的子串, 其中 GT 出現
了 2 次, 所以總的個數是 6。
【 資料規模與約定】
保證 m 和 g 至少有一個非 0。 不保證 m:g 是最簡比。
保證 S 中的字元只會是 M,G,T 之一。
資料可能有 3 種特殊限定之一。
限定 1: S 只出現 1 種字母。
限定 2: m*g=0
限定 3: S 中沒有字元’T’, 且所有的’M’都在所有的’G’之前。
測試點編號 | t 的上界 | 特殊限定 |
---|---|---|
1 | 100 | 1 |
2~5 | 100 | 無 |
6 | 2000 | 2 |
7 | 2000 | 3 |
8~12 | 2000 | 無 |
13,14 | 100000 | 2 |
15,16 | 100000 | 3 |
17~20 | 100000 | 無 |
保證 m,g<=10^9。
解析
顯然的,方便區間統計,我們先要做兩個字首和陣列:代表前i個位置美隊消滅的敵人數,代表前i個位置鋼鐵俠消滅的敵人數。題目中要求“好”的字串中鋼鐵俠消滅的敵人數和美隊消滅的敵人數成比例,也就是說:
那麼子串[l,r]就是“好”的。
那麼,接下來就是對這個式子進行推導(xiagao)了:
接下來神奇的事情就發生了:我們發現變形後的式子左右兩邊的形式完全相同,而且陣列下標只分別和l-1,r有關。那麼我們就可以用值來當下標,做一個桶了。如果檢查到這個字已經出現,那就說明一定存在一個符合要求的“好”子串。所以我們用map開兩個桶first,cnt分別記錄等式一邊等於為某個值時,這個子串第一次出現的位置和相同長度子串的個數。這樣一重迴圈掃描就可以統計,累加得到答案了。
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
inline void read(int &k)
{
int x=0,w=0;char ch;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
k=(w?-x:x);return;
}
int t,m,g,Maxlen=-1,Maxcnt=0,Allcnt=0,L,R,sumG[208000],sumM[208000];
char s[200080];map< int,int >first,cnt;
inline int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
inline void input(void)
{
read(t),read(m),read(g);
int temp=gcd(m,g);
m/=temp,g/=temp;
for(int i=1;i<=t;i++)
{
cin>>s[i];
sumG[i]=sumG[i-1],sumM[i]=sumM[i-1];
if(s[i]=='G')sumG[i]+=1;
if(s[i]=='M')sumM[i]+=1;
if(s[i]=='T')sumG[i]+=1,sumM[i]+=1;
}
}
inline void solve()
{
first[0]=cnt[0]=1;
for(int i=1;i<=t;i++)
{
int value=m*sumG[i]-g*sumM[i];
if(cnt.count(value))
{
if(i-first[value]+1>Maxlen)
{
Maxlen=i-first[value]+1;
L=first[value];
R=i;
Maxcnt=1;
}
else if(i-first[value]+1==Maxlen)
{
Maxcnt++;
}
Allcnt+=cnt[value];
}
else first[value]=i+1;
cnt[value]++;
}
}
int main(void)
{
freopen("fight.in","r",stdin);
freopen("fight.out","w",stdout);
input();
solve();
if(!Allcnt)printf("A weird fight\n");
else
{
printf("%d %d %d\n",L,R,Maxcnt);
printf("%d\n",Allcnt);
}
return 0;
}
T2 方方方
【問題描述】
在一個n*m的方格圖中,選中三個單元格,需滿足以下兩個條件:
(1)任意兩個單元格都不在同一行。
(2)任意兩個單元格都不在同一列。
選擇的花費是三個格子兩兩之間曼哈頓距離的和(如(x1,y1)和(x2,y2)的曼哈頓距離為|x1-x2|+|y1-y2|),問花費在l到r之間的方案數有多少。
所謂的兩種不同方案是指:只要它選中的單元格有一個不同,就認為是不同的方案。答案模1000000007。
【輸入格式】
第一行4個整數n,m,l,r。
【輸出格式】
一個整數,表示不同的選擇方案數量模1000000007後的結果。
orzfang.in orzfang.out
3 3 1 20000 6
3 3 4 7 0
4 6 9 12 264
7 5 13 18 1212
4000 4000 4000 14000 859690013
【輸入輸出樣例】
【資料規模】
對於30%的資料,3≤n,m≤70。
對於100%的資料 3≤n,m≤20000。
解析
由於三個點的橫座標,縱座標各不相同,且他們是無法辨識的,我們不妨設,則他們的花費就一定是,我們很容易就能發現這三個點的排列順序互換時,他們的兩兩間曼哈頓距離之和是不變的,所以,當我們確切的找到三個點的座標時,它其實對答案貢獻了種方案,然而我們其實只需要確定最左下角和最右上角的點,中間的點是可以隨意移動,構成多種方案的,所以,我們列舉且保證,那麼在代價符合範圍條件是,它就對答案造成了種方案的貢獻(因為中間點是可以在內部隨意移動的),四重迴圈列舉,這就是30分的寫法。
換個思路,我們可以列舉最左下角的點和最右上角的點構成的矩形,即列舉它的長(x)和寬(y)。這時它的花費是,它的貢獻是,這時,這樣列舉的好處就體現出來了,我們可以直接計算出這樣的矩形有幾個:個,那麼這種情況下的所有方案也就算出來了:當時,邊長為的矩形總貢獻為,那麼列舉x,y就能得到答案。
#include<bits/stdc++.h>
using namespace std;
const long long P=1000000007;
inline void read(long long &k)
{
long long x=0,w=0;char ch;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
k=(w?-x:x);return;
}
long long n,m,l,r,ans=0;
inline void input(void)
{
read(n),read(m);
read(l),read(r);
}
inline void work(void)
{
for(int x=3;x<=n;x++)
{
for(int y=3;y<=m;y
相關推薦
『NOIP普及:數學推導組題訓練』
NOIP普及:數學推導組題訓練
T1 超級英雄的戰鬥
【 問題描述】
美國隊長和鋼鐵俠正在與很多外星人戰鬥。 這場戰鬥的持續時間是 t
分鐘, 每分鐘美國隊長和鋼鐵俠都可能消滅 0 個或 1 個外星人。 我們用一
個長度為 t 的字串 S 來描述這場戰鬥, 每個
『NOIP普及:數論組題訓練』
T1 埃匹希斯水晶
題目描述
大家都知道,卡德加是個神奇的法師。 有一天,他發現了一種可以作用在埃匹希斯水晶上的魔法:在左右兩個祭壇上放一定量的水晶,然後施放一個法術,左邊一堆的水晶數量會變成原來兩個祭壇上水晶之和,右邊一堆會變成兩個祭壇上水晶數量之差。
卡德
『NOIP普及組訓練題:動態規劃專練』
NOIP普及組訓練題:動態規劃專練
T1蛋糕塔
題目描述
Hl高中要舉行一場蛋糕塔比賽。注意,不是蛋糕比賽,而是蛋糕塔比賽。
學校會提供N種不同型別的蛋糕,第i種蛋糕的高度為Hi(5 <= H_i <= T),營養價值為Vi(1 <= Vi&l
『NOIP普及組模擬考試題解』
1. 水水の題
[問題描述]
嗯……水水的題。 ti。梯。電梯? emmmmm……
那麼,有一座電梯,它上升一層需要 6 秒鐘,下降一層需要 4 秒鐘,如果
要讓它停下,它會停 5 秒鐘。
現在告訴你,它要按順序到達然後停靠的 N 個樓層,求它需要的時間。
電
NOIP普及組第一題:買鉛筆
參加考試的時候,第一題我足足花了四十多分鐘(因為那奇葩的鍵盤,幸好我向老師報告更換了鍵盤),還是隻得了五十分。。。
題目描述:
P老師需要去商店買n支鉛筆作為小朋友們參加NOIP的禮物。她發現商店一共有 3種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,價格也
博弈論(noip普及組2010第四題 三國遊戲)
三國 勝利 沒有 blog hang max efi () turn 小涵很喜歡電腦遊戲,這些天他正在玩一個叫做《三國》的遊戲。
在遊戲中,小涵和計算機各執一方,組建各自的軍隊進行對戰。遊戲中共有 N 位武將(N為偶數且不小於 4),任意兩個武將之間有一個“默
[jzoj]2018.07.12【NOIP普及組】模擬賽D組:解題報告
1.權勢二進位制
題目:
一個十進位制整數被叫做權勢二進位制,當他的十進位制表示的時候只由0或1組成。例如0,1,101,110011都是權勢二進位制而2,12,900不是。
當給定一個n的時候,計算一下最少要多少個權勢二進位制相加才能得到n。
輸入:
k組測試資料。
輸出:
[jzoj]2018.07.15【NOIP普及組】模擬賽D組:解題報告
目錄:
1.馬農
2.馬語翻譯
3.馬球比賽
4.棋盤遊戲
1.馬農
題目描述:
在觀看完戰馬檢閱之後,來自大草原的兩兄弟決心成為超級“馬農”,專門飼養戰馬。 兄弟兩回到草原,將可以養馬的區域,分為 N*N 的單位面積的正方形, 並實地進行考察,歸納出了每
NOIP普及組蒟蒻掙扎之模擬賽C組 第四題 ——約數國の王♂
轉自jzoj & c渣渣黨福利
題目描述
數學的王國裡,有一些約數國王……約數國王的定義是這樣的:一個大於1的整數n,如果它約數的個數比1~n-1的每個整數的約數的個數都要多,那麼我們就稱它為約數國王。聰明的(______)在奧數書上認識了它們,於是
[jzoj]2018.07.11【NOIP普及組】模擬賽D組:解題報告
目錄
1.和諧數
2.分數
3.終極數
4.串
1.和諧數
給定一個長度為N的序列a,對於每一個數都可選或不選,把選出的數有序組成一個新的序列b,使b序列的“和諧數”最大。一個序列的和諧數如下定義:對於位置i,如果第奇數次選的則加上bi,偶數次選的則減去bi
注
NOIP普及組題解(能有民間資料的三題)
普及組題解pascal版本(能測民間資料的三題)
1.成績(score.cpp/c/pas)
【問題描述】
牛牛最近學習了 C++入門課程,這門課程的總成績計算方法是:
總成績=作業成績×20%+小測
NOIP普及組第1題(1995-2018)
.net www noip2009 isn 分解 標題 new 號碼 article NOIP1995普及組復賽第1題https://blog.csdn.net/secret_zz/article/details/76862335https://blog.csdn.net/
NOIP普及組第2題(1995-2018)
編程 show crack org 高精度 -- ive mrc 最大公約數 NOIP1995 普及組復賽第 2 題 方陣填數https://blog.csdn.net/WDAJSNHC/article/details/79381876
NOIP1996普及組第2題 格子問
noip普及組2004 火星人
簡單 第一個 fst 範圍 namespace while 限制 mut 這樣的 火星人
描述
人類終於登上了火星的土地並且見到了神秘的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把一個非常大的數字
noip普及組2004 FBI樹
length name 組成 clas turn line fib 遍歷 bool FBI樹
描述
我們可以把由“0”和“1”組成的字符串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。
FBI樹是一種二叉樹1,它的結點類型也包括F結點
noip普及組2007 紀念品分組
spa 滿足 格式 oca mes logs pac syn 相對 紀念品分組
描述
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品, 並且每組紀念品
算法題:整形數組找a和b使得a+b=n
算法 組成 數字 說明 占用空間 都沒有 1-1 素數 個數字 題目:
數組 A 由 1000 萬個隨機正整數 (int) 組成,設計算法,給定整數 n,在 A 中找出 a 和 b,使其符合如下等式:
n = a + b
解題思路:
1. 1000w個隨機正整數占用空
noip普及組2013 車站分級(luogu P1983)
eof 矩陣 oid har 一個 org pac 題目 style 原題鏈接:https://www.luogu.org/problem/show?pid=1983
題目大意:每個車站有一個權值,每一車次始發站與終點站之間如果有不停靠的點,那麽它的權值一定比停靠的點的權值