题解:

虽然是过了,不过做的十分智障

首先是有 2根 2 1 1 , 3根 1 1 1

这两种方法

然后考虑2 2 1 1

two-point-two没啥好说的

3 1 1 1

我很智障的以为数据范围是1e9

然后写了hash,刚开始还开错范围

把int换short int才卡过了空间

首先枚举 1 1 1

然后枚举3 中的一条边

既然1e7直接记录每个数能由两个数组成的方案数

另外再减去这条边参与的方案数(直接两个数减一下查有几个就好了)

然后细节还挺多的搞个对拍就可以了

#pragma G++ optimize (2)
#include <bits/stdc++.h>
using namespace std;
#define N 6000
#define rg register
#define IL inline
#define ll long long
int a[N],n;
unsigned ll ans,ans3;
#define js(x) x*(x-1)/2*(x-2)/3*(x-3)/4
const int mo1=1.3e7+;
const int NN=1.3e7+1e5;
const int mo2=2.6e7+;
const int N2=2.6e7+1e5;
int hash1[NN],hash2[NN],hash4[N2];
short int hash3[N2],hash5[N2];
char ss[<<],*A=ss,*B=ss;
inline char gc(){return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;}
template<class T>void read(T&x){
rg int f=,c;while(c=gc(),c<||<c)if(c=='-')f=-;x=c^;
while(c=gc(),<c&&c<)x=(x<<)+(x<<)+(c^);x*=f;
}
IL void push(int x)
{
int y=x%mo1;
while (hash1[y]&&hash1[y]!=x) y++;
hash1[y]=x; hash2[y]++;
}
IL int find1(int x)
{
int y=x%mo1;
while (hash1[y]&&hash1[y]!=x) y++;
if (hash1[y]==x) return(hash2[y]);
else return();
}
IL void push2(int x,int y)
{
int z=(1ll*y*+x)%mo2;
while (hash3[z]&&!(hash3[z]==x&&hash4[z]==y)) z++;
hash3[z]=x; hash4[z]=y; hash5[z]++;
}
IL int find2(int x,int y)
{
int z=(1ll*y*+x)%mo2;
while (hash3[z]&&!(hash3[z]==x&&hash4[z]==y)) z++;
if (hash3[z]==x&&hash4[z]==y) return(hash5[z]);
else return();
}
IL bool cmp(int a,int b)
{
return(a<b);
}
int now,cnt;
#define INF 1e9
int main()
{
freopen("noi.in","r",stdin);
freopen("noi.out","w",stdout);
read(n);
for (rg int i=;i<=n;i++) read(a[i]);
sort(a+,a+n+,cmp);
for (rg int i=;i<=n;i++)
for (rg int j=i+;j<=n;j++)
push(a[i]+a[j]);
a[]=INF;
for (rg int i=;i<=n;i++)
for (rg int j=i+;j<=n;j++)
push2(i,a[i]+a[j]),push2(j,a[i]+a[j]);
now=;
while (++now<=n)
{
cnt=;
while (now<n&&a[now+]==a[now]) cnt++,now++;
if (cnt>=)
{
int h=,t=n;
ll ans2=;
while (h<t)
{
int h1=h,t1=t;
while (a[h]==a[h+]&&h<t) h++;
while (a[t]+a[h]>a[now]&&h<t) t--;
if (a[t]+a[h]!=a[now])
{
h++;
continue;
}
t1=t;
while (a[t]==a[t-]&&h<t) t--;
if (h==t)
{
int xx=t1-h1+;
if (t1-h1+>=) ans+=1ll*cnt*(cnt-)/*js(xx);
ans+=1ll*ans2*cnt*(cnt-)/*(t1-h1+)*(t1-h1)/;
break;
}
if (h-h1>=&&t1-t>=)
{
ans+=1ll*cnt*(cnt-)/*(h-h1)*(h-h1+)/*(t1-t)*(t1-t+)/;
}
ans+=1ll*cnt*(cnt-)/*ans2*(t1-t+)*(h-h1+);
ans2+=(t1-t+)*(h-h1+);
h++;
}
}
if (cnt>=)
{
rg ll ans2=1ll*cnt*(cnt-)*(cnt-)/;
unsigned rg ll ans4=;
for (rg int i=;i<=n;i++)
{
if (a[now]>a[i])
{
int x=find1(a[now]-a[i]);
int y=find2(i,a[now]-a[i]);
ans4+=1ll*(x-y)*ans2;
}
}
ans3+=ans4/;
}
}
//ans3/=3;
cout<<ans+ans3<<endl;
return ;
}

对拍 n^6

#include <bits/stdc++.h>
using namespace std;
#define rg register
#define N 10000
#define rep(i,x,y) for (rg int i=x;i<=y;i++)
int b[];
bool cmp(int x,int y)
{
return(x<y);
}
int a[N],n;
bool pd1(int x1,int x2,int x3,int x4,int x5,int x6)
{
b[]=a[x1],b[]=a[x2],b[]=a[x3],b[]=a[x4],b[]=a[x5],b[]=a[x6];
sort(b+,b++,cmp);
if (b[]+b[]==b[]+b[]&&b[]+b[]==b[]&&b[]==b[])
return(); else return();
}
bool pd2(int x1,int x2,int x3,int x4,int x5,int x6)
{
b[]=a[x1],b[]=a[x2],b[]=a[x3],b[]=a[x4],b[]=a[x5],b[]=a[x6];
sort(b+,b++,cmp);
if (b[]+b[]+b[]==b[]&&b[]==b[]&&b[]==b[])
return(); else return();
}
int main()
{
freopen("noi.in","r",stdin);
freopen("noi2.out","w",stdout);
std::ios::sync_with_stdio(false);
cin>>n;
for (int i=;i<=n;i++) cin>>a[i];
int cnt=,cnt2=;
rep(i1,,n)
rep(i2,i1+,n)
rep(i3,i2+,n)
rep(i4,i3+,n)
rep(i5,i4+,n)
rep(i6,i5+,n)
if (pd1(i1,i2,i3,i4,i5,i6))
{ cnt++;
}
rep(i1,,n)
rep(i2,i1+,n)
rep(i3,i2+,n)
rep(i4,i3+,n)
rep(i5,i4+,n)
rep(i6,i5+,n)
if (pd2(i1,i2,i3,i4,i5,i6))
{
// cout<<i1<<" "<<i2<<" "<<i3<<" "<<i4<<" "<<i5<<" "<<i6<<endl;
cnt++;
}
cout<<cnt+cnt2<<endl;
return ;
}

【BZOJ4927】第一题 双指针+DP的更多相关文章

  1. 【BZOJ4927】第一题 双指针+DP(容斥?)

    [BZOJ4927]第一题 Description 给定n根直的木棍,要从中选出6根木棍,满足:能用这6根木棍拼 出一个正方形.注意木棍不能弯折.问方案数. 正方形:四条边都相等.四个角都是直角的四边 ...

  2. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  3. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  4. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

    上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...

  5. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

  6. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  7. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. Google Code Jam 第一题

    通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...

  9. 图论测试题(一)第一题:longest

    第一题:longest 乌托邦有n个城市,某些城市之间有公路连接.任意两个城市都可以通过公路直接或者间接到达,并且任意两个城市之间有且仅有一条路径(What does this imply? A tr ...

随机推荐

  1. GYM 101173 F.Free Figurines(贪心||并查集)

    原题链接 题意:俄罗斯套娃,给出一个初始状态和终止状态,问至少需要多少步操作才能实现状态转化 贪心做法如果完全拆掉再重装,答案是p[i]和q[i]中不为0的值的个数.现在要求寻找最小步数,显然要减去一 ...

  2. Linux - 系统资源

    查看剩余内存 free -m #-/+ buffers/cache: #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) #linux会利用所有的剩余内存作为缓存,所以要保 ...

  3. MySQL中查询行数最多的表并且排序

    #切换到schema use information_schema; #查询数据量最大的30张表 并排序 select table_name,table_rows from tables order ...

  4. transition,过渡效果

    语法: transtion:property time change-speed delay. 人话就是:属性(property )在多少秒内(time )通过什么样的速度(change-speed) ...

  5. F - Set of Strings

    You are given a string q. A sequence of k strings s1, s2, ..., sk is called beautiful, if the concat ...

  6. winform程序生成条形码并且并且保存到本地文件中。

    今天公司让做一个输入数字.字母生成条形码并且可以以图片格式保存到本地.当看到这个需求时候感觉很搞笑,明明可以用文本框搞定的东西非得做个程序.哎,寄人篱下,不多说了,这就是养兵千日用兵一时. 我在网上找 ...

  7. centOS6.4 extundelete工具恢复rm -rf 删除的目录[转]

    原文:http://www.cnblogs.com/patf/p/3368765.html PS:补充下,我在fedora 19上运行的时候遇到的一个问题: 1 [root@localhost ext ...

  8. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  9. 【vim】保存文件并退出 :w=:wq

    这两个命令实际上并不完全等价,当文件被修改时两个命令时相同的.但如果未被修改,使用 :x 不会更改文件的修改时间,而使用 :wq 会改变文件的修改时间.

  10. 常见的移动端Web页面问题

    移动端Web需要照顾触摸操作的体验,以及更多的屏幕旋转与尺寸适配等问题,非常琐碎,在这里为大家倾力总结多条常见的移动端Web页面问题解决方案,欢迎收看收藏! 1.安卓浏览器看背景图片,有些设备会模糊 ...