1. 程式人生 > >濟南刷題衝刺 Day2 下午

濟南刷題衝刺 Day2 下午

P105
zhx

競賽時間:????年??月??日??:??-??:??

題目名稱

洗澡

日記

洗衣

名稱

shower

diary

cloth

輸入

shower.in

diary.in

cloth.in

輸出

shower.out

diary.out

cloth.out

每個測試點時限

1s

1s

1s

記憶體限制

256MB

256MB

256MB

測試點數目

10

10

10

每個測試點分值

10

10

10

是否有部分分

題目型別

傳統

傳統

傳統

注意事項(請務必仔細閱讀):

洗澡

【問題描述】

你是能看到第一題的friends呢。

——hja

洗澡的地方,有一段括號序列,將一個括號修改一次需要1的代價(將左括號變成右括號或者相反),求最小代價使得括號序列合法。

【輸入格式】

一行一個括號序列。

【輸出格式】

一行一個整數代表答案。

【樣例輸入】

())(

【樣例輸出】

2

【資料範圍與規定】

對於50%的資料,括號序列長度不超過100。

對於100%的資料,括號序列長度不超過105且一定為偶數,只包含小括號。

#include
#include
#include
#include
#define MAXN 100005
using namespace std;
char s[MAXN],st[MAXN];

int main(int argc,char *argv[]) {
	freopen("shower.in","r",stdin);
	freopen("shower.out","w",stdout);
	scanf("%s",s + 1);
	int len = strlen(s + 1),top = 0,Ans = 0;
	for(int i=1; i<=len; ++i) {
		if(s[i] == ')') {
			if(top > 0) top--;
			else st[++top] = '(',++Ans;
		}
		else if(s[i] == '(') st[++top] = '(';
	}
	printf("%d\n",top/2 + Ans);
	fclose(stdin); fclose(stdout);
	return 0;
}

日記

【問題描述】

你是能看到第二題的friends呢。

 ——laekov

日記之中,寫滿了質數,兩個質數之間如果沒有其他質數,那麼則稱為相鄰的質數。給定N,k,詢問不超過N的數中能夠表示成連續k個質數之和的最大的數是多少。

【輸入格式】

第一行一個整數T代表資料組數。

對於每組資料,一行行兩個整數N,k。

【輸出格式】

對於每組資料,一行一個整數代表答案。如果不存在,則輸出-1。

【樣例輸入】

3

20 2

20 3

20 4

【樣例輸出】

18

15

17

【資料範圍與規定】

對於20%的資料,1≤N≤100。

對於40%的資料,T=1。

對於另外20%的資料,所有的詢問的N相等。

對於100%的資料,1≤T<2000,1≤N≤106。

#include
#include
#include
#include
#define MAXN 1000005
using namespace std;
typedef long long LL;
bool is_prime[MAXN];
int prime[100005];
LL sum[100005];
inline void read(int &x) {
	x = 0; register char c = getchar();
	while(!isdigit(c)) c = getchar();
	while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
}

int main(int argc,char *argv[]) {
	int tot = 0,T,n,k;
	for(int i=2; i<=1000000; ++i) {
		if(!is_prime[i]) prime[++tot] = i;
		for(int j=1; j<=tot&&prime[j]*i<=MAXN; ++j) {
			is_prime[i * prime[j]] = true;
			if(i % prime[j] == 0) break;
		}
	}
	for(int i=1; i<=tot; ++i) sum[i] = sum[i-1] + prime[i];
	read(T);
	while(T--) {
		read(n),read(k);
		int Mid,l = 1, r = tot - k + 2,Ans = -1;
		if(r <= 1) { printf("-1\n");continue; }
		while(l <= r) {
			int Mid = l + r >> 1;
			if(sum[Mid + k - 1] - sum[Mid - 1] <= n) l = Mid + 1, Ans = Mid;
			else r = Mid - 1;
		}
		if(sum[Ans + k - 1] - sum[Ans - 1] <= n && Ans != -1) printf("%lld\n",sum[Ans + k - 1] - sum[Ans - 1]);
		else printf("-1\n");
	}
}

洗衣

【問題描述】

你是能看到第三題的friends呢。

——aoao

洗完衣服,就要晒在樹上。但是這個世界並沒有樹,我們需要重新開始造樹。我們一開始擁有T0,是一棵只有一個點的樹,我們要用它造出更多的樹。

生成第i棵樹我們需要五個引數ai,bi,ci,di,li(ai,bi<i)。我們生成第i棵樹是將第ai棵樹的ci號點和第bi棵樹的di號點用一條長度為li的邊連線起來形成的新的樹(不會改變原來兩棵樹)。下面我們需要對新樹中的點重編號:對於原來在第ai棵樹中的點,我們不會改變他們的編號;對於原來在第bi棵樹中的點,我們會將他們的編號加上第ai棵樹的點的個數作為新的編號。

定義

FTi=i=0n-1j=i+1n-1d(vi,vj)

其中,n為樹Ti的大小,vi,vj是Ti中的點,d(vi,vj)代表這兩個點的距離。現在希望你求出∀1≤i≤m,FTi是多少。

【輸入格式】

第一行一個整數m,代表要造多少棵樹。

接下來m行,每行5個數ai,bi,ci,di,li。

【輸出格式】

m行每行一個整數代表F(Ti)對109+7取模之後的值。

【樣例輸入】

3

0 0 0 0 2

1 1 0 0 4

2 2 1 0 3

【樣例輸出】

2

28

216

【資料規模與約定】

對於30%的資料,1≤m≤10。

對於60%的資料,每棵樹的點數個數不超過105。

對於100%的資料,1≤m≤60。

#include
#include
#include
#include
#include

using namespace std;

const int mo=1000000007;
const int maxn=100;

int n,id1[maxn],id2[maxn],l[maxn],res[maxn];

long long num1[maxn],num2[maxn],size[maxn];

struct rec
{
    int p;
    long long p1,p2;
    rec(){}
    rec(int a,long long b,long long c)
    {
        p=a;
        if (b ,int > ma;

map ma2;

int solve(int p,long long p1,long long p2)
{
    if (!p) return 0;
    if (p1==p2) return 0;
    rec x=rec(p,p1,p2);
    if (ma2.count(x)) return ma2[x];
    if (p1 px;
    px=make_pair(p,n);
    if (ma.count(make_pair(p,n))) return ma[px];
    if (n