比赛情况:
比赛过程:cqf和wmd都因为被喊去当工具人晚到了,1006和1003我都先签掉了,然后我和wmd写1007,出题人一直在广播里说错误的题意导致我们一直判断错误,wa了几发后才过的。然后我一直在推1002,最后1h开始写1009,(赛后才发现1009有洛谷原题 )。
1006 Cute Tree
题意:按照这个代码建的树的节点数
idea:直接模拟即可
ACcode:
#include<bits/stdc++.h>
#define LL long long
#define N 201000
using namespace std;
int a[N],tr[N*4][3],t,n,tot = 0;
void build(int l,int r)
{
int mid,len = r-l+1;
tot++;
if( l==r ) return;
if( len==2 )
{
mid = (l+r)/2;
build( l,l );
build( r,r );
}
else
{
int b = l+len/3-1;
int c = (b+r)/2;
build( l,b );
build( b+1,c );
build( c+1,r );
}
}
void solve()
{
tot = 0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build( 1,n );
printf("%d\n",tot);
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>t;
while( t-- ) solve();
return 0;
}
1003 VC Is All You Need
题意:给你一个k维平面,问你是不是随意放n个点都能用k-1条线分隔开
idea:直接判断n和k大小关系即可
ACcode:
#include<bits/stdc++.h>
#define LL long long
#define N 201000
using namespace std;
LL t,n,k;
void solve()
{
scanf("%lld %lld",&n,&k);
if( n<=k+1 ) printf("Yes\n");
else printf("No\n");
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>t;
while( t-- ) solve();
return 0;
}
题意:
给一个
n
∗
n
∗
n
n*n*n
n∗n∗n的立方体空间, 你只能用
1
∗
1
∗
1
1*1*1
1∗1∗1的小立方块去填,小立方体放在一个位置,那么它的价值就是
x
∗
y
2
∗
z
x*y^2*z
x∗y2∗z ,如果你放的地方的底部(z轴)为空,那么它会一直往下掉。
借用一下dalao的图:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
int T; long long n;
inline ll gcd(ll a, ll b) {
while(b != 0) { ll aa = a, bb = b; a = bb; b = aa % bb; }
return a;
}
inline ll ksc(ll a, ll b){
ll ans = 0;
while( b > 0 ){
if( b&1 ) ans = (ans + a) % mod;
a = ( a + a ) % mod;
b >>= 1;
}
return ans;
}
inline ll calc(ll l, ll r) {
ll ans;
if((r - l + 1) & 1) ans = ksc(r - l + 1, (l + r) >> 1);
else ans = ksc((r - l + 1) >> 1, l + r);
ll tmp1 = r, tmp2 = r + 1, tmp3 = 2 * r + 1, tmp4 = 6;
ll g = gcd(tmp1, tmp4); tmp1 /= g; tmp4 /= g;
g = gcd(tmp2, tmp4); tmp2 /= g; tmp4 /= g;
g = gcd(tmp3, tmp4); tmp3 /= g; tmp4 /= g;
tmp1 = ksc(tmp1, ksc(tmp2, tmp3));
if(l == 2) tmp1 -= 1;
ans = ksc(ans, tmp1);
if((r - l + 1) & 1) tmp1 = ksc(r - l + 1, (l + r) >> 1);
else tmp1 = ksc((r - l + 1) >> 1, l + r);
ans = ksc(ans, tmp1);
return ans;
}
inline ll calc3(ll l, ll r) {
ll ans;
if((r - l + 1) & 1) ans = ksc(r - l + 1, (l + r) >> 1);
else ans = ksc((r - l + 1) >> 1, l + r);
ll tmp1 = r, tmp2 = r + 1, tmp3 = 2 * r + 1, tmp4 = 6;
ll g = gcd(tmp1, tmp4); tmp1 /= g; tmp4 /= g;
g = gcd(tmp2, tmp4); tmp2 /= g; tmp4 /= g;
g = gcd(tmp3, tmp4); tmp3 /= g; tmp4 /= g;
tmp1 = ksc(tmp1, ksc(tmp2, tmp3));
if(l == 2) tmp1 -= 1;
ans = ksc(ans, tmp1);
tmp1 = ksc(n, n);
ans = ksc(ans, tmp1);
return ans;
}
inline ll calc1(ll l = 2, ll r = n) {
ll ans;
if((r - l + 1) & 1) ans = ksc(r - l + 1, (l + r) >> 1);
else ans = ksc((r - l + 1) >> 1, l + r);
return ans;
}
int main() {
//freopen("test.in", "r", stdin);
scanf("%d", &T);
while(T--) {
scanf("%lld", &n);
ll ansmax = calc(1, n), ansmin = (ansmax - calc(2, n) - calc1() + mod + mod) % mod;
ansmax = calc3(1, n);
/*ansmax = ansmin = 0;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
for(int k = 1; k <= n; ++k) ansmax = (ansmax + i * j % mod * j % mod * k % mod) % mod;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
for(int k = 1; k <= n; ++k) if(i == 1 || j == 1 || k == 1) ansmin = (ansmin + i * j % mod * j % mod * k % mod) % mod;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
for(int k = 1; k <= n; ++k) if(i == 1 && j == 1 && k != 1) ansmin = (ansmin - i * j % mod * j % mod * k % mod + mod) % mod; */
printf("%lld\n%lld\n", ansmin, ansmax);
}
return 0;
}
T1009 Array
#include<bits/stdc++.h>
#define LL long long
typedef long long i64;
const int N=1e6+100;
char ib[N*12],*ip=ib;
int read(){int x;scanf("%d",&x);return x;};
LL ans=0;
int n,mx;
struct pos
{
int x,y;
}ps[N],pb[N];
void rsort(pos*a,pos*b,int n)
{
for(int t=0;t<20;t+=10){
int ts[1111]={};
pos*rs[1111],*p=b;
for(int i=0;i<n;++i)++ts[a[i].y>>t&1023];
for(int i=0;i<1024;++i)rs[i]=p,p+=ts[i];
for(int i=0;i<n;++i)*rs[a[i].y>>t&1023]++=a[i];
std::swap(a,b);
}
}
int tk;
struct node
{
i64 s0,s1,s2;
int ed;
}bit[N*2];
void inc(int w,int a)
{
w+=n+2;
i64 a0=a*w*i64(w-1),a1=a*i64(1-w*2),a2=a;
for(;w<=mx;w+=w&-w)
{
if(bit[w].ed!=tk)
{
bit[w]=(node){a0,a1,a2,tk};
}
else
{
bit[w].s0+=a0;
bit[w].s1+=a1;
bit[w].s2+=a2;
}
}
}
i64 sum(int w)
{
w+=n+2;
int w0=w;
i64 s0=0,s1=0,s2=0;
for(;w;w-=w&-w)if(bit[w].ed==tk)
{
s0+=bit[w].s0;
s1+=bit[w].s1;
s2+=bit[w].s2;
}
return (s2*w0+s1)*w0+s0;
}
void ins(int l,int r,int c)
{
inc(2*c-r+1,1);
inc(2*c-l+1,-1);
}
void que(int l,int r,int c)
{
ans+=sum(2*c-l)-sum(2*c-r);
}
void cal(pos*a,int n)
{
++tk;
ins(0,a[1].x,0);
for(int i=1;i<n;++i)
{
int w=a[i].x;
que(a[i].x,a[i+1].x,i);
ins(a[i].x,a[i+1].x,i);
}
que(a[n].x,::n+1,n);
}
void so()
{
ans = 0;
// memset(ps,0,sizeof(ps));
// memset(pb,0,sizeof(pb));
// memset(ib,0,sizeof(ib));
scanf("%d",&n);
mx=n*2+5;
for(int i=1;i<=n;++i)ps[i]=(pos){i,read()};
rsort(ps+1,pb,n);
for(int i=1,j=1;i<=n;i=j){
for(++j;j<=n&&ps[i].y==ps[j].y;++j);
cal(ps+i-1,j-i);
}
printf("%lld\n",ans/2);
}
int main(){
int T;
scanf("%d",&T);
while( T-- ) so();
return 0;
}