20181220第二週周訓思路整理
阿新 • • 發佈:2018-12-30
第二週題解
訓練時間:2018/12/21-2018/12/28
訓練時間:2018/12/21-2018/12/28
好吧,沒時間寫題解,思路都有。還好,題目不難,所以靠你們自己咯。
Problem List
- BZOJ5027:數學題Click me
擴充套件歐幾里得演算法 - BZOJ1977:次小生成樹Click me
次小生成樹 - HDU1536:S-NimClick me
博弈論 - BZOJ4919:大根堆 Click me
線段樹 - HDU1251:統計難題Click me
字典樹 - CF558E:A Simple TaskClick me
線段樹 - CF985F:Isomorphic StringsClick me
字串雜湊 - HDU5950:Recursive sequenceClick me
矩陣乘法 - WOJ708:StatisticianClick me
二分 - HDU3549:Flow ProblemClick me
網路流最大流
Problem List
- BZOJ5027:數學題Click me
擴充套件歐幾里得演算法.
求出一組解,然後再根據一組解,求出通解。然後就可以求解解的個數了。
還是比較簡單的,程式碼呢。。。。好吧,沒有。哈哈哈哈,自己寫
完成時間:
- BZOJ1977:次小生成樹Click me
次小生成樹模板題
完成時間:
- HDU1536:S-NimClick me
博弈論,SG函式模板題 /* 哈,又因為vis陣列的大小超時了。orz... 哈,還WA了。除錯語句忘了註釋。orz... 哈,還WA!。沒有給f陣列排序,想想為什麼需要排序! */ #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int N = 10005; int f[N],vis[105],SG[N],num[N]; int n,m,k,c; void Init() { for(int i=1;i<N;i++) { memset(vis,0,sizeof(vis)); for(int j=1;f[j]<=i&&j<=k;j++) vis[SG[i-f[j]]]=1; for(int j=0;;j++) if(vis[j]==0) { SG[i]=j; break; } } } int main() { // freopen("1.in","r",stdin); while(cin>>k) { if(k==0) break; for(int i=1;i<=k;i++) cin>>f[i]; sort(f+1,f+k+1); // 注意了,要排序 Init(); cin>>m; for(int i=1;i<=m;i++) { cin>>c; int sum=0; for(int j=1;j<=c;j++) cin>>num[j],sum^=SG[num[j]]; if(sum) cout<<"W"; else cout<<"L"; } cout<<endl; } return 0; }
完成時間:
- BZOJ4919:大根堆 Click me
線段樹合併
完成時間:
- HDU1251:統計難題Click me
字典樹模板題,是不是很簡單呢?
完成時間:
- CF558E:A Simple TaskClick me
線段樹題目。
完成時間:
- CF985F:Isomorphic StringsClick me
字串雜湊,判斷是否同構。
這個題目還是蠻有意思的,直接從cf拷來了我當年的程式碼。哈哈哈哈
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long p[300005];
long long Hash[300005][30];
long long mod=1e9+7,base=13;
string s;
long long getHash(int l,int r,int i)
{
return ((Hash[r][i]-Hash[l-1][i]*p[r-l+1])%mod+mod)%mod;
}
bool check(int l,int l1,int len)
{
long long h1[30],h2[30];
for(int i=0;i<26;i++){
h1[i]=getHash(l,l+len-1,i);
h2[i]=getHash(l1,l1+len-1,i);
}
sort(h1,h1+26);
sort(h2,h2+26);
for(int i=0;i<26;i++)
if(h1[i]!=h2[i]) return false;
return true;
}
int main()
{
cin>>n>>m>>s;
s="#"+s;
p[0]=1;
for(int i=1;i<=n;i++) p[i]=(p[i-1]*base)%mod;
for(int i=1;i<=n;i++){
for(int j=0;j<26;j++){ // 列舉26個字母
Hash[i][j]=(Hash[i-1][j]*base+(s[i]==('a'+j)))%mod;
}
}
int l,r,len;
while(m--){
cin>>l>>r>>len;
if(check(l,r,len)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
完成時間:
- HDU5950:Recursive sequenceClick me
2016ACM/ICPC亞洲區瀋陽站.現場賽總是會有些水題。就看會不會了。
如果會矩陣乘法,那就是一道超級大水題了。
/*
f[n]=2*f[n-2]+f[n-1]+i^4;
矩陣乘法,不過i^4,有點噁心
f[n] 1 2 1 0 0 0 0 f[n-1]
f[n-1] 1 0 0 0 0 0 0 f[n-2]
(n+1)^4 0 0 1 4 6 4 1 n^4
(n+1)^3 0 0 0 1 3 3 1 n^3
(n+1)^2 0 0 0 0 1 2 1 n^2
(n+1) 0 0 0 0 0 1 1 n
1 0 0 0 0 0 0 1 1
n=3,[b,a,81,27,9,3,1]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MOD 2147493647
using namespace std;
int n,A,B;
struct node
{
int n,m; // row,col
long long a[10][10]; // 元素
void init()
{
a[0][0] = 1,a[0][1] = 2,a[0][2] = 1,a[0][3] = 0,a[0][4] = 0,a[0][5] = 0,a[0][6] = 0;
a[1][0] = 1,a[1][1] = 0,a[1][2] = 0,a[1][3] = 0,a[1][4] = 0,a[1][5] = 0,a[1][6] = 0;
a[2][0] = 0,a[2][1] = 0,a[2][2] = 1,a[2][3] = 4,a[2][4] = 6,a[2][5] = 4,a[2][6] = 1;
a[3][0] = 0,a[3][1] = 0,a[3][2] = 0,a[3][3] = 1,a[3][4] = 3,a[3][5] = 3,a[3][6] = 1;
a[4][0] = 0,a[4][1] = 0,a[4][2] = 0,a[4][3] = 0,a[4][4] = 1,a[4][5] = 2,a[4][6] = 1;
a[5][0] = 0,a[5][1] = 0,a[5][2] = 0,a[5][3] = 0,a[5][4] = 0,a[5][5] = 1,a[5][6] = 1;
a[6][0] = 0,a[6][1] = 0,a[6][2] = 0,a[6][3] = 0,a[6][4] = 0,a[6][5] = 0,a[6][6] = 1;
}
void init2()
{
a[0][0] = B;
a[1][0] = A;
a[2][0] = 81;
a[3][0] = 27;
a[4][0] = 9;
a[5][0] = 3;
a[6][0] = 1;
}
};
node mul(node a,node b)
{
node c;c.n=a.n,c.m=b.m;
for(int R=0;R<=a.n;R++) // 列舉行
{
for(int C=0;C<=b.m;C++) // 列舉列
{
c.a[R][C]=0;
for(int k=0;k<=a.m;k++)
{
c.a[R][C]=(c.a[R][C]+(a.a[R][k]*b.a[k][C]))%MOD;
}
}
}
return c;
}
void print(node a)
{
for(int i=0;i<=a.n;i++)
{
for(int j=0;j<=a.m;j++)
{
cout<<a.a[i][j]<<' ';
}
cout<<endl;
}
}
void solve()
{
int row=6;
node a;a.n=a.m=row;a.init();
node b;b.n=row;b.m=0;b.init2();
node res;res.init();
res.n=res.m=row;
int k=n-3;
while(k)
{
if(k&1) res=mul(res,a);
k/=2;
a=mul(a,a);
}
// print(res);cout<<endl;
// print(b);cout<<endl;
res=mul(res,b);
cout<<res.a[0][0]%MOD<<endl;
}
long long read()
{
long long x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}
return x*f;
}
int main()
{
long long t=read();
while(t--)
{
n=read();A=read();B=read();
solve();
}
return 0;
}
完成時間:
- WOJ708:StatisticianClick me
這道題目,是你們曾經做過的一道題目的類似題,換了一下描述而已。看出來了嗎?
完成時間:
- HDU3549:Flow ProblemClick me
這是一道網路流的模板題?好吧,so easy。自己寫!
完成時間: