濟南刷題衝刺 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