2020杭電多校第二場(解題報告)

2021-10-08 11:57:06 字數 3255 閱讀 6323

題意:有個n個點m條邊的圖,每個點都有權值,每次可以選擇乙個點權全是正數的連通塊,讓他們的權值整體-1,問把所有點權值變成0需要多少次操作。(1≤n,m≤1e5)

樣例輸入:

1

3 23 2 3

1 22 3

輸出:

4
hint:並查集。

正難則反。反著操作,先按照權值從大到小排序,從最大點開始倒著新增邊,一開始加入新的點,作為單獨的個體i,需要操作ai次,然後把他相鄰的邊依次加上。當他的存在使得兩個連通塊融合時,那麼兩個連通塊共享這個i,並且兩個連通塊上所有點權值都大於i,因此省去了ai次操作,答案-ai。

ac**: 

#includeusing namespace std;

const int n = 123456;

int pre[n],vis[n];

struct node

}a[n];

vectorv[n];

int find(int a)

int main();

}for(int i=1;i<=m;i++)

sort(a+1,a+n+1);

long long sum=0;

for(int i=1;i<=n;i++)

}vis[id]=1;

}printf("%lld\n",sum);

}system("pause");

return 0;

}

題意:f[i]是斐波那契數列,f[1]=1,f[2]=2,f[3]=3,f[4]=5

bb:其中bi=,每個數都可以用某些斐波那契數相加得到,比如4==1*1+0*2+1*3

給出abc的bb表示,問是否有乙個fk使得a*b=c+fk。範圍如下:

輸入:

1

3 1 0 1

4 0 0 0 1

6 0 1 0 0 0 1

輸出:

4
hint:unsigned long long的自然溢位可以實現,直接暴力跑 ,不過注意開陣列範圍要超過2e6。

#includeusing namespace std;

const int n = 2345678;

#define ull unsigned long long

ull f[n];

ull inline read()

return ans;

}int main()

system("pause");

return 0;

}

題意:有n個裝備,不超過k種,每種裝備都有它的屬性值ai,bi,ci,di,讓你取出不同種類的各一種,使得以下式子的值最大

輸入:

1

6 41 17 25 10 0

2 0 0 25 14

4 17 0 21 0

1 5 22 0 10

2 0 16 20 0

4 37 0 0 0

輸出:

297882000
hint:優化版的暴搜(新增了個nxt陣列,可以少跑好幾層遞迴)

ac**: 

#includeusing namespace std;

#define ll long long

struct nodetmp;

vectorv[55];

ll ans=0;

int n,k;

int nxt[55];

void dfs(int x,int a,int b,int c,int d)

if(v[x].size()==0)

for(auto i:v[x])

}int main();

v[op].push_back(tmp);

}int x=k+1;

for(int i=k;i;i--)

ans=0;

dfs(1,100,100,100,100);

printf("%lld\n",ans);

}system("pause");

return 0;

}

題意: 給字串a,b,q次查詢,求a[l...r]與b的最長公共子串

輸入:

1

qaqaqwqaqaq

qaqwqaq

31 7

2 83 9

輸出:

4

20

hint:序列自動機+dp求lcs 

nxt[i][j]表示a[i...n]種第乙個出現字母j的位置

dp[i][j]表示b的前i個字母匹配了j個了,最後乙個匹配的字母在a中的位置

#includeusing namespace std;

const int n = 123456;

int nxt[n][50];//a[i...n]中字母j的最近位置

int dp[50][50];//b中前i個字母匹配了j個,dp[i][j]表示最後乙個匹配的字母在a中的位置

char a[n],b[n];

void get_nxt()

nxt[i][a[i]-'a']=i;

}}int main()

}int tmp=lenb;

while(tmp)

printf("%d\n",r-l+1+lenb-tmp*2);}}

system("pause");

return 0;

}

2019杭電多校第二場

今天也是一條鹹魚orz 場上三題 e,j,k e everything is generated in equal probability 題解 乙個長度為n的排列的逆序期望為c n,2 2 因為每一對下標的貢獻都是1 2.然後設dp i dp i dp i 為長度為i ii的隨機排列的culcul...

2019杭電多校第二場

給定乙個 n 從 1,n 中等概率取出乙個數,再等概率生成乙個 n 的全排列,再計算這個全排列的函式值,求這個函式值的期望。函式表達為輸入乙個全排列,計算其逆序數,再等概率取出乙個子串行 可以是空,可以是原序列 遞迴計算該子串行的函式值,累加返回。include using namespace st...

2018暑假杭電多校第二場

問了yxz後做的。這個是我一般寫線段樹的方法,才覺得感覺有點麻煩,還是yxz的寫法安逸些 include bits stdc h define out x cout x typedef long long ll const ll maxn 5e5 5 int n,m int b maxn struc...