T1 浇水
- 【题目描述】
LazyChild在青岛二中科技楼里种了一排n棵树,每棵树都有一个高度。他会枚举所有的区间,然后从区间中找出一个高度最矮的树进行浇水(照顾弱者)。由于LazyChild浇完水之后就精疲力竭了,所以请你帮助他计算每棵树都被浇了几次水。
- 【输入文件】
第一行一个整数n。
第二行n个整数,分别表示每棵树的高度。
- 【输出文件】
一行n个整数用空格隔开,分别表示每棵树被浇了几次水。
- 【样例输入】
3
1 3 5
- 【样例输出】
3 2 1
- 【样例解释】
LazyChild枚举到了6个区间分别是[1], [3], [5], [1 3], [3 5], [1 3 5],对应的最矮的树的高度是1, 3, 5, 1, 3, 1。
- 【数据规模和约定】
对于40%的数据,n <= 1000
对于100%的数据,n <= 1000000,保证每棵树的高度都不相同
我....推了好久这个的乘法原理 我多半是废了
然后出来之后 就这么几行 短小精悍蕴含无限的奥妙令人不禁伸颈侧目微笑默叹以为妙绝
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1000000+5; 4 #define ll long long 5 int n,a[N],l[N],r[N]; 6 7 template<class t>void rd(t &x) 8 { 9 x=0;int w=0;char ch=0; 10 while(!isdigit(ch)) w|=ch=='-',ch=getchar(); 11 while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 12 x=w?-x:x; 13 } 14 15 int main() 16 { 17 rd(n);a[0]=a[n+1]=-1; 18 for(int i=1;i<=n;++i) rd(a[i]),l[i]=i-1,r[i]=i+1; 19 for(int i=1;i<=n;++i) while(a[l[i]]>a[i]) l[i]=l[l[i]];//向左移 20 for(int i=n;i>0;--i) while(a[r[i]]>a[i]) r[i]=r[r[i]];//向右移 21 for(int i=1;i<=n;++i) printf("%lld ",(long long)(i-l[i])*(r[i]-i));//乘法原理 22 return 0; 23 }
T2 ABCDEF
- 【题目描述】
LazyChild有n个在[-30000,30000]区间内的整数,他想知道有多少个六元组(a,b,c,d,e,f)满足: (a × b + c) ÷ d – e = f
- 【输入文件】
第一行一个整数n。
第二行n个整数。
- 【输出文件】
一行一个整数,表示有多少个满足要求的六元组。
- 【样例输入】
2
2 3
- 【样例输出】
4
- 【数据规模和约定】
对于30%的数据,1 <= n <= 10
对于100%的数据,1 <= n <= 100
因为一直咕咕咕去学hash的进程 导致看这个题 会有无数大胆的想法 最后屈服写一个六重循环最后居然还运行错误我.....
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define rg register 5 const ll N=105; 6 int n; 7 ll a[N],ans=0; 8 map<ll,ll> m; 9 template<class t>void rd(t &x) 10 { 11 x=0;int w=0;char ch=0; 12 while(!isdigit(ch)) w|=ch=='-',ch=getchar(); 13 while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 14 x=w?-x:x; 15 } 16 17 int main() 18 { 19 rd(n); 20 for(rg int i=1;i<=n;++i) rd(a[i]); 21 for(rg int ai=1;ai<=n;++ai) 22 for(rg int bi=1;bi<=n;++bi) 23 for(rg int ci=1;ci<=n;++ci) 24 ++m[a[ai]*a[bi]+a[ci]]; 25 for(rg int di=1;di<=n;++di) 26 for(rg int ei=1;ei<=n;++ei) 27 for(rg int fi=1;fi<=n;++fi) 28 if(!a[di]) continue; 29 else ans+=m[(a[fi]+a[ei])*a[di]]; 30 printf("%lld",ans); 31 return 0; 32 }
然鹅 应该用hash来写 快的一批 map在洛谷上根本过不了