前几天做了忘了写题解了..
A.Tokitsukaze and a+b=n (easy)
第一题当时用的尺取法,有点笨.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lowbit(x) ((x)&-(x))
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinint L1,R1,L2,R2;
>>L1>>R1;
cin>>L2>>R2;
cinint t=min(R2,n-L1);
int ans=0;
for(int i=L1;i<=R1;i++)
{
while(t+i>n)
--;
tif(t<L2)
break;
if(t+i==n)
++;
ans}
<<ans<<'\n';
cout}
return 0;
}
B. Tokitsukaze and a+b=n (medium)
只需要计算
AC原代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lowbit(x) ((x)&-(x))
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinint L1,R1,L2,R2;
>>L1>>R1;
cin>>L2>>R2;
cinint L=n-R1,R=n-L1;
if(L<L2)
{
if(R<L2)
<<0<<'\n';
coutelse if(R>=L2&&R<=R2)
<<R-L2+1<<'\n';
coutelse
<<R2-L2+1<<'\n';
cout}
else if(L>=L2&&L<=R2)
{
if(R<=R2)
<<R-L+1<<'\n';
coutelse
<<R2-L+1<<'\n';
cout}
else
{
<<0<<'\n';
cout}
}
return 0;
}
但其实求区间交集模的步骤可以简化.
max(0,min(R1,R2)-max(L1,L2)+1)
改进后的AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lowbit(x) ((x)&-(x))
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinint L1,R1,L2,R2;
>>L1>>R1>>L2>>R2;
cinint L=n-R2,R=n-L2;
<<max(0,min(R1,R)-max(L1,L)+1)<<'\n';
cout}
return 0;
}
D. Tokitsukaze and Energy Tree
设
只需要算一下各个点的深度.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lowbit(x) ((x)&-(x))
const int N=2e5+5;
struct node
{
int id;
int fa;
int ener;
}tree[N];
int v[N];
int dep[N];
int n;
void init()
{
(dep,-1,sizeof(dep));
memset[1]=1;
dep[0]=0;
depfor(int i=1;i<=n;i++)
{
int x=i;
if(tree[x].fa!=0)
{
=tree[x].fa;
xif(dep[x]!=-1)
[i]=dep[x]+1;
dep}
}
}
int main() {
::sync_with_stdio(false);
ios>>n;
cinint f;
[1].id=1,tree[1].fa=0,tree[1].ener=0;
treefor(int i=2;i<=n;i++)
{
>>f;
cin[i].fa=f;
tree[i].id=i;
tree[i].ener=0;
tree}
();
initfor(int i=1;i<=n;i++)
>>v[i];
cin(v+1,v+1+n);
sort(dep+1,dep+1+n);
sort=0;
ll ansfor(int i=1;i<=n;i++)
{
+=dep[i]*v[i];
ans}
<<ans<<'\n';
coutreturn 0;
}
J. Tokitsukaze and Sum of MxAb
要求的是
可以看出
那么
则
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lowbit(x) ((x)&-(x))
const int N=1e5+5;
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cin=0;
ll sumint a;
for(int i=1;i<=n;i++)
{
>>a;
cinif(a<0)
=-a;
a+=a;
sum}
*=2*n;
sum<<sum<<'\n';
cout}
return 0;
}