已死

10.24

凹了一晚上线段树,P3372然后发现这个板子可以过树状数组,于是过了P3374P3368,都是板子,改改就行了。

#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。

P4934

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

P5057

P3870

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:永久停更了,因为洛谷进白名单了。以后的题在闲话里写。

posted @ 2023-10-25 19:08  HS_xh  阅读(383)  评论(18编辑  收藏  举报
init();