hdu6772
题目
暴力优化题
前向星 瞎搞搞
#include <bits/stdc++.h>
using namespace std;
int n,k;
typedef struct node
{
int a,b,c,d;
int next;
}node;
node no[55];
int head[55]={0};
int index[55]={0};
int T;
int cnt;
int ans;
int bns;
int cns;
int dns;
int res;
long long max_;
void dfs(int dep)
{
if(dep==res)
{
long long ssss=(long long)ans*bns*cns*dns;
if(ssss>max_)
max_=ssss;
return;
}
for(int i=head[index[dep]];i;i=no[i].next)
{
ans+=no[i].a;
bns+=no[i].b;
cns+=no[i].c;
dns+=no[i].d;
dfs(dep+1);
ans-=no[i].a;
bns-=no[i].b;
cns-=no[i].c;
dns-=no[i].d;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;
while(T--)
{
memset(head,0,sizeof(head));
cnt=1;
max_=0;
ans=100;
bns=100;
cns=dns=100;
res=0;
cin>>n>>k;
for(int i=0;i<n;i++)
{
int t,a,b,c,d;
cin>>t>>a>>b>>c>>d;
no[cnt].a=a;
no[cnt].b=b;
no[cnt].c=c;
no[cnt].d=d;
no[cnt].next=head[t];
head[t]=cnt;
cnt++;
}
for(int i=0;i<55;i++)
{
if(head[i]!=0)
{
index[res++]=i;
}
}
dfs(0);
cout<<max_<<endl;
}
return 0;
}
hdu6763
铁索连环点连环
把大点先入,小点后入并查集优化求贡献
题目
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const int maxm=2e5+5;
int n,m;
int fa[maxn];
int head[maxn];
int b[maxn];
int inde[maxn];
int vis[maxn];
int cnt;
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct edge
{
int v,next;
};
edge no[maxm*2];
ll ans=0;
void init()
{
cnt=1;
ans=0;
for(int i=1;i<=n;i++)
{
head[i]=0;
inde[i]=i;
fa[i]=i;
vis[i]=0;
}
}
void add(int x,int y)
{
no[cnt].v=y;
no[cnt].next=head[x];
head[x]=cnt;
cnt++;
}
bool cmp(int aa,int bb)
{
return b[aa]>b[bb];
}
void solve()
{
for(int i=1;i<=n;i++)
{
cin>>b[i];
ans+=b[i];
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
sort(inde+1,inde+n+1,cmp);
for(int i=1;i<=n;i++)
{
vis[inde[i]]=1;
int u=inde[i];
for(int j=head[u];j;j=no[j].next)
{
int v=no[j].v;
if(!vis[v])
continue;
int fax=find(u);
int fay=find(v);
if(fax!=fay)
{
ans-=b[u];
fa[fax]=fay;
}
}
}
cout<<ans<<endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int _=1;
cin>>_;
while(_--)
{
cin>>n>>m;
init();
solve();
}
return 0;
}
hdu6768
题目
因为求出那个什么A B C 再搞i 虽然他会爆 ll 但是对 i 没有影响
#include <iostream>
using namespace std;
long long f[2000001];
long long A,B,C;
long long read()
{
long long res=0;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x==0)
continue;
res=res+f[i];
}
return res;
}
int main()
{
f[0]=1;
f[1]=1;
for(int i=2;i<2000001;i++)
f[i]=f[i-1]+f[i-2];
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
A=read();
B=read();
C=read();
A=A*B;
for(int i=1;;i++)
{
if(C+f[i]==A)
{
cout<<i<<"\n";
break;
}
}
}
return 0;
}
hdu6774
题目
正常的s,t 最长子序列是
i j
if(s[i]==t[j]) c[i][j]=c[i-1][j-1]+1;
else c[i][j]=max(c[i-1][j],c[i][j-1]);
o(nm)
这题有q会t
所以先预处理那个 g[i][j] 表示第i(包括i) 及以后的第一次出现 j的位置
然后 f[i][j]表示那个什么t的 前i位 匹配了j个序列的最小位置
if(f[i+1][j]<f[i][j])
f[i+1][j]=f[i][j];
if(f[i][j]<r) ///在r前找的到
{
f[i+1][j+1]=g[f[i][j]+1][t[i]-‘a’];///t 从0开始
}
#include <iostream>
using namespace std;
string s,t;
int n,m;
int g[100005][26];
int T;
int f[25][25];
int qiu(int l,int r)
{
for(int i=0;i<=m;i++)
{
for(int j=0;j<=i;j++)
{
f[i][j]=n+1;
}
}
f[0][0]=l-1;
for(int i=0;i<m;i++)
{
for(int j=0;j<=i;j++)
{
if(f[i+1][j]>f[i][j])
f[i+1][j]=f[i][j];
if(f[i][j]<n+1)
{
f[i+1][j+1]=g[f[i][j]+1][t[i]-'a'];
}
}
}
for(int i=m;i>=1;i--)
{
for(int j=m;j>=i;j--)
{
if(f[j][i]<=r)
return i;
}
}
return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;
while(T--)
{
cin>>s>>t;
n=s.size();
m=t.size();
for(int i=0;i<26;i++)
{
g[n+1][i]=n+1;
}
for(int i=n;i>0;i--)
{
for(int j=0;j<26;j++)
{
g[i][j]=g[i+1][j];
}
g[i][s[i-1]-'a']=i;
}
int q;
cin>>q;
while(q--)
{
int l,r;
cin>>l>>r;
cout<<r-l+1+m-2*qiu(l,r)<<endl;
}
}
return 0;
}