您的位置:首页 > 其它

151014总结

2015-10-14 15:46 357 查看
T1

开考后2min,由于看错范围,写了个大暴力。。写完才发现范围看错了

想了好久只想到贪心,然后写了个对拍,统计下错误率大概7.5%

管他的先去T2T3

T2

要求求出矩阵中某个定值有多少个

考场上维护前缀和序列,维护多项式的积,由于数字很小可以扔进一个桶里

然后写了个对拍 最后90分,因为没特判0

T3

看到题完全没想法,然后写暴力写到一半发现有很多多余的操作

果断开始乱搞

1.假如一个操作出现了很多次,后面的无视掉

2.每次出现一个约数,如果随机很多个数都没有这个约数的话也无视掉

然后写了一个程序,发现效果并不是那么好

继续乱搞,假如我随机20个序列里面的数,把约数全部提出来,然后存起来去重,效果应该不错?

由于指定约数至少出现一半,我可以把这些全部存起来然后挨个验证

由于2*3*5*7*...*37>10^12,所以约数个数不会超过12,20个数约数总数不会太多

那么乱搞算法来了:map对约数去重,随机20个数,挨个取约数然后挨个验证

然后写程序,发现效果真的很不错,但是有些构造数据会卡住

那么再加个优化,如果这个数大于10^12直接不要了,结果瞬间过掉构造数据

后面又写了一些小优化,然后强大的构造数据都卡不掉我。最后100分

考完后:卧槽,表算也是这个思想!吓尿了

回到T1,没时间了,写拼程序吧

最终90+90+100,给我的启发就是乱搞+优化是可行的

附上代码

T1
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll n;
int c[66];
long long ans;
long long p,q;
ll a[55],b[55],t1,t2;
bool used[55];
char s[55];
void bf()
{
for(int i=1;i<=(1<<(n<<1));i++)
{
int t=1;
while(c[t]==1)
{
c[t]=0;
t++;
}
c[t]=1;
int ans1=0,ans2=0;
for(int j=1;j<=(n<<1);j++)
{
if(c[j]==1)ans1++;
else ans2++;
}
if(ans1!=ans2)continue;
long long k1=0,k2=0;
for(int j=1;j<=(n<<1);j++)
{
if(c[j]==1)k1=k1*10+s[j]-'0';
else k2=k2*10+s[j]-'0';
}
if(k1+k2>ans)p=k1,q=k2;
ans=max(ans,k1+k2);
}
cout<<ans<<endl;
//cout<<p<<" "<<q<<endl;
exit(0);
}

int main()
{
freopen("hello.in","r",stdin);
freopen("hello.out","w",stdout);
scanf("%I64d%s",&n,s+1);
if(n<=10)bf();
a[++t1]=s[1]-'0';
int now=1;
while(t1<n && t2<n)
{
ll k1=0,k2=0;
for(ll i=now+1;i<=now+n-t1+1;i++)
{
if(s[i]-'0'>k1)k1=s[i]-'0',k2=i;
}
b[++t2]=s[k2]-'0';
for(ll i=now+1;i<=k2-1;i++)a[++t1]=s[i]-'0';
now=k2;
}
for(ll i=now+1;i<=(n<<1);i++)
{
if(t1!=n)a[++t1]=s[i]-'0';
else b[++t2]=s[i]-'0';
}
ll ans1=0,ans2=0;
for(ll i=1;i<=n;i++)ans1=ans1*10+a[i];
for(ll i=1;i<=n;i++)ans2=ans2*10+b[i];
cout<<ans1+ans2<<endl;
//cout<<ans1<<" "<<ans2<<endl;
}
T2

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
int ton[40000];
int ty[40000];
int n,k;
char s[4005];
ll ans;
int main()
{
freopen("rect.in","r",stdin);
freopen("rect.out","w",stdout);
scanf("%d\n%s",&k,s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
{
int now=0;
for(int j=i;j<=n;j++)
{
now+=s[j]-'0';
ton[now]++;
}
}
if(k==0)
{
ll sum=0;
for(int i=1;i<=n;i++)ty[i]=ty[i-1]+s[i]-'0';
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
if(ty[i]-ty[j]==0)sum++;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
{
ans+=2*sum;
if(ty[i]-ty[j]==0)ans-=sum;
}
cout<<ans;
return 0;
}

int w=(int)sqrt(k);
for(int i=1;i<=w;i++)
{
if(k%i==0 && k/i<=36000 && k/i!=i)ans+=((ll)((ll)ton[i]*(ll)ton[k/i])<<1ll);
if(k%i==0 && k/i<=36000 && k/i==i)ans+=(ll)((ll)ton[i]*(ll)ton[k/i]);
}
cout<<ans<<endl;
}
T3

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
inline void R(ll &v)
{
v=0;char c=0;ll p=1;
while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
v*=p;
}
bool isp[1000010];
bool searched[1000010];
ll a[100010];
ll n;
map<ll,ll>mp;
void ser(ll x)
{
//cerr<<x<<endl;
if(x<=1000000 && searched[x])return;
if(x<=1000000)searched[x]=1;
ll ret=0;
for(ll i=1;i<=n;i++)
{
if(a[i]%x==0)ret++;
}
if((ret<<1)<n)return;
mp.insert(make_pair(x,1));
for(map<ll,ll>::iterator it=mp.begin();it!=mp.end();++it)
{
if(x*(it->first)>=1000000000000ll)break;
mp[x*(it->first)]=1;
}
}
bool S(ll x)
{
ll ret=0;
for(ll i=1;i<=n;i++)
{
if(a[i]%x==0)ret++;
}
if((ret<<1)<n)return false;
return true;
}
int main()
{
freopen("half.in","r",stdin);
freopen("half.out","w",stdout);
srand(time(0));
memset(isp,true,sizeof isp);
isp[1]=false;
for(ll i=2;i<=1000000;i++)
{
if(isp[i])
for(ll j=i<<1;j<=1000000;j+=i)isp[j]=false;
}
R(n);
for(ll i=1;i<=n;i++)R(a[i]);//cerr<<clock()<<endl;
for(ll i=1;i<=20;i++)
{
ll x=rand()%n+1;x=a[x];
ll maxx=(ll)sqrt(x);
for(ll i=2;i<=maxx;i++)
{
if(x%i==0)
{
ser(i);
x/=i;
maxx=(ll)sqrt(x);
i--;
}
}
ser(x);
}
//cerr<<clock()<<endl;
//cerr<<mp.size()<<endl;
ll ans=1;
for(map<ll,ll>::iterator it=mp.begin();it!=mp.end();++it)
{
//cerr<<it->first<<endl;
if(S(it->first))ans=(it->first);
}
cout<<ans<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: