1. 程式人生 > >『NOIP普及:數學推導組題訓練』

『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 的所有“好” 的非空子串的數量。 如果字串一樣但位置
不同分開計算數量。
【 輸入格式(

fight.in)】
輸入第一行包含 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。

解析

顯然的,方便區間統計,我們先要做兩個字首和陣列:sumM[i]sumM[i]代表前i個位置美隊消滅的敵人數,sumG[i]sumG[i]代表前i個位置鋼鐵俠消滅的敵人數。題目中要求“好”的字串中鋼鐵俠消滅的敵人數和美隊消滅的敵人數成比例,也就是說:
sumG[r]sumG[l1]sumM[r]sumM[l1]=g

m\frac{sumG[r]-sumG[l-1]}{sumM[r]-sumM[l-1]}=\frac{g}{m}
那麼子串[l,r]就是“好”的。
那麼,接下來就是對這個式子進行推導(xiagao)了:
sumG[r]sumG[l1]sumM[r]sumM[l1]=gm\frac{sumG[r]-sumG[l-1]}{sumM[r]-sumM[l-1]}=\frac{g}{m}
(sumG[r]sumG[l1])m=(sumM[r]sumM[l1])g(sumG[r]-sumG[l-1])*m=(sumM[r]-sumM[l-1])*g
msumG[r]msumG[l1]=gsumM[r]gsumM[l1]m*sumG[r]-m*sumG[l-1]=g*sumM[r]-g*sumM[l-1]
msumG[r]gsumM[r]=msumG[l1]gsumM[l1]m*sumG[r]-g*sumM[r]=m*sumG[l-1]-g*sumM[l-1]
接下來神奇的事情就發生了:我們發現變形後的式子左右兩邊的形式完全相同,而且陣列下標只分別和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。

解析

由於三個點的橫座標,縱座標各不相同,且他們是無法辨識的,我們不妨設x1&lt;x2&lt;x3,y1&lt;y2&lt;y3x_1&lt;x_2&lt;x_3,y_1&lt;y_2&lt;y_3,則他們的花費就一定是2x3x1+2y3y12|x_3-x_1|+2|y_3-y_1|,我們很容易就能發現這三個點的排列順序互換時,他們的兩兩間曼哈頓距離之和是不變的,所以,當我們確切的找到三個點的座標時,它其實對答案貢獻了3=63!=6種方案,然而我們其實只需要確定最左下角和最右上角的點,中間的點是可以隨意移動,構成多種方案的,所以,我們列舉x1,y1,x3,y3x_1,y_1,x_3,y_3且保證x3x1&gt;1,y3y1&gt;1x_3-x_1&gt;1,y_3-y_1&gt;1,那麼在代價符合範圍條件是,它就對答案造成了6(x3x11)(y3y11)6*(x_3-x_1-1)*(y_3-y_1-1)種方案的貢獻(因為中間點是可以在內部隨意移動的),四重迴圈列舉,這就是30分的寫法。
換個思路,我們可以列舉最左下角的點和最右上角的點構成的矩形,即列舉它的長(x)和寬(y)。這時它的花費是2(x+y2)2*(x+y-2),它的貢獻是6(x2)(y2)6*(x-2)*(y-2),這時,這樣列舉的好處就體現出來了,我們可以直接計算出這樣的矩形有幾個:(nx+1)(my+1)(n-x+1)*(m-y+1)個,那麼這種情況下的所有方案也就算出來了:當l2(x+y2)rl≤2*(x+y-2)≤r時,邊長為xyx,y的矩形總貢獻為6(x2)(y2)(nx+1)(my+1)6*(x-2)*(y-2)*(n-x+1)*(m-y+1),那麼O(n2)O(n^2)列舉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 題目大意:每個車站有一個權值,每一車次始發站與終點站之間如果有不停靠的點,那麽它的權值一定比停靠的點的權值