已死
10.24
凹了一晚上线段树,P3372,然后发现这个板子可以过树状数组,于是过了P3374和P3368,都是板子,改改就行了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int a[maxn+2];
struct tree
{
int l,r;
long long pre,add;
}t[4*maxn+2];
void bulid(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].pre=a[l];
return;
}
int mid=l+r>>1;
bulid(p*2,l,mid);
bulid(p*2+1,mid+1,r);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
void lazy(int p)
{
if(t[p].add)
{
t[p*2].pre+=t[p].add*(t[p*2].r-t[p*2].l+1);
t[p*2+1].pre+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
t[p*2].add+=t[p].add;
t[p*2+1].add+=t[p].add;
t[p].add=0;
}
}
void change(int p,int x,int y,int z)
{
if(x<=t[p].l && y>=t[p].r)
{
t[p].pre+=(long long)z*(t[p].r-t[p].l+1);
t[p].add+=z;
return;
}
lazy(p);
int mid=t[p].l+t[p].r>>1;
if(x<=mid) change(p*2,x,y,z);
if(y>mid) change(p*2+1,x,y,z);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
long long find(int p,int x,int y)
{
if(x<=t[p].l && y>=t[p].r) return t[p].pre;
lazy(p);
int mid=t[p].l+t[p].r>>1;
long long ans=0;
if(x<=mid) ans+=find(p*2,x,y);
if(y>mid) ans+=find(p*2+1,x,y);
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
bulid(1,1,n);
for(int i=1;i<=m;++i)
{
int q,x,y,z;
cin>>q;
if(q==1)
{
cin>>x>>y>>z;
change(1,x,y,z);
}
else
{
cin>>x>>y;
cout<<find(1,x,y)<<endl;
}
}
}
然后把J组T1过了,(考场没想出来)。
然后开颓,过了几个板子,不说了。
10.25
开概率期望,然后做了一个很水的概率期望P1297
code
#include<bits/stdc++.h>
using namespace std;
long long n,A,B,C,a[10000010];
void init()
{
scanf("%d%d%d%d%d", &n, &A, &B, &C, a + 1);
for (int i = 2; i <= n; i++)
a[i] = ((long long) a[i - 1] * A + B) % 100000001;
for (int i = 1; i <= n; i++)
a[i] = a[i] % C + 1;
}
int main()
{
double ans;
init();
a[n+1]=a[1];
for(int i=1;i<=n;++i)
{
ans+=1/double(max(a[i+1],a[i]));
}
printf("%.3f",ans);
}
咋这么短啊,恼了。
20:18
通过了P1248 什么水紫
贪心,说是Johnson算法,就是让A尽量不停歇,让B最少休息,A让时间短的在前,B相反。
sort(a+1,a+1+n,cmp);
int l=0,r=n+1;
for(int i=1;i<=n;++i)
{
if(a[i].m==c[a[i].sum]) times[++l]+=a[i].sum;
else times[--r]=a[i].sum;
}
int A=0,finish=0;
for(int i=1;i<=n;++i)
{
A+=c[times[i]];
if(A>finish) finish=A;
finish+=d[times[i]];
}
cout<<finish<<endl;
for(int i=1;i<=n;++i)
cout<<times[i]<<" ";
}
开始写别的
Update:完蛋,又颓了40分钟,你是傻逼吗天天颓颓颓?!
傻逼
10.26
20分钟写了道简单期望P4550,感谢洛天依小姐的帮助帮我把期望式子推出来了,感恩的心。
for(int i=1;i<=n;++i)
{
g=1.0*n/(n-i+1);
k[i]=k[i-1]+g,f[i]=f[i-1]+k[i]*g;
}
printf("%.2f",f[n]);
期望++
P2719,这回应该不会连接放错了吧
10.27
byd昨天打一半被物理老师叫回去上自习了,关键我回去然后物理自习已经下了。
大家好啊我是说的道理今天给大家来点想看的东西理啊!没出生在我心 哈姆一呼相当饿 啊你,也列拿fish 黑波比麻fishes 啊米浴说的道理! 啊wish,多多wish!阿米诺斯阿米诺斯
把昨天的题切了,又是傻逼期望推🦁,然后🦁是
double ans=1.0*5040(7!)*a[1]/sum*a[2]/(sum-1)*a[3]/(sum-2)*a[4]/(sum-3)*a[5]/(sum-4)*a[6]/(sum-5)*a[7];
好,今天继续学线段树。
学了半天,看了眼@Kiichi 前辈的线段树,然后学会了找区间最值和区间最小值(其实这俩改改就一样了,我怎么这么菜)
然后OJ上交了双倍经验,然后发现洛谷上有一道P1816,直接忠÷了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=5*1e6+2;
int a[maxn],x,y;
int sum[maxn];
inline void findmin(int k)
{
sum[k]=min(sum[k*2],sum[k*2+1]);
}
inline void bulid(int p,int l,int r)
{
if(l==r)
{
sum[p]=a[l];
return;
}
int mid=(l+r)>>1;
bulid(p*2,l,mid);
bulid(p*2+1,mid+1,r);
findmin(p);
}
long long find(long long p,long long l,long long r,long long x,long long y)
{
if(l>=x && r<=y)
return sum[p];
long long ans=1e18;
int mid=(l+r)>>1;
if(x<=mid) ans=min(ans,find(p*2,l,mid,x,y));
if(y>mid) ans=min(ans,find(p*2+1,mid+1,r,x,y));
return ans;
}
int main()
{
int n,m;
cin>>n;
cin>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
bulid(1,1,n);
for(int i=1;i<=m;++i)
{
cin>>x>>y;
cout<<find(1,1,n,x,y)<<" ";
}
}
交了一堆高精度板子,不说了,然后现在在打OSU!
len是当前combo的长度。
'o':
ans[i]=ans[i-1]+2*len+1;
len++;break;
'x':
ans[i]=ans[i-1];
len=0;break;
'?':
ans[i]=ans[i-1]+len+0.5;
len=(len+1)/2;break;
}
过了
10.28
A了导弹拦截Ⅲ
我一下午干了个啥???,,??
就写了道最短路,没了
还是floyed,P1629
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int f[maxn+2],n,dis[1005][1005];
int m,x,y,z;
int main()
{
memset(dis,0x3f,sizeof(dis));
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>x>>y>>z;
dis[x][y]=min(dis[x][y],z);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
dis[j][k]=min(dis[j][i]+dis[i][k],dis[j][k]);
int ans=0;
for(int i=2;i<=n;++i)
ans+=(dis[i][1]+dis[1][i]);
cout<<ans;
}
byd太能颓了,我,自卑了1.
妈的一晚上啥也没干,我在干嘛,
在做CF446A。
过了,找俩最长上升子序列,然后dp
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[100005],f1[100005],f2[100005],ans;
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=1;i<=n;++i)
if(a[i]>a[i-1])
f1[i]=f1[i-1]+1;
else f1[i]=1;
for(int i=n;i>=1;--i)
if(a[i]<a[i+1])
f2[i]=f2[i+1]+1;
else f2[i]=1;
for(int i=1;i<=n;++i)
if(a[i+1]-a[i-1]>=2) ans=max(ans,f1[i-1]+f2[i+1]+1);
else ans=max(ans,max(f1[i-1],f2[i+1])+1);
cout<<ans;
}
又写了道水紫,tag是拓扑排序其实是dp,所以拓扑排序怎么学?萌新蒟蒻求教QAQ。
j&−j即lowbit运算,表示取出2进制下最后一个1。树状数组用到了还是能理解的。
//i xor (j&−j)就是删掉i中j的最后一位,同时j每次删去一位,我们就能实现每次删去i中的一个1了。
看不懂。
但是打出来了
for(register int i=0;i<=maxx;++i)
{
for(register int j=i;j;j^=j & -j)
f[i]=max(f[i],f[i^(j & -j)]);
if(g[i]) b[++f[i]].push_back(i);
}
今晚估计就这样了,继续做红题了(找打
最近要考期中,我考。
下回摸到电脑先写百事世界杯之旅(立flag
10.29
来了,百事世界杯ing。
失败了,改日再战。
但是期望🦁是
f[i]=f[i-1]+n/n-i;
应该。
过了,没开longlong。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p,q=1,r;
inline int w(long long x)
{
int p=0;
while(x>0)
{
x/=10;
p++;
}
return p;
}
signed main()
{
cin>>n;
p=n;
for(int i=2;i<=n;++i)
{
long long aw=q*i;
long long ans=p*i+n*q;
long long k=__gcd(aw,ans);
ans/=k;aw/=k;
q=aw;
p=ans;
}
r=p/q;
if(q==1)
{
cout<<p;
return 0;
}
for(int i=w(r);i>0;i--)
cout<<" ";
cout<<p%q<<"\n";
if(r>0) cout<<r;
for(int i=w(q);i>0;i--)
cout<<"-";
cout<<"\n";
for(int i=w(r);i>0;i--)
cout<<" ";
cout<<q<<endl;
}
颓一晚上。
然后线段树多倍经验了。P2574
P2846
Code
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
int a[5*maxn+2];
struct tree
{
int l,r;
long long pre,add;
}t[4*maxn+2];
void bulid(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].pre=a[l];
return;
}
int mid=(l+r)>>1;
bulid(p*2,l,mid);
bulid(p*2+1,mid+1,r);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
void lazy(int p)
{
if(t[p].add)
{
t[p*2].pre=t[p*2].r-t[p*2].l+1-t[p*2].pre;
t[p*2+1].pre=t[p*2+1].r-t[p*2+1].l+1-t[p*2+1].pre;
t[p*2].add^=1;
t[p*2+1].add^=1;
t[p].add=0;
}
}
void change(int p,int x,int y)
{
if(x<=t[p].l && y>=t[p].r)
{
t[p].pre=t[p].r-t[p].l+1-t[p].pre;
t[p].add^=1;
return;
}
lazy(p);
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid) change(p*2,x,y);
if(y>mid) change(p*2+1,x,y);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
long long find(int p,int x,int y)
{
if(x<=t[p].l && y>=t[p].r) return t[p].pre;
lazy(p);
int mid=(t[p].l+t[p].r)>>1;
int ans=0;
if(x<=mid) ans+=find(p*2,x,y);
if(y>mid) ans+=find(p*2+1,x,y);
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
bulid(1,1,n);
for(int i=1;i<=m;++i)
{
int q,x,y;
cin>>q;
if(q==0)
{
cin>>x>>y;
change(1,x,y);
}
else
{
cin>>x>>y;
cout<<find(1,x,y)<<endl;
}
}
}
10.30
今天是梦美与线段树,黑降蓝的神题,期望加线段树维护区间平方和,但是今天应该调不完了。
upd:做出来了,对着题解超了一个半小时。
求一下两份函数区别:
20pts
void build(int u,int l,int r)
{
if(l==r)
{
t[u].sum=read();
t[u].vsum=mul(t[u].sum);
t[u].lazy=0;
t[u].sumsxl=t[u].sum;
t[u].vlen=t[u].len=1;
return;
}
build(lr,l,mid);
build(rs,mid+1,r);
t[u].vlen=(t[lr].vlen+t[rs].vlen+(r-l+1)*(r-l+1));
t[u].len=r-l+1;
uptag(u);
}
——————————————————————————————————
100pts
void build(int u,int l,int r)
{
if(l==r)
{
t[u].sum=read();
t[u].vsum=mul(t[u].sum);
t[u].lazy=0;
t[u].sumxl=t[u].sum;
t[u].vlen=t[u].len=1;
return;
}
build(lson,l,mid);
build(rson,mid+1,r);
t[u].vlen=(t[lson].vlen+t[rson].vlen+(r-l+1)*(r-l+1));
t[u].len=r-l+1;
uptag(u);
}
?
不管了,开tarjan了。
感谢@Voah 学长的笔记。
10.31
写P1656,过了,现在写P2863,过了,现在写P2341,过了,现在写P3182,过了。
像坟墓一样简洁。
没啥好说的,我看大家出分了都挺高兴的,我就不说啥了。
11.01
期中考试RP++。
在写?
11.03
炸了炸了真的炸了,我文化课太烂了年级400多了大哥们,我去补whk了,真的太烂了,本文无限期停更。
现在在写平衡树板子,只写板子,写完就润。
折腾一晚上,终于过了。
Update:永久停更了,因为洛谷进白名单了。以后的题在闲话里写。