2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化
2016 Multi-University Training Contest 2
A - Acperience
題意:給出w[],求S((w[i]-aB[i])^2)的最小值(B[i]為1或-1)。
tags:一看到就搞了個三分上去,估計是精度問題,一直挖,23333。。
就是把這個公式推下去,最后化簡為 ans=S(w[i]^2) - ((S(abs(w[i])))^2)/n 。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 100005;ll w[N], s1, s2, n; int main() {int T; scanf("%d", &T);while(T--){s1=s2=0;scanf("%lld", &n);rep(i,1,n) {scanf("%lld", &w[i]);s1+= w[i]*w[i], s2+= abs(w[i]); // 絕對值。。在這挖了幾發(fā) }s1=n*s1-s2*s2;printf("%lld/%lld\n", s1/__gcd(s1,n), n/__gcd(s1,n));}return 0; }View Code
?E - Eureka
題意: 給出 n個點,多個在同一條直線上的點可以構(gòu)成一個集合,問有多少個集合。
tags:
?
I?? 水題
K? 水題
L - La Vie en rose
題意:兩個字符串A、B。 B可以通過交換相鄰位置的字符(每次每個位置只能交換一下)生成其它多個字符串。問A的每個位置(a[i]到a[i+lenB-1])是否可以匹配B或由B生成的字符串。
tags:? 好題 ? ?? 雖然題意有點迷,但確實好題,可以練練bitset壓位。可以參考大佬博客
dp[i][j][k]表示A匹配到第 i個位置,B匹配到第 j個位置時的情況(k為0表示B第 j個位置不交換,為1表示第 j個位置和 j-1交換,為2表示和 j+1交換)。 然后dp轉(zhuǎn)移:
dp[i][j][0] = (dp[i-1][j-1][0] or dp[i-1][j-1][1]) and (A[i]==B[j]) dp[i][j][1] = dp[i-1][j-1][2] and (A[i]==B[j-1]) dp[i][j][2] = (dp[i-1][j-1][0] or dp[i-1][j-1][1] ) and (A[i]==B[j+1])
直接寫出循環(huán)就是:
for(int j=1; j<=lenB; ++j)for(int i=1; i<=lenA; ++i) {dp[i][j][k]= }
但這樣O(N*M)肯定超時,這里就是關(guān)鍵,又一次體會到了二進制的神奇。把dp[][][]的第一位壓入bitset,第二層for循環(huán)就可以利用bitset的位運算操作完成,實現(xiàn)常數(shù)優(yōu)化,即O(N*M/w)卡過。? 另外dp[][][]第二維因為每次只要用到上一次的數(shù)據(jù),所以可以滾動數(shù)組優(yōu)化內(nèi)存。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 100005, M=5005;int la, lb; char A[N], B[N]; bitset<N> dp[2][3], bs[26]; int main() {int T; scanf("%d", &T);while(T--) {scanf("%d %d %s %s", &la, &lb, A+1, B+1);rep(i,0,25) bs[i].reset();rep(i,1,la) bs[A[i]-'a'][i]=1;int now=0, las;dp[0][0]=bs[B[1]-'a']; if(lb>1) dp[0][2]=bs[B[2]-'a'];rep(j,2,lb) {las=now, now^=1;dp[now][0] = ((dp[las][0] | dp[las][1])<<1) & bs[B[j]-'a']; // 因為求出的是第i-1位的,<<1轉(zhuǎn)到第i位。&bs[]是檢測A[]==B[]dp[now][1] = (dp[las][2]<<1) & bs[B[j-1]-'a'];if(j<lb) dp[now][2] = ((dp[las][0] | dp[las][1])<<1) & bs[B[j+1]-'a'];}rep(i,1,la) {int ii=i+lb-1;if(ii<=la && (dp[now][0][ii] || dp[now][1][ii])) putchar('1');else putchar('0');} puts("");}return 0; }View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/sbfhy/p/6740006.html
總結(jié)
以上是生活随笔為你收集整理的2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又拍云SSL证书全新上线,提供一站式HT
- 下一篇: 上周设计师,哪个部件涨了?